Developer reference

WBIZ.IN API

Build third-party WhatsApp integrations on top of WBIZ. Send messages, templates and (soon) read inbox state from your own backend with a Bearer API key. v1 is stable — backward-incompatible changes ship as a new version, never as a break to existing routes.

Quick start

Three steps to your first WhatsApp send.

  1. 1

    Issue an API key

    Sign in and head to Settings → API keys. Create a key for your integration. The secret is shown once — store it securely.

  2. 2

    Set the base URL + auth header

    All requests go to and must include .

  3. 3

    Make your first call

    Send a freeform text inside the active 24-hour window, or a template message any time. Responses return a Meta wamid you can correlate with delivery webhooks.

Authentication

Every request must include a Bearer API key in the Authorization header. Each key is scoped per WhatsApp Business Account, so an integration only sees the WABA you bind it to.

curl https://api.wbiz.in/v1/messages/text \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json"
messages:sendactive

Send text, template, media, interactive and location messages on the bound WABA.

templates:readactive

List approved templates with their components and variables.

contacts:readactive

Read contacts in the workspace, by id or filtered list.

contacts:writeactive

Create and update contacts. Idempotent on phone number.

inbox:readactive

List conversations and read message history per thread.

webhooks:manageplanned

Configure outbound delivery / status webhooks programmatically.

Rate limits

Each API key is rate-limited per minute. Limits scale with your plan. Every response includes the standard rate-limit headers so you can back off cleanly.

PlanRequests / minuteBurst (10s window)
Starter6015
Growth600120
Scale6 0001 200
X-RateLimit-Limit

Max requests in the current window.

X-RateLimit-Remaining

Requests left in the current window.

X-RateLimit-Reset

Unix timestamp when the window resets.

Hitting the cap returns HTTP 429 with Retry-After in seconds. Build exponential back-off into your client.

Resource

Messages

Programmatically send WhatsApp messages from your backend. All endpoints are scoped to the WABA your API key is bound to.

Send a text message

Send a freeform text message inside the active 24-hour service window. Use for support replies after the customer has messaged you. For first-touch outreach, use the template endpoint.

POSThttps://api.wbiz.in/v1/messages/text
API key — Bearer tokenscope: messages:send
24-hour window only. WhatsApp lets you send freeform text only when the contact has messaged you within the last 24 hours. To re-engage outside the window, use POST /v1/messages/template instead.

Request body

  • tostringRequired

    Recipient phone number in E.164 format. Must be WhatsApp-registered.

    min 8, max 20 charsExample: +919812345678
  • bodystringRequired

    The text body of the message. URLs auto-link in the WhatsApp client. Use \n for line breaks.

    min 1, max 4096 charsExample: Your order #4827 has shipped!
  • phoneNumberIdstringOptional

    Pin the send to a specific phone number on your WABA. Required if your WABA has more than one phone — otherwise the first phone is used.

    Example: 107394529103847

Request example

curl -X POST https://api.wbiz.in/v1/messages/text \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919812345678",
    "body": "Hi! Your order #4827 has shipped.",
    "phoneNumberId": "107394529103847"
  }'

Response — 200 OK

{
  "wamid": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAERgSQjg5RTk0NDM2NjE2RDM3RkU0AA=="
}

Errors

  • 400VALIDATION_FAILED

    Body failed validation — invalid E.164, body over 4096 chars, or missing required field.

  • 400OUTSIDE_24H_WINDOW

    Recipient hasn’t messaged you in the last 24 hours. Use a template message.

  • 401INVALID_API_KEY

    Missing, malformed, or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key is valid but lacks the messages:send scope.

  • 404PHONE_NOT_FOUND

    phoneNumberId does not belong to the WABA tied to this API key.

  • 429RATE_LIMITED

    Plan rate limit exceeded. Retry after X-RateLimit-Reset.

  • 502META_UPSTREAM_ERROR

    Meta’s Cloud API rejected the send. Body includes the upstream error code.

