Error codes
| Status | Meaning | Common cause |
|---|---|---|
400 | Bad request | Missing required fields — e.g. no identifiers on a find request, no contact_id on update |
401 | Unauthorized | Token is invalid, not found, or the webhook has been disabled by an org admin |
404 | Not found | Unknown path under /contacts, or contact not found on an update request |
405 | Method not allowed | Request was not a POST |
500 | Internal server error | Handler threw before sending a response body |
Error body
All errors return a JSON body with anerror field:
Async endpoints and silent failures
For async endpoints (create-with-ai, create), validation happens in the background worker — not at the HTTP layer. This means:
- A
200response does not guarantee a contact was created - If
unstructured_textis empty, no contact work is performed despite a successful response - If none of
full_name,phone_number, orcontact_emailare present on a structured create, the worker returns early without creating
Duplicate events
Async endpoints deduplicate payloads using a hash of the request body. If the same payload is received more than once:- The response is still
200 acknowledgedistrueeventIdis omitted
eventId to distinguish new events from duplicates.