Ontwikkelaarsreferentie

Domeinwachtrij

DomScan-API: Bewaak domeinen op vervaldatum- en beschikbaarheidswijzigingen. Ontvang waarschuwingen wanneer geregistreerde domeinen beschikbaar worden.

Domeinwachtrij

Bewaak domeinen op vervaldatum- en beschikbaarheidswijzigingen. Ontvang waarschuwingen wanneer geregistreerde domeinen beschikbaar worden.

Bewaking

Meld u aan met Google om toegang te krijgen tot uw persoonlijke domeinwatchlist met e-mailwaarschuwingen, webhooks en meer.

Ontvang meldingen via e-mail, Telegram, Slack, Discord of Webhook.

GET /v1/watchlist

Haal alle domeinen op in uw wachtrij.

Gepagineerd: stuur limit (1 tot 100) mee en geef next_cursor terug als cursor. Antwoorden bevatten has_more en next_cursor. Zonder limit wordt de hele lijst teruggegeven. Zie paginering.

Voorbeeldantwoord

{
                "watchlist": [
                {
                "domain": "startup.com",
                "added_at": "2024-01-15T10:30:00Z",
                "status": "registered",
                "expiry_date": "2025-01-15T00:00:00Z",
                "days_until_expiry": 287,
                "last_checked": "2024-03-01T12:00:00Z",
                "notify_email": "[email protected]",
                "check_count": 4
                }
                ],
                "total": 1,
                "updated_at": "2024-03-01T12:00:00Z"
                }

Antwoordvelden

Veld Type
has_more boolean
next_cursor string | null
watchlist[] object[]
watchlist[] object
watchlist[].domain string
watchlist[].added_at string
watchlist[].status string
watchlist[].last_checked string
watchlist[].expiry_date string
watchlist[].days_until_expiry integer
watchlist[].notify_email string
watchlist[].check_count integer
total integer
updated_at string
POST /v1/watchlist

Voeg een domein toe aan uw wachtrij.

Inhoud van het verzoek

{
                "domain": "mydomain.com",
                "notify_email": "[email protected]"
                }

Antwoordvelden

Veld Type
success boolean
message string
watchlist[] object[]
watchlist[] object
watchlist[].domain string
watchlist[].added_at string
watchlist[].status string
watchlist[].last_checked string
watchlist[].expiry_date string
watchlist[].days_until_expiry integer
watchlist[].notify_email string
watchlist[].check_count integer
total integer

Voorbeeldantwoord

{
  "success": true,
  "message": "Added example.org to watchlist",
  "watchlist": [
    {
      "domain": "example.com",
      "added_at": "2026-06-02T09:12:00.000Z",
      "last_checked": "2026-10-09T03:00:12.000Z",
      "status": "expiring_soon",
      "expiry_date": "2026-12-18T14:22:08Z",
      "days_until_expiry": 70,
      "notify_email": "[email protected]"
    },
    {
      "domain": "example.org",
      "added_at": "2026-10-09T10:15:30.000Z",
      "status": "unknown",
      "notify_email": "[email protected]"
    }
  ],
  "total": 2
}
DELETE /v1/watchlist?domain=mydomain.com

Verwijderen uit volglijst

curl -X DELETE -H "X-API-Key: your-api-key" "https://domscan.net/v1/watchlist?domain=mydomain.com"

Antwoordvelden

Veld Type
success boolean
message string
domain string
watchlist[] object[]
watchlist[] object
watchlist[].domain string
watchlist[].added_at string
watchlist[].status string
watchlist[].last_checked string
watchlist[].expiry_date string
watchlist[].days_until_expiry integer
watchlist[].notify_email string
watchlist[].check_count integer
total integer

Voorbeeldantwoord

{
  "success": true,
  "message": "Request completed",
  "domain": "example.com",
  "watchlist": [
    {
      "domain": "example.com",
      "added_at": "2026-08-27T12:00:00Z",
      "status": "registered",
      "last_checked": "2026-08-27T12:00:00Z",
      "expiry_date": "2026-08-27T12:00:00Z",
      "days_until_expiry": 1,
      "notify_email": "[email protected]",
      "check_count": 1
    }
  ],
  "total": 1
}
GET /v1/watchlist/expiring?days=30

Snel verlopen