Send a template message

Send an approved WhatsApp template. Works any time — including outside the 24-hour service window — and supports body variables, header media, buttons and Flow attachments.

POSThttps://api.wbiz.in/v1/messages/template
API key — Bearer tokenscope: messages:send
Templates must be Meta-approved. Drafts and rejected templates won’t send. Submit + monitor approval from /app/templates.

Request body

  • tostringRequired

    Recipient phone number in E.164 format.

    min 8, max 20 charsExample: +919812345678
  • templatestringRequired

    Name (slug) of the approved template. Must already be Meta-approved on the WABA tied to this API key.

    max 120 charsExample: order_shipped_v2
  • languagestringRequired

    Locale code (en, en_US, hi_IN, …). Must match the language Meta approved the template in.

    max 8 charsExample: en_US
  • variablesstring[]Optional

    Positional substitutions for {{1}}, {{2}}, … placeholders in the template body. Pass them in order.

    Example: ["Aarav", "4827", "tomorrow"]
  • phoneNumberIdstringOptional

    Pin the send to a specific phone number on your WABA.

    Example: 107394529103847
  • componentsobject[]Optional

    Pre-built Meta-shaped components array. Use this when positional variables are not enough — header media, named variables, buttons with URL parameters, Flow attachments.

  • flowAction"navigate" | "data_exchange"Optional

    Action verb for templates that include a Flow button. "navigate" jumps to a static screen; "data_exchange" calls your encrypted Flow data endpoint.

Request example

curl -X POST https://api.wbiz.in/v1/messages/template \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919812345678",
    "template": "order_shipped_v2",
    "language": "en_US",
    "variables": ["Aarav", "4827", "tomorrow"],
    "phoneNumberId": "107394529103847"
  }'

Response — 200 OK

{
  "wamid": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAERgSQjg5RTk0NDM2NjE2RDM3RkU0AA=="
}

Errors

  • 400VALIDATION_FAILED

    Body failed validation — invalid E.164, missing template name, unsupported language.

  • 400TEMPLATE_NOT_APPROVED

    Template exists but is in Draft / Pending / Rejected. Only APPROVED templates send.

  • 400TEMPLATE_LANGUAGE_MISMATCH

    Language does not match Meta’s approved locale for this template.

  • 400TEMPLATE_VARIABLE_COUNT_MISMATCH

    Number of variables does not match the {{1}}…{{n}} placeholders.

  • 401INVALID_API_KEY

    Missing, malformed, or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key is valid but lacks the messages:send scope.

  • 404TEMPLATE_NOT_FOUND

    No template with that name exists on the WABA tied to this API key.

  • 404PHONE_NOT_FOUND

    phoneNumberId does not belong to the WABA tied to this API key.

  • 429RATE_LIMITED

    Plan rate limit exceeded. Retry after X-RateLimit-Reset.

  • 502META_UPSTREAM_ERROR

    Meta’s Cloud API rejected the send. Body includes the upstream error code.

Send a media message

Send an image, video, document, audio or sticker. Provide the media either by Meta-hosted media handle (mediaId) or by HTTPS URL (link) — exactly one of the two is required.

POSThttps://api.wbiz.in/v1/messages/media
API key — Bearer tokenscope: messages:send
XOR rule. Pass mediaId OR link, never both. The link variant must be HTTPS, publicly fetchable by Meta, and within Meta’s per-type size limits.

Request body

  • tostringRequired

    Recipient in E.164 format.

    min 8, max 20 charsExample: +919812345678
  • type"image" | "video" | "document" | "audio" | "sticker"Required

    Media type. Determines which Meta size + format limits apply.

    Example: image
  • mediaIdstringOptional

    Meta media handle from a prior upload (preferred — survives multiple sends).

    Example: 1042817329043...
  • linkstringOptional

    Public HTTPS URL Meta will fetch the media from. Used when mediaId is absent.

    Example: https://cdn.example.com/invoice.pdf
  • captionstringOptional

    Optional caption — supported on image / video / document.

    Example: Your invoice for April.
  • filenamestringOptional

    Override the displayed filename (document only).

    Example: invoice-april.pdf
  • phoneNumberIdstringOptional

    Pin the send to a specific phone number on your WABA.

