Monitoring & Automation

Webhook Alerts API

Send watchlist, domain change and brand monitoring alerts to your own HTTPS endpoints as signed JSON. Choose the events each endpoint receives, verify every request with HMAC-SHA256, and pay only for alerts your endpoint accepts.

Category Monitoring & Automation
Endpoints 7
Key Features 6
Frequently asked questions 6

Used by people at these companies

InstantOutseerMongoDBRespondentSage Expense ManagementInstantlyD.R. HortonWhatConvertsAdobeLLM Pulse

Trust signals before you integrate

Transparent docs, authenticated requests, and visible reliability details make it easier to evaluate DomScan before you ship.

Live Service status

Check live service health and documented failure responses before you integrate.

OpenAPI API artifacts

OpenAPI, Swagger, Postman, CLI, SDK, and MCP links are one click away.

API keys Protected access

Authenticated endpoints use API keys with clear credit costs before you call them.

10,000 Free allowance

Start with 10,000 monthly credits and upgrade only when usage grows.

What this API helps you ship

Use this page as a production brief: endpoints, examples, response shape, and the workflow pieces needed to plug DomScan into your own product.

Product workflows

Embed domain checks, DNS intelligence, risk signals, or enrichment into onboarding, search, and internal tools.

Analyst automation

Replace repeated manual lookups with scheduled jobs, alerting, and reproducible investigation steps.

Clean JSON data

Use predictable fields, documented status codes, and credit costs instead of scraping provider pages.

AI and ops tooling

Feed agents, dashboards, SOAR playbooks, and CRMs through OpenAPI, SDK, Postman, or MCP.

Integration workflow

A simple path from first request to repeatable production usage.

1
Authenticate once

Send your API key with the documented header and keep requests consistent across services.

2
Query with examples

Start from the curl and HTTP samples, then map the parameters into your application code.

3
Operate and monitor

Use status codes, credit costs, and response fields to build retries, logs, and alerts.

Developer kit

Jump from this page into machine-readable docs, request collections, SDKs, or agent tooling.

Parameters and response map

Scan the inputs, output fields, and status codes before wiring the endpoint into your client.

Request parameters

Parameter

urldescriptioneventsenabledwebhook_idlimit
Response fields

Example response

endpointendpoint.idendpoint.urlendpoint.eventsendpoint.statusendpoint.disabled_reasonendpoint.consecutive_failuresendpoint.secret_hintendpoint.previous_secret_expires_atsecret
Status coverage

HTTP status codes

200201400401409429

Endpoints

POST /v1/webhooks
Credits: 0Authentication: Authentication required
urldescriptionevents
GET /v1/webhooks
Credits: 0Authentication: Authentication required
PATCH /v1/webhooks/:webhook_id
Credits: 0Authentication: Authentication required
enabledeventsdescription
POST /v1/webhooks/:webhook_id/rotate-secret
Credits: 0Authentication: Authentication required
POST /v1/webhooks/:webhook_id/test
Credits: 0Authentication: Authentication required
GET /v1/webhooks/:webhook_id/deliveries
Credits: 0Authentication: Authentication required
limit
DELETE /v1/webhooks/:webhook_id
Credits: 0Authentication: Authentication required

Verify every alert

Use the raw request body exactly as received. The header holds one signature, or two during a secret rotation. Accept the request when any signature matches.

import crypto from 'node:crypto';

// rawBody: the request body exactly as received, before JSON parsing.
function verifyDomScanWebhook(rawBody, headers, secret) {
  const timestamp = headers['x-domscan-timestamp'];
  const header = headers['x-domscan-signature'] || '';
  if (!/^\d{10}$/.test(timestamp || '')) return false;
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
  const expected = Buffer.from('sha256=' + crypto
    .createHmac('sha256', secret)
    .update(timestamp + '.' + rawBody)
    .digest('hex'));
  // One entry normally; two during a secret rotation (new secret first).
  return header.split(',').some((entry) => {
    const candidate = Buffer.from(entry.trim());
    return candidate.length === expected.length &&
      crypto.timingSafeEqual(candidate, expected);
  });
}

Rotate secrets with a 24 hour grace period

Rotating returns a new secret once. Until the grace period ends, each alert is signed with the new secret first and the previous secret second, so receivers that still use the old secret keep working.

X-DomScan-Signature: sha256=<new>,sha256=<previous>

