API Reference

Webhook export

Manage webhook destinations and push accounts or people to them as flat JSON rows - one POST per record, Clay-ready. Background push runs handle any batch size.

List destinations

GET/webhook-destinations

Returns every webhook export destination in the workspace. Destination URLs often embed a secret token (Clay webhook URLs do), so only a masked form is returned; the signing secret is included so your receiver can verify deliveries.

Response
{
  "data": [
    {
      "id": "...",
      "name": "Clay - Accounts table",
      "url_masked": "https://api.clay.com/v3/sources/w…",
      "secret": "whsec_...",
      "created_at": "2026-07-01T..."
    }
  ]
}

Create a destination

POST/webhook-destinations
Body fields
namestringrequired

Display name, unique per workspace (max 80 chars).

urlstringrequired

Receiving webhook URL. Must be a public https endpoint that accepts JSON POSTs.

Request
curl -X POST https://usehunch.co/api/v1/webhook-destinations \
  -H "Authorization: Bearer hunch_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Clay - Accounts table", "url": "https://api.clay.com/v3/sources/webhook/..." }'
Internal, loopback, and private-network URLs are rejected to prevent SSRF, and the URL is re-checked (including DNS resolution) at delivery time.

Delete a destination

DELETE/webhook-destinations/:id
Response
{ "data": { "id": "...", "deleted": true } }

Push accounts

POST/accounts/webhook-push

Delivers each account to the destination as one flat JSON row per POST - the shape Clay, Zapier, Make, and n8n expect. See Webhooks for the row fields and signing headers.

Body fields
destination_idstringrequired

Which destination to send to.

account_idsstring[]required

Accounts to push. Any size.

Batches of 100 or fewer deliver inline and return the final counts. Larger batches start a background push run:

Response (100 or fewer)
{ "data": { "pushed": 42, "failed": 0, "skipped": 0, "errors": [] } }
Response (over 100)
{ "data": { "run_id": "...", "total": 1200, "status": "running" } }

Push people

POST/people/webhook-push

Identical to the accounts push, with person rows.

Body fields
destination_idstringrequired

Which destination to send to.

contact_idsstring[]required

Person ids to push. Any size.

Poll a push run

GET/push-runs/:id

Reports progress for a background push - webhook or CRM. status is running, completed, or failed.

Response
{
  "data": {
    "id": "...",
    "channel": "webhook",
    "record_type": "accounts",
    "status": "running",
    "total": 1200,
    "sent": 500,
    "failed": 0,
    "skipped": 0,
    "error_sample": [],
    "created_at": "2026-07-11T...",
    "finished_at": null
  }
}
Rows can occasionally be re-delivered if a background push resumes after an interruption. Every row carries its Hunch id - dedupe on it downstream.