Gepagineerd: stuur limit (1 tot 100) mee en geef next_cursor terug als cursor. Antwoorden bevatten has_more en next_cursor. Zonder limit wordt de hele lijst teruggegeven. Zie paginering.

Voorbeeldantwoord

{
                "expiring_domains": [
                {
                "domain": "renewal-window.com",
                "status": "expiring_soon",
                "expiry_date": "2026-05-12T00:00:00Z",
                "days_until_expiry": 28,
                "check_count": 11
                }
                ],
                "total": 1,
                "threshold_days": 30
                }

Antwoordvelden

Veld Type
has_more boolean
next_cursor string | null
expiring_domains[] object[]
expiring_domains[] object
expiring_domains[].domain string
expiring_domains[].added_at string
expiring_domains[].status string
expiring_domains[].last_checked string
expiring_domains[].expiry_date string
expiring_domains[].days_until_expiry integer
expiring_domains[].notify_email string
expiring_domains[].check_count integer
total integer
threshold_days integer
GET /v1/watchlist/available

Beschikbaar

Gepagineerd: stuur limit (1 tot 100) mee en geef next_cursor terug als cursor. Antwoorden bevatten has_more en next_cursor. Zonder limit wordt de hele lijst teruggegeven. Zie paginering.

Voorbeeldantwoord

{
                "available_domains": [
                {
                "domain": "startupdrop.ai",
                "status": "available",
                "last_checked": "2026-04-14T08:30:00Z",
                "check_count": 18
                }
                ],
                "total": 1,
                "message": "Deze domeinen van uw volglijst zijn nu beschikbaar voor registratie!"
                }

Antwoordvelden

Veld Type
has_more boolean
next_cursor string | null
available_domains[] object[]
available_domains[] object
available_domains[].domain string
available_domains[].added_at string
available_domains[].status string
available_domains[].last_checked string
available_domains[].expiry_date string
available_domains[].days_until_expiry integer
available_domains[].notify_email string
available_domains[].check_count integer
total integer
message string

Webhooks voor meldingen

Ontvang monitoringmeldingen als ondertekende JSON-POST-verzoeken op uw eigen HTTPS-endpoints. Beheer endpoints met een API-sleutel, of via de Monitor-instellingen wanneer u bent aangemeld.

Gebeurtenistypen

MonitorGebeurtenissen
Beschikbaarheid, vervaldatum en status van de watchlistdomain.available domain.expiring_30 domain.expiring_14 domain.expiring_7 domain.expiring_1 domain.status_change
Bewaking van domeinwijzigingendomain.dns_changed domain.certificate_changed domain.registration_changed domain.hosting_changed domain.technology_changed domain.email_security_changed
Merkbewaking (nieuwe lookalike-registraties)brand.threat_detected
Waarschuwingsabonnementen voor watchlist (certificaten, prijzen, DNS-records, lookalikes)ssl.expiring ssl.expired ssl.changed price.dropped dns.changed typosquat.detected
Asynchrone taken (gratis, alleen voor taken aangemaakt met notify_webhook)job.completed job.failed job.cancelled
Testgebeurtenis (gratis)webhook.test

Lees de gids voor de Webhookmeldingen-API

Prijzen

Elke melding die met een 2xx-reactie aan een endpoint wordt geleverd, kost 2 credits. Credits worden vlak voor de eerste poging gereserveerd en terugbetaald als de levering mislukt, wordt geannuleerd of het endpoint wordt verwijderd. Testgebeurtenissen zijn gratis. Bij een te laag saldo wordt de melding overgeslagen en wordt er niets in rekening gebracht.

POST /v1/webhooks

Registreer een HTTPS-endpoint. De URL moet naar een openbaar adres wijzen. Laat events weg, of geef ["*"] door, om elk gebeurtenistype te ontvangen. Het ondertekeningsgeheim wordt alleen in dit antwoord teruggegeven.

Voorbeeldverzoek

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"]
  }'

Voorbeeldantwoord

{
  "endpoint": {
    "id": "whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3",
    "url": "https://hooks.example.com/domscan",
    "events": ["domain.available", "domain.expiring_30", "domain.dns_changed"],
    "status": "active",
    "secret_hint": "9c2e"
  },
  "secret": "whsec_..."
}

Antwoordvelden

