Coding agent documentation index Fetch the complete documentation index at: https://docs.worklittle.com/docs-agent-manifest.json Use this file to discover all available pages before exploring further.

Webhooks reliability

Verify signatures, dedupe at-least-once deliveries, acknowledge fast, and reconcile.

How delivery works

Worklittle POSTs JSON to your endpoint and records each attempt in the delivery log. Failed deliveries retry with backoff.

{
  "id": "wh_…",
  "type": "candidate.application_submitted",
  "created_at": 1748948400,
  "data": { }
}

created_at is Unix seconds. Subscribe to "*" or specific types. Manage endpoints with /webhooks or MCP list_webhooks, create_webhook, update_webhook, rotate_webhook_secret, test_webhook, list_webhook_deliveries. Event list: Webhooks.

Verify before you trust

| Header | Purpose |
| --- | --- |
| `Worklittle-Webhook-Id` | Unique delivery id. Dedupe key |
| `Worklittle-Webhook-Timestamp` | Unix timestamp. Reject replays |
| `Worklittle-Webhook-Signature` | `v1=<hmac>` over `timestamp.body` |
import crypto from "node:crypto";

function verify(sigHeader, timestamp, rawBody, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");
  const received = sigHeader.replace(/^v1=/, "");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(received));
}

Verify against the raw body before parsing JSON. Reject old timestamps. When you rotate with rotate_webhook_secret, accept both secrets during rollover.

Idempotency

Delivery is at-least-once and unordered.

Dedupe on Worklittle-Webhook-Id with a unique constraint and retention that covers the retry window. On conflict, return 200 and stop. Make writes idempotent. Upsert on a stable business id. "Set stage to onsite" is idempotent. "Advance one stage" is not. Derive downstream idempotency keys from the delivery id. Handle out-of-order events. Discard an update whose created_at is older than the state you hold.

Acknowledge fast, work async

Return 2xx once the payload is verified and durably queued. Do real work in a background worker. Slow handlers time out, trigger retries, and repeat the work. Keep the path to verification, dedupe insert, enqueue, and return well under a second.

Reconciliation

Webhooks give latency. Reconciliation gives correctness.

Hourly, list records changed since your watermark and compare with your mirror. Keep it narrow and paginated. Use list_webhook_deliveries to inspect attempts. Use test_webhook after changing your handler, TLS, or firewall. * For careers-site caches, revalidate on job.published, job.updated, job.closed and keep a slow background refresh.