Responses & errors
Every response is JSON with the same envelope, and every error carries a readable message and a code.
Successful responses#
Successful calls carry "status": true and the result in data.
{
"status": true,
"code": "SUCCESS",
"data": { … }
}Errors#
Errors carry "status": false, a readable message and a code.
{
"status": false,
"message": "You don't have permission to perform this action.",
"code": "Forbidden",
"data": null
}Status codes#
| Status | When |
|---|---|
| 400 | The body or query failed validation. The message names the field. |
| 401 | No key, an unknown key, or one that was revoked or has expired. |
| 403 | The key's scopes don't cover this call, or the record belongs to another organization. |
| 404 | The record doesn't exist, or the path isn't part of the public API. |
| 409 | A duplicate (for example a lead that matches an existing one, code DUPLICATE_LEAD), or the same Idempotency-Key still being processed. |
| 422 | The organization isn't set up for this yet, for example no lead pipeline configured. |
| 429 | Rate limit reached for this key. Wait and retry. |
| 5xx | Something failed on our side. Safe to retry with the same Idempotency-Key. |
Request IDs#
Every response carries an X-Request-ID header. Include it when you contact support and we can find the exact request.