Veld Type
endpoint object
endpoint.id string
endpoint.url string
endpoint.description string | null
endpoint.events[] string[]
endpoint.status string
endpoint.disabled_reason string | null
endpoint.consecutive_failures integer
endpoint.secret_hint string
endpoint.previous_secret_expires_at string | null
endpoint.secret_rotated_at string | null
endpoint.last_success_at string | null
endpoint.last_failure_at string | null
endpoint.last_error string | null
endpoint.created_at string
endpoint.updated_at string
endpoint.disabled_at string | null
secret string
GET /v1/webhooks

Toon uw endpoints met status, geabonneerde gebeurtenissen, aantal fouten en de laatste vier tekens van het geheim, samen met de beschikbare gebeurtenistypen en het leveringsbeleid.

Antwoordvelden

Veld Type
endpoints[] object[]
endpoints[] object
endpoints[].id string
endpoints[].url string
endpoints[].description string | null
endpoints[].events[] string[]
endpoints[].status string
endpoints[].disabled_reason string | null
endpoints[].consecutive_failures integer
endpoints[].secret_hint string
endpoints[].previous_secret_expires_at string | null
endpoints[].secret_rotated_at string | null
endpoints[].last_success_at string | null
endpoints[].last_failure_at string | null
endpoints[].last_error string | null
endpoints[].created_at string
endpoints[].updated_at string
endpoints[].disabled_at string | null
available_events[] string[]
all_events string
test_event string
policy object
policy.secret_rotation_grace_seconds integer
policy.secret_rotation_credits integer
policy.credits_per_delivered_alert integer
policy.test_event_credits integer
policy.job_event_credits integer
policy.failed_deliveries_charged boolean
policy.max_endpoints integer
policy.max_attempts integer
policy.disable_after_consecutive_failures integer
policy.signature_tolerance_seconds integer

Voorbeeldantwoord

{
  "endpoints": [
    {
      "id": "example-id",
      "url": "https://example.com",
      "events": [
        "example"
      ],
      "status": "active",
      "secret_hint": "example",
      "created_at": "2026-08-27T12:00:00Z",
      "description": "example",
      "disabled_reason": "customer",
      "consecutive_failures": 1,
      "previous_secret_expires_at": "2026-08-27T12:00:00Z",
      "secret_rotated_at": "2026-08-27T12:00:00Z",
      "last_success_at": "2026-08-27T12:00:00Z",
      "last_failure_at": "2026-08-27T12:00:00Z",
      "last_error": "example",
      "updated_at": "2026-08-27T12:00:00Z",
      "disabled_at": "2026-08-27T12:00:00Z"
    }
  ],
  "available_events": [
    "domain.available"
  ],
  "policy": {
    "credits_per_delivered_alert": 2,
    "test_event_credits": 0,
    "failed_deliveries_charged": false,
    "max_endpoints": 1,
    "max_attempts": 1,
    "disable_after_consecutive_failures": 1,
    "signature_tolerance_seconds": 1,
    "secret_rotation_grace_seconds": 86400,
    "secret_rotation_credits": 0,
    "job_event_credits": 0
  },
  "all_events": "*",
  "test_event": "webhook.test"
}
PATCH /v1/webhooks/:webhook_id

Pauzeer of activeer een endpoint, wijzig de gebeurtenissen of pas de beschrijving aan. Bij het inschakelen van een endpoint wordt het aantal fouten gereset.

{ "enabled": true, "events": ["*"] }

Antwoordvelden

Veld Type
endpoint object
endpoint.id string
endpoint.url string
endpoint.description string | null
endpoint.events[] string[]
endpoint.status string
endpoint.disabled_reason string | null
endpoint.consecutive_failures integer
endpoint.secret_hint string
endpoint.previous_secret_expires_at string | null
endpoint.secret_rotated_at string | null
endpoint.last_success_at string | null
endpoint.last_failure_at string | null
endpoint.last_error string | null
endpoint.created_at string
endpoint.updated_at string
endpoint.disabled_at string | null

Voorbeeldantwoord

