Skip to main content
POST
Escape hatch: forward a raw Meta Graph API body to /{phone_number_id}/messages
Forwards body as-is to Meta’s /{phone_number_id}/messages. Keebai adds the access token and the routing, and validates nothing inside body.
This is the escape hatch, not a shortcut. Every other endpoint on this page validates your payload, maps errors, and stays stable across Meta API versions. raw does none of that: if Meta changes its schema, your integration breaks with no warning from us.
Reach for it only when Meta ships a message type Keebai has not exposed yet — and tell us, so we can add a typed endpoint.

Endpoint

Required scope

messages:send

Headers

Body

Example request

Response

202 Accepted

400 Bad Request

body missing or not an object, or an unknown top-level property. Nothing inside body is validated — a malformed Meta payload surfaces as a 502 instead.

401 Unauthorized

Missing, invalid, revoked, or expired token.

403 Forbidden

The token does not have the messages:send scope.

502 Bad Gateway

Meta rejected the payload. The upstream error message is passed through, so read it carefully — it is your only debugging signal here.

Operational notes

  • to inside body has no +. Meta’s raw format wants 5491155555555; every typed Keebai endpoint wants +5491155555555. Mixing the two conventions is the most common mistake with this endpoint.
  • messaging_product: "whatsapp" is mandatory in the raw body. Meta rejects the call without it.
  • You still get Keebai’s persistence: the message is stored against the conversation and reported through webhooks like any other, so meta_data still works for correlation.

Authorizations

Authorization
string
header
required

Personal Access Token con prefijo kbai_pk_. Generar desde el portal con permiso developer.manage_tokens.

Body

application/json
body
object
required

Raw Meta Graph API messages body. Sent as-is to /{phone_number_id}/messages. Use only when POST /v1/messages has no matching type.

channel_id
string

Keebai channel id. Optional when the tenant has exactly one active channel of the given type; required to disambiguate otherwise.

Example:

"665f1a2b3c4d5e6f70819234"

phone_number_id
string

WhatsApp-only alias for channel_id: the Meta phone_number_id of the sending number. Ignored on other channels.

Example:

"100000000000001"

meta_data
object

Free-form metadata persisted with the message. Returned on webhooks for correlation.

Response

202 - application/json
message_id
string
required

Meta message_id (wamid.*) of the sent WhatsApp message.

status
string
required
Example:

"sent"

sent_at
string
required

ISO-8601 timestamp of the dispatch.