ProbeKit API v1.0.0

Network, DNS and email diagnostics plus monitor management. Authenticate every request with `Authorization: Bearer <api key>` (create keys in the dashboard — scopes: `read-tools`, `manage-monitors`). Automation platforms (Zapier, n8n, Make) subscribe to events with REST hooks under `/api/v1/hooks` (scope `manage-monitors`): every delivery is a JSON POST signed with the subscription secret (`X-ProbeKit-Signature: sha256=<HMAC-SHA256 of the body>`), retried with backoff on 5xx, 408, 429, or a timeout, and a 410 response unsubscribes the hook. Daily quotas are per plan; 429 responses include `X-RateLimit-*` headers and reset info.

Base URL: this site · raw OpenAPI JSON · get an API key

curl -H "Authorization: Bearer pk_..." \
  "/api/v1/mx?q=example.com"

tools

  • get/api/v1/mxMX records with resolved IPs and sanity checksq* (query)
  • get/api/v1/aA recordsq* (query)
  • get/api/v1/aaaaAAAA recordsq* (query)
  • get/api/v1/cnameCNAME recordq* (query)
  • get/api/v1/txtTXT recordsq* (query)
  • get/api/v1/soaSOA recordq* (query)
  • get/api/v1/srvSRV recordsq* (query)
  • get/api/v1/caaCAA recordsq* (query)
  • get/api/v1/ptrReverse DNS (PTR) for an IPq* (query)
  • get/api/v1/dnsNameserver auditq* (query)
  • get/api/v1/dnskeyDNSKEY recordsq* (query)
  • get/api/v1/dsDS recordsq* (query)
  • get/api/v1/rrsigRRSIG signaturesq* (query)
  • get/api/v1/spfSPF record analysis with include expansion and lookup countingq* (query)
  • get/api/v1/dkimDKIM key lookup (selector optional)q* (query) · selector (query)
  • get/api/v1/dmarcDMARC policy recordq* (query)
  • get/api/v1/bimiBIMI recordq* (query)
  • get/api/v1/mta-stsMTA-STS record + policyq* (query)
  • get/api/v1/tlsrptTLS-RPT recordq* (query)
  • get/api/v1/blacklistDNSBL check across ~40 zonesq* (query)
  • get/api/v1/whoisWHOIS lookupq* (query)
  • get/api/v1/asnASN origin lookupq* (query)
  • get/api/v1/arinRDAP IP registrationq* (query)
  • get/api/v1/pingICMP pingq* (query)
  • get/api/v1/traceTracerouteq* (query)
  • get/api/v1/tcpTCP port testq* (query) · port* (query)
  • get/api/v1/smtpSMTP diagnosticsq* (query)
  • get/api/v1/httpHTTP check with redirect chainq* (query)
  • get/api/v1/httpsTLS certificate inspectionq* (query)
  • get/api/v1/propagationMulti-resolver propagation checkq* (query) · type (query)
  • get/api/v1/domain-healthAggregated domain health reportq* (query)
  • get/api/v1/compliance-googleGoogle/Yahoo bulk-sender complianceq* (query)
  • get/api/v1/compliance-microsoftMicrosoft sender complianceq* (query)
  • get/api/v1/deliverabilityOne-shot deliverability scoreq* (query)
  • get/api/v1/llmstxtllms.txt checkq* (query)
  • get/api/v1/robotsaiAI-crawler robots.txt analysisq* (query)

monitors

  • get/api/v1/monitorsList monitors
  • post/api/v1/monitorsCreate a monitor
  • delete/api/v1/monitors/{id}Delete a monitorid* (path)

account

  • get/api/v1/meThe organization and key in use (connection test)

hooks

  • get/api/v1/hooksList active hook subscriptions
  • post/api/v1/hooksSubscribe a target URL to an event (returns the signing secret once)
  • delete/api/v1/hooks/{id}Unsubscribeid* (path)
  • get/api/v1/hooks/{id}/deliveriesThe last 50 delivery attempts of a hookid* (path)
  • get/api/v1/hooks/events/{event}Recent events of one kind, newest first (the sample when there are none yet)event* (path) · limit (query)
  • get/api/v1/hooks/samples/{event}A sample payload for an eventevent* (path)

Webhooks for automation (REST hooks)

Zapier, n8n, Make, or your own code can subscribe a URL to an event. ProbeKit then POSTs each event to it as JSON. Subscribing needs a key with the manage-monitors scope; your plan sets how many hooks can be active at once.

  • incident.opened A monitor or a DMARC report opened an incident.
  • incident.resolved An incident was resolved or acknowledged.
  • monitor.state_changed A monitor started alerting or went back to OK.
  • dmarc.report_received A DMARC aggregate report for one of your domains was stored.
curl -X POST -H "Authorization: Bearer pk_..." -H "content-type: application/json" \
  -d '{"event":"incident.opened","target_url":"https://example.com/probekit-hook"}' \
  "/api/v1/hooks"
# → {"id":"…","secret":"…"}   keep the secret: it signs every delivery

Each delivery carries X-ProbeKit-Event, X-ProbeKit-Hook-Id, X-ProbeKit-Delivery, and X-ProbeKit-Signature: sha256=…, the HMAC-SHA256 of the exact body with the hook’s secret. The body’s id is unique per event, so you can ignore repeats.

const crypto = require('node:crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-probekit-signature'] || ''));

Target URLs must be https on a public address; redirects are not followed and each attempt waits 10 seconds at most. A 5xx, 408, or 429 answer, or no answer, is retried six more times with growing gaps over about half an hour. Answer 410 Gone to unsubscribe. A hook whose last 20 events all failed is turned off, and so are a key’s hooks when the key is revoked. Unsubscribe with DELETE /api/v1/hooks/{id}; GET /api/v1/hooks/events/{event} returns recent events for testing.

Example: incident.opened

{
  "id": "00000000-0000-4000-8000-0000000000a1",
  "event": "incident.opened",
  "occurred_at": "2026-10-17T08:30:00.000Z",
  "data": {
    "incident_id": "00000000-0000-4000-8000-000000000001",
    "status": "open",
    "title": "DMARC policy weakened",
    "summary": "DMARC policy weakened: p=reject → p=none",
    "kind": "dmarc_weakened",
    "severity": "critical",
    "target": "example.com",
    "monitor_id": "00000000-0000-4000-8000-000000000002",
    "monitor_type": "dmarc_record",
    "monitor_name": "Example DMARC",
    "client_name": null,
    "opened_at": "2026-10-17T08:30:00.000Z",
    "resolved_at": null,
    "acknowledged_at": null,
    "url": "https://probekit.example/incidents/00000000-0000-4000-8000-000000000001"
  }
}