Skip to main content
Failures always come back in the same shape, whatever went wrong:
Log request_id alongside every failure you record. It’s the fastest way to have a specific call looked up if you need help with one.
You can also set your own X-Request-Id on a request and Paige will use it, which makes tracing across your system and Paige’s much easier.

Status codes

Common error codes

Request problems (400)

Message sends add their own validation codes — invalid_phone, missing_recipient, missing_template_name, missing_language, template_variable_mismatch, unsupported_message_type, too_many_buttons, and others. Each names precisely what to fix.

Credential problems (401 / 403)

All of these are covered in Authentication. protected_file is separate: it means a write targeted a file the platform manages, which your integration isn’t allowed to edit.

Conflicts (409)

The last two are explained in Idempotency.
outside_24h_window is the single most common surprise for new integrations. WhatsApp only lets you send free-form messages inside a 24-hour window that opens when the customer messages you. Outside it, an approved template is the only thing that goes through. See Templates.

Too many requests (429)

Both carry Retry-After. They’re genuinely different problems — see Rate limits.

Upstream and server (5xx)

You’ll also see some codes in SCREAMING_SNAKE_CASEPROJECT_NOT_FOUND, SEGMENT_NOT_FOUND, MEDIA_EXPIRED, BROADCAST_NOT_FOUND and similar. They come from the shared capability layer that the AI agent tools use too, and they behave exactly like any other code. Match on them the same way.

Retrying

Before you retry a POST /v1/messages that timed out or 5xx’d, read Idempotency. Without an Idempotency-Key, a retry can send the same WhatsApp message to a customer twice.