Trust signals before you integrate

Transparent docs, authenticated requests, and visible reliability details make it easier to evaluate DomScan before you ship.

Live Service status

Check live service health and documented failure responses before you integrate.

OpenAPI API artifacts

OpenAPI, Swagger, Postman, CLI, SDK, and MCP links are one click away.

API keys Protected access

Authenticated endpoints use API keys with clear credit costs before you call them.

10,000 Free allowance

Start with 10,000 monthly credits and upgrade only when usage grows.

Key Features

Signed requests

Every alert carries an HMAC-SHA256 signature over a timestamp and the raw body, so your receiver can reject forged and replayed requests.

Choose your events

Subscribe each endpoint to availability, expiry, status, DNS, certificate, registration, hosting, technology, email security or brand threat alerts, or to all of them.

Retries with stable event IDs

Failed deliveries are retried with increasing delays, up to 6 attempts. Each retry repeats the same event ID, so you can ignore alerts you already processed.

Pay for delivered alerts only

An alert costs 2 credits only when your endpoint answers with a 2xx status. Failed deliveries are refunded, and test events and secret rotation are free.

Automatic pause with an email

An endpoint that keeps failing is paused, and you get one email with the endpoint host and the last error. Enable it again when it is fixed, and the failure count starts from zero.

Secret rotation without downtime

Rotate a signing secret at any time. For 24 hours each alert is signed with both the new and the previous secret, so you can switch receivers without missing alerts.

Example request

POST /v1/webhooks bash
curl -X POST "https://domscan.net/v1/webhooks" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.com/domscan","events":["domain.expiring_30","domain.available","domain.dns_changed"]}'
POST /v1/webhooks/:webhook_id/rotate-secret bash
curl -X POST "https://domscan.net/v1/webhooks/whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3/rotate-secret" \
  -H "X-API-Key: $DOMSCAN_API_KEY"
PATCH /v1/webhooks/:webhook_id bash
curl -X PATCH "https://domscan.net/v1/webhooks/whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

Example response

200 OK json
{
  "endpoint": {
    "id": "whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3",
    "url": "https://hooks.example.com/domscan",
    "events": ["domain.available", "domain.expiring_30", "domain.dns_changed"],
    "status": "active",
    "disabled_reason": null,
    "consecutive_failures": 0,
    "secret_hint": "9c2e",
    "previous_secret_expires_at": null
  },
  "secret": "whsec_..."
}

Frequently asked questions

Which alerts can be sent to a webhook?

Watchlist availability, expiry and status changes, domain change monitoring for DNS, certificates, registration, hosting, technology and email security, and newly registered lookalikes of a brand you monitor.

How do I verify that a request comes from DomScan?

Compute an HMAC-SHA256 of the X-DomScan-Timestamp value, a period and the raw body with your endpoint secret, compare it in constant time with each entry of X-DomScan-Signature, and reject timestamps older than 5 minutes.

How much do webhook alerts cost?

Each alert delivered with a 2xx response costs 2 credits. Creating endpoints, test events and rotating secrets are free, and credits reserved for a failed delivery are refunded.

What happens when my endpoint is down?

Each alert is retried up to 6 times over about 6 hours. After 15 consecutive failed attempts the endpoint is paused and you receive one email. Enable it again from Monitor settings or the API to resume deliveries.

How do I rotate a signing secret safely?

Call the rotate secret endpoint or use Monitor settings. The new secret is shown once, and for 24 hours every alert carries signatures from both secrets, so your receiver can accept either one while you deploy the change.

Can I receive the same alert twice?

A retry can arrive after your endpoint already handled the alert, for example after a timeout. Every retry repeats the event ID in the body and in X-DomScan-Event-Id, so store processed IDs and skip duplicates.

Related tools and resources

HTTP status codes

These are the HTTP status codes to handle, so you can tell apart successful responses, auth issues, credits, rate limits, missing data, and upstream failures.

OK 200

Request successful

Created 201

Resource created successfully.

Bad Request 400

Invalid parameters

Unauthorized 401

Missing or invalid API key/session.

HTTP 409 409

These are the HTTP status codes to handle, so you can tell apart successful responses, auth issues, credits, rate limits, missing data, and upstream failures.

Too Many Requests 429

Rate limit exceeded

Add your first webhook endpoint