Request example

curl -X POST https://api.wbiz.in/v1/messages/media \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919812345678",
    "type": "image",
    "link": "https://cdn.example.com/promo.jpg",
    "caption": "Spring sale starts now!"
  }'

Response — 200 OK

{ "wamid": "wamid.HBgM..." }

Errors

  • 400VALIDATION_FAILED

    Body failed validation — invalid E.164, unsupported type, both/neither of mediaId+link supplied.

  • 400MEDIA_FETCH_FAILED

    Meta could not fetch the link URL — non-HTTPS, 404, blocked content-type, or > size limit for the type.

  • 400OUTSIDE_24H_WINDOW

    Recipient hasn’t messaged you in 24h. Use a media template instead.

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the messages:send scope.

  • 404PHONE_NOT_FOUND

    phoneNumberId does not belong to the bound WABA.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

  • 502META_UPSTREAM_ERROR

    Meta rejected the send — body includes the upstream Meta error.

Send an interactive message

Send reply buttons (up to 3) or a list menu (up to 10 sections × 10 rows). The recipient taps a choice and the response arrives on your inbound webhook tied to the same conversation.

POSThttps://api.wbiz.in/v1/messages/interactive
API key — Bearer tokenscope: messages:send
List trigger label is fixed. When kind=list, the WhatsApp button that opens the menu is labelled “Choose” and is not customisable through the v1 API. If you need a custom label, send the same payload as a template instead.

Request body

  • tostringRequired

    Recipient in E.164 format.

    Example: +919812345678
  • kind"buttons" | "list"Required

    Which interactive variant to render.

    Example: buttons
  • bodystringRequired

    Main body text shown above the buttons / list.

    max 1024 chars
  • headerTextstringOptional

    Optional header text rendered above the body.

    max 60 chars
  • footerstringOptional

    Optional footer rendered below the buttons.

    max 60 chars
  • buttonsArray<{id, title}>Optional

    Required when kind=buttons. Up to 3 reply buttons.

    Example: [{"id":"yes","title":"Yes"},{"id":"no","title":"No"}]
  • listSectionsArray<{title, rows: Array<{id, title, description?}>}>Optional

    Required when kind=list. Up to 10 sections, each with up to 10 rows.

  • phoneNumberIdstringOptional

    Pin to a specific phone number.

Request example

# Reply buttons
curl -X POST https://api.wbiz.in/v1/messages/interactive \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919812345678",
    "kind": "buttons",
    "body": "Did your order arrive in good condition?",
    "buttons": [
      { "id": "yes", "title": "Yes, all good" },
      { "id": "no",  "title": "Report an issue" }
    ]
  }'

Response — 200 OK

{ "wamid": "wamid.HBgM..." }

Errors

  • 400VALIDATION_FAILED

    Invalid kind, buttons > 3, listSections > 10, or rows > 10 per section.

  • 400INTERACTIVE_LIMITS

    Title text exceeds 20 chars or button id exceeds 256 chars (Meta limits).

  • 400OUTSIDE_24H_WINDOW

    Interactive messages must be inside the 24h window.

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the messages:send scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

  • 502META_UPSTREAM_ERROR

    Meta rejected the send.

Send a location pin

Send a tappable location pin to the recipient — useful for store directions, delivery rendezvous points or service areas.

POSThttps://api.wbiz.in/v1/messages/location
API key — Bearer tokenscope: messages:send

