WarmHawk
Docs / API reference / Queue, domains & webhooks

Queue, domains & webhooks.

The send queue, domain health checks, and — explicitly — what outbound webhooks exist today (none) versus what’s planned.

GET /v1/queue/status reports real BullMQ counts, pause state, and throttling (cadenceFloorSeconds: 480, jitterSeconds); POST /v1/queue/pause is a genuine Redis-level pause. Domain routes cover SPF/DKIM/DMARC + blocklist checks (keyed by domain name) and seed-inbox placement sampling (keyed by id). Outbound webhooks — WarmHawk calling your URL on an event — are Planned; no such system exists in core-engine yet.

Queue

RouteWhat it does
GET /v1/queue/statusReturns { counts, isPaused, jobs, throttling: { cadenceFloorSeconds: 480, jitterSeconds } }.
POST /v1/queue/pauseBody: { paused: boolean }. Real BullMQ pause/resume, not cosmetic.
API details (Tier 0 / self-hosters) · GET /v1/queue/status — response shape▸
{
  "counts": { "waiting": 3, "active": 1, "delayed": 12, "completed": 240, "failed": 2 },
  "isPaused": false,
  "jobs": [ /* up to 50 waiting/active/delayed jobs */ ],
  "throttling": { "cadenceFloorSeconds": 480, "jitterSeconds": 240 }
}

Domains

RouteWhat it does
GET /v1/domainsList every sending domain on the account, each with mailingAddress, label and usedBy (the campaigns sending from it).
POST /v1/domainsCreate. Body: { domainName, redirectUrl?, dkimSelector?, label?, mailingAddress?, mailingAddressParts? }. The address is optional here. dkimSelector is the part before ._domainkey; 422 if it is not a valid DNS label.
PATCH /v1/domains/:idUpdate redirectUrl, dkimSelector, label or the mailing address. Only fields present change; dkimSelector null or "" clears it. Clearing an address that campaigns send with returns 409 ADDRESS_IN_USE unless confirm: true.
POST /v1/domains/:domain/checkKeyed by domain NAME, not id. Unified SPF/DKIM/DMARC + blocklist check. DKIM uses ?selector= if given, else the saved dkimSelector, else tries common provider selectors (a miss is PENDING). Also runs hourly on its own.
GET /v1/domains/:id/placement-sampleKeyed by id. Seed-inbox placement sampling rollup — explicitly labeled as sampling, not exhaustive testing.

Note the key: domain checks use the domain name (POST /v1/domains/yourcompany.com/check), placement sampling uses the domain id (GET /v1/domains/dom_a1b2c3/placement-sample) — every other domain route in this table is id-keyed. Full walkthrough with response bodies: Sending safely & domain health.

Webhooks — Planned

Planned, not built

No outbound webhook system exists in warmhawk-core-engine today — there is no route to register a callback URL and no event dispatcher that calls it. If you need to react to a WarmHawk event today (a new reply, a send completing, a domain going unhealthy), poll the relevant GET route instead: GET /v1/replies, GET /v1/queue/status, or GET /v1/domains/:id/placement-sample. This section exists to say so plainly rather than leave the gap undocumented.