{
  "endpoint": {
    "id": "example-id",
    "url": "https://example.com",
    "events": [
      "example"
    ],
    "status": "active",
    "secret_hint": "example",
    "created_at": "2026-08-27T12:00:00Z",
    "description": "example",
    "disabled_reason": "customer",
    "consecutive_failures": 1,
    "previous_secret_expires_at": "2026-08-27T12:00:00Z",
    "secret_rotated_at": "2026-08-27T12:00:00Z",
    "last_success_at": "2026-08-27T12:00:00Z",
    "last_failure_at": "2026-08-27T12:00:00Z",
    "last_error": "example",
    "updated_at": "2026-08-27T12:00:00Z",
    "disabled_at": "2026-08-27T12:00:00Z"
  }
}
DELETE /v1/webhooks/:webhook_id

Verwijder een endpoint. Openstaande leveringen worden geannuleerd en eventueel gereserveerde credits worden terugbetaald.

Antwoordvelden

Veld Type
id string
deleted boolean

Voorbeeldantwoord

{
  "id": "example-id",
  "deleted": true
}
POST /v1/webhooks/:webhook_id/test

Verstuur één gratis webhook.test-gebeurtenis en geef het resultaat terug. Testgebeurtenissen worden niet opnieuw geprobeerd en tellen niet mee voor automatisch pauzeren.

Antwoordvelden

Veld Type
delivery object
delivery.id string
delivery.endpoint_id string
delivery.event_id string
delivery.event_type string
delivery.status string
delivery.attempts integer
delivery.next_attempt_at string | null
delivery.last_attempt_at string | null
delivery.response_status integer | null
delivery.last_error string | null
delivery.credits_charged integer
delivery.refunded boolean
delivery.created_at string
delivery.delivered_at string | null
delivered boolean

Voorbeeldantwoord

{
  "delivery": {
    "id": "example-id",
    "endpoint_id": "example",
    "event_id": "example",
    "event_type": "domain",
    "status": "pending",
    "attempts": 1,
    "next_attempt_at": "2026-08-27T12:00:00Z",
    "last_attempt_at": "2026-08-27T12:00:00Z",
    "response_status": 1,
    "last_error": "example",
    "credits_charged": 1,
    "refunded": false,
    "created_at": "2026-08-27T12:00:00Z",
    "delivered_at": "2026-08-27T12:00:00Z"
  },
  "delivered": false
}
POST /v1/webhooks/:webhook_id/rotate-secret

Vervang het ondertekeningsgeheim van een endpoint, ook van een gepauzeerd endpoint. Het nieuwe geheim wordt alleen in dit antwoord teruggegeven. De komende 24 uur wordt elke levering met zowel het nieuwe als het vorige geheim ondertekend. Roteren is gratis.

Voorbeeldverzoek

curl -X POST "https://domscan.net/v1/webhooks/whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3/rotate-secret" \
  -H "X-API-Key: $DOMSCAN_API_KEY"

Voorbeeldantwoord

{
  "endpoint": {
    "id": "whe_3f1c0a9b8e7d6c5b4a39281706f5e4d3",
    "status": "active",
    "secret_hint": "4b7a",
    "previous_secret_expires_at": "2026-10-11T12:00:00.000Z"
  },
  "secret": "whsec_...",
  "previous_secret_expires_at": "2026-10-11T12:00:00.000Z",
  "grace_period_seconds": 86400
}

Antwoordvelden

Veld Type
endpoint object
endpoint.id string
endpoint.url string
endpoint.description string | null
endpoint.events[] string[]
endpoint.status string
endpoint.disabled_reason string | null
endpoint.consecutive_failures integer
endpoint.secret_hint string
endpoint.previous_secret_expires_at string | null
endpoint.secret_rotated_at string | null
endpoint.last_success_at string | null
endpoint.last_failure_at string | null
endpoint.last_error string | null
endpoint.created_at string
endpoint.updated_at string
endpoint.disabled_at string | null
secret string
previous_secret_expires_at string
grace_period_seconds integer
GET /v1/webhooks/:webhook_id/deliveries

Queryparameters

ParameterTypeBeschrijving
limit integer Aantal leveringen dat wordt teruggegeven, van 1 tot 100. Standaard 50.

Toon recente leveringen met status, pogingen, HTTP-reactie, in rekening gebrachte credits en terugbetalingen. Leveringsrecords worden 30 dagen bewaard.

Antwoordvelden

