Skip to main content
The Chirp API uses a consistent error format across all endpoints. Every error response follows the same structure, making it easy to handle errors programmatically regardless of which endpoint you are calling.

The Error Object

When an API request fails, the response body contains an error object with the following structure:
Error response

Attributes

Error Types

Every error has a type that tells you the category of the problem. The HTTP status code tells you the status; the type tells you what kind of problem occurred.

invalid_request_error

Returned when the request itself is malformed or references something that does not exist. Check the param field to identify which parameter caused the issue.
Validation error
Invalid phone number

authentication_error

Returned when there is a problem with the API key. No code is needed because the type and HTTP status are sufficient.
Authentication error

provider_error

Returned when the request was valid but the operation failed at Meta or Telnyx. The provider object contains the raw error from the upstream API. This is the most common error type when sending messages.
Provider error

api_error

Returned when something goes wrong on Chirp’s end. These errors are rare and typically resolve on their own. Safe to retry with exponential backoff.
API error

HTTP Status Codes

The Chirp API uses specific HTTP status codes to indicate the nature of the error:
402 vs 400: A 400 means your request was malformed. A 402 means your request was valid, but the operation failed downstream (e.g., the message could not be delivered). This distinction helps you separate input errors from delivery failures.
424 vs 500: A 424 means an external provider (Meta or Telnyx) failed. A 500 means Chirp’s own systems had an issue. This tells you whether the problem is on Chirp’s side or the provider’s side.

Provider Errors

When errors originate from Meta (WhatsApp) or Telnyx (SMS/MMS), the provider object contains the raw error details from the upstream API. Chirp maps these provider errors to standardized Chirp error codes so you can handle them consistently. The provider object is useful for:
  • Debugging — The provider’s native error code and message give you additional context.
  • Meta support tickets — Include the fbtrace_id when contacting Meta support about WhatsApp issues.
  • Detailed logging — Log the full provider object for your operations team.
For a complete mapping of provider error codes, see:

Health Status Enrichment (WhatsApp)

For certain vague Meta errors — account_restricted and display_name_not_approved — Chirp automatically calls Meta’s Health Status API and attaches the specific blocked entity and Meta’s suggested remediation to the error response. When enrichment runs, you get two extra fields:
  • additional_info — a flat string[] with Meta’s possible_solution text, ordered with the most critical hints first.
  • provider.health_status — the full entity tree (phone number, WABA, business portfolio, app, template) with per-entity status and error details.
Enriched account_restricted response
Enrichment is best-effort. If Chirp’s follow-up call to Meta fails, you still get the base error — additional_info and provider.health_status will simply be absent. Never branch on whether they exist; treat them as hints on top of error.code.
See Health Status Enrichment in the WhatsApp error guide for the full list of enriched codes, entity types, and failure-webhook behavior.

Next Steps

Error Codes

Complete reference of all error codes with causes and solutions

Handling Errors

Learn how to handle errors in your application