Request body

  • tostringRequired

    Recipient in E.164 format.

    Example: +919812345678
  • latitudenumberRequired

    Decimal degrees, between -90 and 90.

    Example: 12.9716
  • longitudenumberRequired

    Decimal degrees, between -180 and 180.

    Example: 77.5946
  • namestringOptional

    Display name shown above the pin (e.g. business name).

    Example: WBIZ HQ
  • addressstringOptional

    Full address shown below the name.

    Example: Indiranagar, Bengaluru 560038
  • phoneNumberIdstringOptional

    Pin to a specific phone number.

Request example

curl -X POST https://api.wbiz.in/v1/messages/location \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919812345678",
    "latitude": 12.9716,
    "longitude": 77.5946,
    "name": "WBIZ HQ",
    "address": "Indiranagar, Bengaluru 560038"
  }'

Response — 200 OK

{ "wamid": "wamid.HBgM..." }

Errors

  • 400VALIDATION_FAILED

    latitude/longitude out of range, or invalid E.164.

  • 400OUTSIDE_24H_WINDOW

    Location messages require the 24h window.

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the messages:send scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

  • 502META_UPSTREAM_ERROR

    Meta rejected the send.

Resource

Templates

Read approved WhatsApp templates so your integration knows what it can send. The template body, variables and language come from Meta — your code mirrors that contract.

List templates

Cursor-paginated list of templates on the WABA bound to your API key. Filter by approval status, category or language.

GEThttps://api.wbiz.in/v1/templates
API key — Bearer tokenscope: templates:read

Query parameters

  • status"approved" | "pending" | "rejected"Optional

    Filter by Meta-approval state. Default returns all.

  • categorystringOptional

    Filter by template category (utility, marketing, authentication).

  • languagestringOptional

    Locale code filter — exact match on Meta-approved language.

    Example: en_US
  • limitnumberOptional

    Page size. Default 25, max 100.

  • cursorstringOptional

    Cursor returned by the previous page (template id).

Request example

curl -G https://api.wbiz.in/v1/templates \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  --data-urlencode "status=approved" \
  --data-urlencode "language=en_US" \
  --data-urlencode "limit=25"

Response — 200 OK

{
  "data": [
    {
      "name": "order_shipped_v2",
      "language": "en_US",
      "category": "UTILITY",
      "status": "APPROVED",
      "components": [
        { "type": "BODY", "text": "Hi {{1}}! Order #{{2}} ships {{3}}." }
      ]
    }
  ],
  "nextCursor": "65fc2e1b9a8b..."
}

Errors

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the templates:read scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

Resource

Contacts

Manage the contacts your WhatsApp campaigns can reach. Create, list, fetch and update — including custom fields, tags and opt-in state.

List contacts

Cursor-paginated contact list with optional search, tag and opt-in filters.

GEThttps://api.wbiz.in/v1/contacts
API key — Bearer tokenscope: contacts:read

Query parameters

  • searchstringOptional

    Search by name or phone (substring).

  • tagstringOptional

    Filter to contacts tagged with this label.

  • optedInbooleanOptional

    Filter by opt-in state. Omit to include both.

  • limitnumberOptional

    Page size. Default 25, max 100.

  • cursorstringOptional

    Cursor returned by the previous page (last contact id).

Request example

curl -G https://api.wbiz.in/v1/contacts \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  --data-urlencode "tag=vip" \
  --data-urlencode "optedIn=true" \
  --data-urlencode "limit=50"

Response — 200 OK

{
  "data": [
    {
      "id": "65fc2e1b9a8b1c...",
      "phone": "+919812345678",
      "name": "Aarav Sharma",
      "email": "aarav@example.com",
      "tags": ["vip", "delhi"],
      "customFields": { "city": "Delhi", "tier": "gold" },
      "optedIn": true,
      "createdAt": "2026-04-12T08:32:11.420Z"
    }
  ],
  "nextCursor": "65fc2e1b9a8b..."
}