Veld Type
endpoint_id string
deliveries[] object[]
deliveries[] object
deliveries[].id string
deliveries[].endpoint_id string
deliveries[].event_id string
deliveries[].event_type string
deliveries[].status string
deliveries[].attempts integer
deliveries[].next_attempt_at string | null
deliveries[].last_attempt_at string | null
deliveries[].response_status integer | null
deliveries[].last_error string | null
deliveries[].credits_charged integer
deliveries[].refunded boolean
deliveries[].created_at string
deliveries[].delivered_at string | null

Voorbeeldantwoord

{
  "endpoint_id": "example",
  "deliveries": [
    {
      "id": "example-id",
      "endpoint_id": "example",
      "event_id": "example",
      "event_type": "domain",
      "status": "pending",
      "attempts": 1,
      "next_attempt_at": "2026-08-27T12:00:00Z",
      "last_attempt_at": "2026-08-27T12:00:00Z",
      "response_status": 1,
      "last_error": "example",
      "credits_charged": 1,
      "refunded": false,
      "created_at": "2026-08-27T12:00:00Z",
      "delivered_at": "2026-08-27T12:00:00Z"
    }
  ]
}

Verzoekformaat

Elke melding is een POST-verzoek met een JSON-body. Het veld id blijft voor een gebeurtenis gelijk en wordt herhaald in X-DomScan-Event-Id, zodat u nieuwe pogingen die u al hebt verwerkt kunt negeren.

POST /domscan HTTP/1.1
Content-Type: application/json
X-DomScan-Event: domain.expiring_30
X-DomScan-Event-Id: evt_6f1d2c3b4a5948e7b6c5d4e3f2a1b0c9
X-DomScan-Timestamp: 1791633600
X-DomScan-Signature: sha256=...

{
  "id": "evt_6f1d2c3b4a5948e7b6c5d4e3f2a1b0c9",
  "type": "domain.expiring_30",
  "created": "2026-10-10T12:00:00.000Z",
  "data": {
    "domain": "acme.io",
    "previous_status": "registered",
    "current_status": "expiring_soon",
    "expiry_date": "2026-11-09T00:00:00Z",
    "days_until_expiry": 30,
    "checked_at": "2026-10-10T12:00:00.000Z"
  }
}

Handtekeningen verifiëren

Bereken een HMAC-SHA256 van de waarde van X-DomScan-Timestamp, een punt en de ruwe body van het verzoek met het geheim van uw endpoint. Vergelijk het resultaat in constante tijd met X-DomScan-Signature en weiger verzoeken waarvan de tijdstempel meer dan 5 minuten oud is.

Het onderstaande voorbeeld controleert elke handtekening in de header en blijft dus werken tijdens een geheimrotatie.

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);
  });
}

Een ondertekeningsgeheim roteren

Tijdens de respijtperiode van 24 uur na een rotatie bevat X-DomScan-Signature twee handtekeningen, gescheiden door een komma, met het nieuwe geheim eerst, zoals hieronder getoond. Accepteer een verzoek zodra een van de handtekeningen overeenkomt met een geheim dat u vertrouwt, implementeer het nieuwe geheim en vertrouw daarna het oude niet meer. Als u tijdens de respijtperiode opnieuw roteert, vervalt het oudere vorige geheim onmiddellijk.

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

Nieuwe pogingen en automatisch pauzeren

Geef binnen 8 seconden een 2xx-status terug om een melding te bevestigen. Omleidingen, andere statuscodes en time-outs worden met exponentiële backoff opnieuw geprobeerd (1, 4, 16, 64 en 256 minuten), tot in totaal 6 pogingen. Na 15 opeenvolgende mislukte pogingen wordt het endpoint gepauzeerd; schakel het weer in met PATCH of via de Monitor-instellingen.

Wanneer een endpoint na herhaalde fouten wordt gepauzeerd, ontvangt de eigenaar van het endpoint één e-mail met de host van het endpoint, de laatste fout en een link naar de Monitorinstellingen. Herstel het endpoint en schakel het daarna weer in via de Monitorinstellingen of met PATCH waarbij enabled op true staat. Door in te schakelen wordt de foutenteller op nul gezet.

Waarschuwingsabonnementen voor watchlist

Abonneer een gevolgd item op de waarschuwingen die u wilt ontvangen. Elk abonnement volgt één hostnaam, TLD of merkdomein en u kiest welke gebeurtenissen u ontvangt. Gebeurtenissen gaan naar uw ondertekende webhook-endpoints en naar uw waarschuwingen in de app.

