Skip to content
Docs

API reference

Errors

The error body, HTTP status codes and the error codes the API returns.

Every failure uses the same JSON body, so you can parse errors without checking the endpoint.

json
{
  "error": {
    "code": "validation_failed",
    "message": "invalid request",
    "details": [{ "field": "name", "reason": "is required" }],
    "request_id": "01JABCDEF0123456789XYZ"
  }
}

code is stable and meant for programs, message is for people, details lists field-level problems when there are any, and request_id matches the X-Request-Id response header. Quote it when you contact support. Server errors never leak internals: an unexpected failure is logged with the request id and returned as a generic 500.

Status and codes

StatuscodeWhen
400validation_failedMalformed body or parameters (for example a bad page, an unknown filter field or operator).
400invalid_tokenA one-time token (invitation, reset) is wrong or used.
401unauthorizedMissing, invalid or expired credentials; session timed out.
401invalid_signatureA signed provider callback failed verification.
403forbiddenThe key or role lacks permission, or the IP is not allow-listed.
403mfa_enrollment_required, sso_required, maker_checkerPolicy blocks the call; see authentication.
404not_foundNo such resource in your tenant. Resources of other tenants are indistinguishable from missing ones.
405method_not_allowedThe path exists but not for this method.
409conflict, immutable, stale_version, run_in_progressDuplicate unique value, an immutable field, an outdated version, or a job already running.
413payload_too_largeUpload over the limit.
422validation_failedWell-formed but semantically invalid (for example a macro that does not exist, no tracking domain for a link). Also provider_invalid, no_tracking_domain.
423account_lockedToo many failed logins.
429rate_limitedPer-key token bucket empty. Honour Retry-After.
502provider_error, idp_error, upstream_error, upstream_unavailableA downstream provider, identity provider or internal service failed. Safe to retry.
503storage_unavailable, unavailableA dependency is down. Retry with backoff.

Retrying safely

  • GET, PUT and DELETE are idempotent by design; retry them on 429, 502 and 503.
  • The contract reserves an Idempotency-Key header for POST, but the API does not de-duplicate on it today. For creates that must not duplicate, store your own reference in external_ref and look it up with filter[external_ref]=... before creating.
  • Conversions are the exception: the ingest endpoints de-duplicate on txn_id per goal, so resending a conversion is safe. See deduplication.

Tracking endpoints answer differently

Postbacks and pixels on the ingest host never return 4xx or 5xx for business outcomes. They answer 200 with {"status": "created|duplicate|rejected|unmatched|updated", "conversion_id", "reason"} because advertisers' servers retry on errors. See conversion tracking methods.