Errors

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the contacts:read scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

Create a contact

Create a contact — or, on phone collision, return the existing contact (idempotent upsert by phone).

POSThttps://api.wbiz.in/v1/contacts
API key — Bearer tokenscope: contacts:write
Idempotent. If a contact with the same phone already exists in the workspace, the existing row is returned with HTTP 200 — no error, no overwrite. Use PATCH /v1/contacts/:id to update fields after.

Request body

  • phonestringRequired

    E.164 phone number — primary identifier.

    Example: +919812345678
  • namestringOptional

    Display name.

    Example: Aarav Sharma
  • emailstringOptional

    Email address — must be a valid email format if provided.

  • tagsstring[]Optional

    Initial tags. Tags are created on the fly if they don’t exist.

    Example: ["vip","delhi"]
  • customFieldsRecord<string, string>Optional

    Free-form key/value metadata. Both key and value are strings.

    Example: {"city":"Delhi","tier":"gold"}
  • optedInbooleanOptional

    Marketing opt-in state. Defaults to true on create.

Request example

curl -X POST https://api.wbiz.in/v1/contacts \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+919812345678",
    "name": "Aarav Sharma",
    "email": "aarav@example.com",
    "tags": ["vip","delhi"],
    "customFields": { "city": "Delhi", "tier": "gold" },
    "optedIn": true
  }'

Response — 200 OK

{
  "id": "65fc2e1b9a8b1c...",
  "phone": "+919812345678",
  "name": "Aarav Sharma",
  "email": "aarav@example.com",
  "tags": ["vip", "delhi"],
  "customFields": { "city": "Delhi", "tier": "gold" },
  "optedIn": true,
  "createdAt": "2026-04-28T17:42:12.108Z"
}

Errors

  • 400VALIDATION_FAILED

    Phone failed E.164 validation, or email failed format check.

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the contacts:write scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

Get a contact

Fetch one contact by id. Cross-WABA contact ids return 404 (not 403) so probing for foreign ids leaks nothing.

GEThttps://api.wbiz.in/v1/contacts/:id
API key — Bearer tokenscope: contacts:read

Path parameters

  • idstring

    Contact id from list / create.

    Example: 65fc2e1b9a8b1c...

Request example

curl https://api.wbiz.in/v1/contacts/65fc2e1b9a8b1c... \
  -H "Authorization: Bearer wbiz_live_xxx..."

Response — 200 OK

{
  "id": "65fc2e1b9a8b1c...",
  "phone": "+919812345678",
  "name": "Aarav Sharma",
  "email": "aarav@example.com",
  "tags": ["vip"],
  "customFields": { "city": "Delhi" },
  "optedIn": true,
  "createdAt": "2026-04-12T08:32:11.420Z"
}

Errors

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the contacts:read scope.

  • 404NOT_FOUND

    Contact does not exist OR belongs to a different WABA.

Update a contact

Partial update — supply only the fields you want to change. Tags fully replace the current set; customFields shallow-merge.

PATCHhttps://api.wbiz.in/v1/contacts/:id
API key — Bearer tokenscope: contacts:write

Path parameters

  • idstring

    Contact id.

    Example: 65fc2e1b9a8b1c...

Request body

  • namestringOptional

    New display name.

  • emailstringOptional

    New email address.

  • tagsstring[]Optional

    Replaces the contact’s tag set entirely.

    Example: ["vip","gold"]
  • customFieldsRecord<string, string>Optional

    Shallow-merged into the existing custom fields.

  • optedInbooleanOptional

    Update marketing opt-in state.

Request example

curl -X PATCH https://api.wbiz.in/v1/contacts/65fc2e1b9a8b1c... \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "tags": ["vip","gold"],
    "customFields": { "tier": "platinum" }
  }'

Response — 200 OK