TypeGebeurtenissenWanneer het afgaat
sslssl.expiring ssl.expired ssl.changedssl.expiring wanneer het certificaat van een hostnaam binnen ssl_expiring_days verloopt (30, 14, 7 of 1, standaard 14), eenmaal per certificaat en drempel. ssl.expired eenmaal per verlopen certificaat. ssl.changed wanneer bij twee opeenvolgende controles een nieuwe certificaatvingerafdruk wordt gezien; de payload geeft aan of de uitgever is gewijzigd.
priceprice.droppedWanneer de registratie- of verlengingsprijs van een TLD, bij één registrar of de goedkoopste, met minstens drop_percent daalt ten opzichte van de hoogste prijs sinds de laatste waarschuwing, of target_price of lager bereikt. Prijzen komen uit de dagelijkse prijssnapshot en elke snapshot wordt eenmaal beoordeeld.
dnsdns.changedWanneer een gevolgd recordtype (A, AAAA, MX, NS, TXT of CNAME) van een willekeurige hostnaam bij twee opeenvolgende bevestigde opzoekingen hetzelfde nieuwe antwoord geeft.
typosquattyposquat.detectedWanneer een lookalike van het merkdomein nieuw is geregistreerd, bevestigd door een gezaghebbende registratieopzoeking. De eerste volledige ronde over de lookalikes legt de uitgangssituatie vast en geeft geen waarschuwing.

Alleen exact bewijs activeert een gebeurtenis. Een mislukte TLS-handshake, een DNS-opzoeking die mislukt of een time-out krijgt, een ontbrekende prijs en een opzoeking die wordt geblokkeerd of waarvoor een limiet geldt, zijn onbekend: ze wijzigen niets en geven nooit een waarschuwing of kosten. De eerste bevestigde controle van een abonnement legt de uitgangssituatie vast.

Controles draaien automatisch: certificaten elke 12 uur, DNS-records elk uur (met een bevestigingscontrole 15 minuten nadat een wijziging voor het eerst is gezien), prijzen elke 2 uur ten opzichte van de dagelijkse snapshot en lookalikes in batches van 30 met elke dag een volledige ronde. Na een onbekende controle volgt de volgende poging eerder.

Abonnementen aanmaken en controles uitvoeren is gratis. Elke waarschuwing die met een 2xx-respons naar een webhook-endpoint wordt geleverd, kost 2 credits, net als elke andere monitoringwaarschuwing. Mislukte leveringen worden terugbetaald en een account kan maximaal 100 abonnementen hebben, waarvan 20 voor lookalikes.

POST /v1/watchlist/alerts

Maak een abonnement aan. type bepaalt welke velden gelden: domain voor ssl, dns en typosquat; tld, registrar, price_type, drop_percent en target_price voor price. Velden die niet bij het type horen, worden geweigerd.

Inhoud van het verzoek

ParameterTypeBeschrijving
typestringssl, price, dns of typosquat. Verplicht.
domainstringHostnaam om te volgen voor ssl en dns, of het merkdomein voor typosquat.
tldstringTLD om te volgen voor price, bijvoorbeeld com.
registrarstringRegistrar-id voor price. Laat leeg om de goedkoopste registrar te volgen.
eventsstring[]Te ontvangen gebeurtenissen. Standaard alle gebeurtenissen van het type.
ssl_expiring_daysintegerDagen voor het verlopen voor ssl.expiring: 30, 14, 7 of 1. Standaard 14.
price_typestringregistration (standaard) of renewal.
drop_percentnumberWaarschuw bij een daling van minstens dit percentage, 1 tot 95.
target_pricenumberWaarschuw wanneer de prijs in USD dit bedrag of lager bereikt. Een prijsabonnement heeft drop_percent, target_price of beide nodig.
record_typesstring[]Te volgen recordtypen voor dns. Standaard A, AAAA, MX, NS, TXT en CNAME.

Voorbeeldverzoek

curl -X POST "https://domscan.net/v1/watchlist/alerts" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "price",
    "tld": "com",
    "registrar": "porkbun",
    "price_type": "renewal",
    "drop_percent": 10,
    "target_price": 9.5
  }'

Voorbeeldantwoord

