Skip to content

Contact errors

Error table

HTTPerrorWhen
400invalid_contact_idcontact_id does not match ^ct_[0-9a-f]{32}$
400invalid_cursorCorrupted opaque cursor
402contact_quota_exceededReturned by message sending (not by the contact endpoints) when the number’s distinct-contacts quota for the cycle has already been reached
401not_authenticatedThe API key is missing, invalid or revoked
403insufficient_scopeThe API key lacks the scope the route requires: contacts:read for list, detail and picture; contacts:write for refresh (the response includes required_scope)
404contact_not_foundThe contact does not exist, or belongs to another organization or to another number (the route’s {ref})
404number_not_foundThe route’s {ref} does not match any number in the account (applies to /contacts, /contacts/{id}, /contacts/quota and the other sub-routes)
400invalid_number_idThe value in the URL starts with num_ but is not a valid number id.
404contact_picture_unavailableRare case: generating the picture’s presigned URL failed. A missing picture (no storage, picture upload failed, contact without a picture) does not return 404: see Profile picture
422validation_errorA query parameter failed validation, for example limit outside the 1 to 200 range. The response carries details.errors with the rejected fields
429refresh_rate_limitedPer-minute refresh limit reached
500internal_errorUnexpected server error

402 response example

Returned when you try to talk through Turbo Notify to a contact that would become counted in the current cycle (a new contact or a returning contact not yet counted this cycle) and the cycle’s distinct-contacts quota is already used up.

HTTP status: 402
{
  "error": "contact_quota_exceeded",
  "message": "Distinct-contacts quota exceeded for tier SOLO (100/100 this cycle)",
  "details": {
    "quota": 100,
    "used": 100,
    "resets_at": "2026-08-01T00:00:00Z",
    "tier": "SOLO"
  }
}

What to do: upgrade the plan. Unlike 429, a 402 has no Retry-After: sending again does not help. The quota only comes back when the billing cycle closes (at resets_at) or when the plan changes.

402 vs 429

402 Payment Required429 Too Many Requests
MeaningPlan limit: upgradeRate limit: try again later
Header—Retry-After: <seconds>
When it clearsAt the end of the billing cycle (resets_at) or with an upgradeIn seconds or minutes
SourceCycle quotaBurst protection

See also: Quota and usage.