{
  "id": "65fc2e1b9a8b1c...",
  "phone": "+919812345678",
  "name": "Aarav Sharma",
  "tags": ["vip", "gold"],
  "customFields": { "city": "Delhi", "tier": "platinum" },
  "optedIn": true
}

Errors

  • 400VALIDATION_FAILED

    Field type mismatch or invalid email format.

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the contacts:write scope.

  • 404NOT_FOUND

    Contact does not exist OR belongs to a different WABA.

Resource

Conversations & messages

Read inbox state. Use this to surface ongoing chats inside your CRM, or to backfill message history for analytics.

List conversations

Cursor-paginated conversation list. Cursor is the lastMessageAt ISO timestamp of the last item — pass it as the next-page boundary.

GEThttps://api.wbiz.in/v1/conversations
API key — Bearer tokenscope: inbox:read

Query parameters

  • status"open" | "closed"Optional

    Filter by conversation status.

  • channel"whatsapp" | "messenger" | "instagram"Optional

    Filter by channel.

  • limitnumberOptional

    Page size. Default 25, max 100.

  • cursorstring (ISO date)Optional

    lastMessageAt of the last conversation on the previous page.

Request example

curl -G https://api.wbiz.in/v1/conversations \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  --data-urlencode "status=open" \
  --data-urlencode "channel=whatsapp" \
  --data-urlencode "limit=25"

Response — 200 OK

{
  "data": [
    {
      "id": "65fc2e1b9a8b1c...",
      "contact": {
        "phone": "+919812345678",
        "name": "Aarav Sharma"
      },
      "channel": "whatsapp",
      "status": "open",
      "lastMessageAt": "2026-04-28T17:42:12.108Z",
      "unreadCount": 2
    }
  ],
  "nextCursor": "2026-04-28T17:42:12.108Z"
}

Errors

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the inbox:read scope.

  • 429RATE_LIMITED

    Plan rate limit exceeded.

List messages in a conversation

Paginated message history for a single conversation. Pagination uses beforeId — pass the id of the oldest message you have to get older messages.

GEThttps://api.wbiz.in/v1/conversations/:id/messages
API key — Bearer tokenscope: inbox:read

Path parameters

  • idstring

    Conversation id.

Query parameters

  • limitnumberOptional

    Page size. Default 50, max 200.

  • beforeIdstringOptional

    Message id — fetches messages strictly older than this one.

Request example

curl -G https://api.wbiz.in/v1/conversations/65fc2e1b9a8b/messages \
  -H "Authorization: Bearer wbiz_live_xxx..." \
  --data-urlencode "limit=50"

Response — 200 OK

{
  "data": [
    {
      "wamid": "wamid.HBgM...",
      "direction": "inbound",
      "kind": "text",
      "body": "Has my order shipped?",
      "createdAt": "2026-04-28T17:38:01.220Z",
      "status": "delivered"
    },
    {
      "wamid": "wamid.HBgM...",
      "direction": "outbound",
      "kind": "template",
      "body": "Hi Aarav! Your order #4827 has shipped.",
      "createdAt": "2026-04-28T17:42:12.108Z",
      "status": "read"
    }
  ],
  "nextCursor": "65fc2e1b9a8b1c..."
}

Errors

  • 401INVALID_API_KEY

    Missing, malformed or revoked API key.

  • 403INSUFFICIENT_SCOPE

    API key lacks the inbox:read scope.

  • 404NOT_FOUND

    Conversation does not exist OR belongs to a different WABA.

Delivery webhooks

Every send returns a wamid. Delivery, read and reply events arrive on the same wamid through your configured webhook so you can correlate them with the original request.

Programmatic webhook configuration via the API ships in v1.1 alongside the webhooks:manage scope. Until then, configure delivery webhooks from /app/channels.

Need help?

Real engineers reply.

Stuck on a Meta error code, modelling a complex template, or looking for an SDK in your favourite language? Drop us a note — every API question routes to a real engineer, average reply under 4 business hours.