{
  "subscription": {
    "id": "mas_8c1f0e2d3b4a59687766554433221100",
    "type": "price",
    "target": "com",
    "registrar": "porkbun",
    "events": ["price.dropped"],
    "status": "active",
    "price_type": "renewal",
    "drop_percent": 10,
    "target_price": 9.5,
    "currency": "USD",
    "observed": null,
    "last_check_status": null,
    "next_check_at": "2026-10-10T12:00:00.000Z"
  }
}

Antwoordvelden

Veld Type
subscription object
subscription.id string
subscription.type string
subscription.target string
subscription.registrar string | null
subscription.events[] string[]
subscription.status string
subscription.ssl_expiring_days integer | null
subscription.price_type string | null
subscription.drop_percent number | null
subscription.target_price number | null
subscription.currency string | null
subscription.record_types[] string[]
subscription.observed object | null
subscription.last_check_at string | null
subscription.last_check_status string | null
subscription.last_error string | null
subscription.next_check_at string | null
subscription.created_at string
subscription.updated_at string
GET /v1/watchlist/alerts

Toon uw abonnementen met het laatst bevestigde bewijs en de controlestatus, de gebeurtenissen die elk type ondersteunt, het controleschema en de waarschuwingsprijs.

Antwoordvelden

Veld Type
subscriptions[] object[]
subscriptions[] object
subscriptions[].id string
subscriptions[].type string
subscriptions[].target string
subscriptions[].registrar string | null
subscriptions[].events[] string[]
subscriptions[].status string
subscriptions[].ssl_expiring_days integer | null
subscriptions[].price_type string | null
subscriptions[].drop_percent number | null
subscriptions[].target_price number | null
subscriptions[].currency string | null
subscriptions[].record_types[] string[]
subscriptions[].observed object | null
subscriptions[].last_check_at string | null
subscriptions[].last_check_status string | null
subscriptions[].last_error string | null
subscriptions[].next_check_at string | null
subscriptions[].created_at string
subscriptions[].updated_at string
total integer
available_types object
available_types.ssl[] string[]
available_types.price[] string[]
available_types.dns[] string[]
available_types.typosquat[] string[]
policy object
policy.credits_per_delivered_alert integer
policy.check_credits integer
policy.unknown_checks_charged boolean
policy.max_subscriptions integer
policy.max_typosquat_subscriptions integer
policy.ssl_expiring_days[] integer[]
policy.default_ssl_expiring_days integer
policy.record_types[] string[]
policy.price_types[] string[]
policy.check_interval_minutes object
policy.confirmation_checks object

Voorbeeldantwoord

{
  "subscriptions": [
    {
      "id": "example-id",
      "type": "ssl",
      "target": "example",
      "registrar": "example",
      "events": [
        "ssl.expiring"
      ],
      "status": "active",
      "ssl_expiring_days": 30,
      "price_type": "registration",
      "drop_percent": 0.5,
      "target_price": 0.5,
      "currency": "USD",
      "record_types": [
        "A"
      ],
      "observed": {},
      "last_check_at": "2026-08-27T12:00:00Z",
      "last_check_status": "baseline",
      "last_error": "example",
      "next_check_at": "2026-08-27T12:00:00Z",
      "created_at": "2026-08-27T12:00:00Z",
      "updated_at": "2026-08-27T12:00:00Z"
    }
  ],
  "total": 1,
  "available_types": {
    "ssl": [
      "ssl.expiring"
    ],
    "price": [
      "price.dropped"
    ],
    "dns": [
      "dns.changed"
    ],
    "typosquat": [
      "typosquat.detected"
    ]
  },
  "policy": {
    "credits_per_delivered_alert": 2,
    "check_credits": 0,
    "unknown_checks_charged": false,
    "max_subscriptions": 1,
    "check_interval_minutes": {},
    "max_typosquat_subscriptions": 1,
    "ssl_expiring_days": [
      1
    ],
    "default_ssl_expiring_days": 1,
    "record_types": [
      "A"
    ],
    "price_types": [
      "registration"
    ],
    "confirmation_checks": {}
  }
}
GET /v1/watchlist/alerts/:subscription_id

Haal één abonnement op met het laatst bevestigde bewijs en de 20 meest recente gebeurtenissen.

Antwoordvelden

