VALIDATION_ERROR | Request parameters or body failed validation. details is an array of { field, message, code }, one per rejected field. |
ORG_ACCESS_DENIED | Requested organization is not in your accessible hierarchy. |
ONBOARDING_INCOMPLETE | 403. The organization’s 14-day onboarding grace window has passed and the business profile or funding step (see Account Setup) is still incomplete. Returned on requests that create new resources: brands, campaigns, toll-free verifications, phone number purchases, email domains and senders, projects and project copies, and email campaigns and duplicates, including POST /v1/projects, POST /v1/projects/{id}/copy, and POST /v1/email/campaigns. details includes missingSteps (an array containing profile, funding, or both) and onboardingUrl (/onboarding). Nothing already running is affected, only new creates are blocked. |
ENTITLEMENT_REQUIRED | 403. The organization is not entitled to this feature; some features require enablement by Political Comms. Returned on every write (POST/PUT/PATCH/DELETE) under /v1/email/*. details includes entitlement, the entitlement key that is missing (tendlc, toll_free, short_code, data_purchases, email, stripe_connect, phone_number_sharing, or sub_orgs). Contact support to request enablement. |
SENDING_PAUSED | 409. Sending is paused for the organization or platform-wide, by Political Comms. Returned on POST /v1/projects, POST /v1/projects/{id}/schedule, POST /v1/conversations/{id}/messages, and POST /v1/email/campaigns/{id}/schedule. details includes scope (organization or platform). |
RATE_LIMIT_EXCEEDED | Too many requests - wait for the Retry-After seconds before retrying. |
INVALID_STATE_TRANSITION | Project is not in a state that allows this operation. POST /v1/projects/{id}/schedule accepts ready and paused projects. |
NOT_A_SURVEY | The endpoint only applies to survey projects (type: survey). |
LIST_NOT_READY | Contact list must finish importing before it can be analyzed. |
ANALYSIS_NOT_COMPLETE | 409. GET /v1/contact-lists/{id}/download?type=analyzed was requested before analysis finished. Poll GET /v1/contact-lists/{id} until analysis.status is complete, or subscribe to the contact_list.analyzed webhook. |
LIST_ANALYSIS_IN_PROGRESS | 409. POST /v1/projects, the project update endpoint, or POST /v1/projects/{id}/schedule referenced a contact list whose analysis is still running (analysis.status processing). Nothing is changed. details.lists is an array of { id, name, status } for each list still in analysis. Wait for analysis.status complete on GET /v1/contact-lists/{id} or the contact_list.analyzed webhook, then retry the same request. |
INSUFFICIENT_BALANCE | A wallet in the organization hierarchy cannot cover the scheduled send (422 on schedule) or the list analysis (402 on POST /v1/contact-lists/{id}/analyze, with nothing queued). This may be a parent organization rather than the one you called with - charges roll up, so every ancestor must cover its own share. details includes the shortfall plus organizationId and organizationName identifying which organization fell short, actingOrganizationId (the organization the call was made for) and isAncestor (true when the short wallet belongs to a parent of the acting organization). |
CONVERSATION_NOT_FOUND | 404. The conversation does not exist or belongs to an organization outside the key’s hierarchy; the two are indistinguishable by design. |
CONTACT_OPTED_OUT | 409. The contact replied STOP; a reply to this conversation is refused before any charge. Final: do not retry. |
CONVERSATION_NOT_SENDABLE | 409. The conversation has no sending number bound to it, so nothing can reply from it. |
PROJECT_DELETED | 409. The project behind the conversation was deleted. |
PHONE_NUMBER_UNAVAILABLE | 409. The conversation’s sending number was released or is inactive. |
SEND_ENQUEUE_FAILED | 503. A reply could not be handed to the delivery queue after billing; the charge was reversed and nothing was sent. Retry the same call. |
CARRIER_ESTIMATE_TIMEOUT | 503. The carrier throughput estimate for GET /v1/projects/{id}/throughput timed out and had no effect. Retry later. |
MIXED_PHONE_OWNERSHIP | 400. A project’s phone_number_ids mixed numbers the organization owns with numbers shared with it, or shared numbers from two different campaigns or registrations. Select numbers from one source. |
PHONE_SHARE_REVOKED | 409. A number the project selects was shared with the organization and the share has been revoked (or the number released). Choose a different number. |
IDEMPOTENCY_CONFLICT | The same Idempotency-Key is still processing - retry after the Retry-After seconds. |
IDEMPOTENCY_MISMATCH | An Idempotency-Key was reused with a different request body - that’s a client bug; use a fresh key for new requests. |
DATE_RANGE_TOO_LARGE | Date range exceeds the maximum allowed (31 days). |
DATE_TOO_OLD | Start date exceeds the look-back limit: 180 days for /messages/stats and /ledger/*, 90 days for /projects/stats. |
FUTURE_DATE_NOT_ALLOWED | Date range may not end in the future. |
INVALID_DATE_FORMAT | Date parameter must be in YYYY-MM-DD format. |