Veld Type
subscription object
subscription.id string
subscription.type string
subscription.target string
subscription.registrar string | null
subscription.events[] string[]
subscription.status string
subscription.ssl_expiring_days integer | null
subscription.price_type string | null
subscription.drop_percent number | null
subscription.target_price number | null
subscription.currency string | null
subscription.record_types[] string[]
subscription.observed object | null
subscription.last_check_at string | null
subscription.last_check_status string | null
subscription.last_error string | null
subscription.next_check_at string | null
subscription.created_at string
subscription.updated_at string
events[] object[]
events[] object
events[].id string
events[].event_type string
events[].detected_at string
events[].published_at string | null
events[].data object

Voorbeeldantwoord

{
  "subscription": {
    "id": "example-id",
    "type": "ssl",
    "target": "example",
    "registrar": "example",
    "events": [
      "ssl.expiring"
    ],
    "status": "active",
    "ssl_expiring_days": 30,
    "price_type": "registration",
    "drop_percent": 0.5,
    "target_price": 0.5,
    "currency": "USD",
    "record_types": [
      "A"
    ],
    "observed": {},
    "last_check_at": "2026-08-27T12:00:00Z",
    "last_check_status": "baseline",
    "last_error": "example",
    "next_check_at": "2026-08-27T12:00:00Z",
    "created_at": "2026-08-27T12:00:00Z",
    "updated_at": "2026-08-27T12:00:00Z"
  },
  "events": [
    {
      "id": "example-id",
      "event_type": "ssl.expiring",
      "detected_at": "2026-08-27T12:00:00Z",
      "published_at": "2026-08-27T12:00:00Z",
      "data": {}
    }
  ]
}
PATCH /v1/watchlist/alerts/:subscription_id

Onderbreek of hervat een abonnement met enabled, of wijzig de events, ssl_expiring_days, drop_percent, target_price of record_types. Een nieuwe doelprijs geeft alleen een waarschuwing bij een latere prijsbeweging.

{ "enabled": false }

Antwoordvelden

Veld Type
subscription object
subscription.id string
subscription.type string
subscription.target string
subscription.registrar string | null
subscription.events[] string[]
subscription.status string
subscription.ssl_expiring_days integer | null
subscription.price_type string | null
subscription.drop_percent number | null
subscription.target_price number | null
subscription.currency string | null
subscription.record_types[] string[]
subscription.observed object | null
subscription.last_check_at string | null
subscription.last_check_status string | null
subscription.last_error string | null
subscription.next_check_at string | null
subscription.created_at string
subscription.updated_at string

Voorbeeldantwoord

{
  "subscription": {
    "id": "example-id",
    "type": "ssl",
    "target": "example",
    "registrar": "example",
    "events": [
      "ssl.expiring"
    ],
    "status": "active",
    "ssl_expiring_days": 30,
    "price_type": "registration",
    "drop_percent": 0.5,
    "target_price": 0.5,
    "currency": "USD",
    "record_types": [
      "A"
    ],
    "observed": {},
    "last_check_at": "2026-08-27T12:00:00Z",
    "last_check_status": "baseline",
    "last_error": "example",
    "next_check_at": "2026-08-27T12:00:00Z",
    "created_at": "2026-08-27T12:00:00Z",
    "updated_at": "2026-08-27T12:00:00Z"
  }
}
DELETE /v1/watchlist/alerts/:subscription_id

Verwijder een abonnement. Gebeurtenissen die nog niet zijn verzonden, worden verwijderd en nooit in rekening gebracht.

Antwoordvelden

Veld Type
id string
deleted boolean

Voorbeeldantwoord

{
  "id": "example-id",
  "deleted": true
}

Voorbeeld van een dns.changed-gebeurtenis

{
  "id": "evt_2b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e",
  "type": "dns.changed",
  "created": "2026-10-10T12:15:00.000Z",
  "data": {
    "domain": "partner-shop.example",
    "changes": [
      {
        "record_type": "MX",
        "before": ["10 mx1.mail.example"],
        "after": ["10 mx.other-mail.example"],
        "added": ["10 mx.other-mail.example"],
        "removed": ["10 mx1.mail.example"],
        "first_seen_at": "2026-10-10T12:00:00.000Z"
      }
    ],
    "confirmed_checks": 2,
    "confirmed_at": "2026-10-10T12:15:00.000Z",
    "subscription_id": "mas_8c1f0e2d3b4a59687766554433221100"
  }
}