Overview
Use Meta’s WhatsApp Cloud API through Kapso. The proxy forwards Graph requests to Meta and handles auth, while also exposing additional read endpoints for stored conversations, messages, contacts, and calls. Responses use the same Graph style (camelCase in the SDK, snake_case on the wire) and support cursor pagination.Authentication
Two options:Option 1: Bearer token
Use the WhatsApp configuration’s access token:Option 2: Project API key
Use your Kapso project API key:X-API-Key authentication, the WhatsApp configuration is determined from the IDs in your request URL:
- Endpoints with
phone_number_id→ resolves config by phone number ID - Endpoints with
business_account_id→ resolves config by business account ID - Media endpoints with
media_id→ requiresphone_number_idas query parameter
Base URL
Supported endpoints
Meta passthrough (same as Graph)
/{phone_number_id}/messagessend messages/{phone_number_id}/settingsmanage settings/{phone_number_id}/flowsWhatsApp Flows/{phone_number_id}/mediaupload media/{phone_number_id}/whatsapp_business_profilebusiness profile/{business_account_id}/message_templatesmanage templates/{media_id}fetch or delete media (requiresphone_number_idas a query when using Kapso)
Kapso stored-data endpoints
GET /{phone_number_id}/messageslist stored message historyGET /{phone_number_id}/conversationslist conversationsGET /conversations/{conversation_id}get a single conversationPATCH /conversations/{conversation_id}update statusGET /{phone_number_id}/contactslist contactsGET /{phone_number_id}/contacts/{wa_id}get a contact by WA IDPATCH /{phone_number_id}/contacts/{wa_id}update a contactGET /{phone_number_id}/callslist stored calling events
{ data, paging } with Graph-style cursors.
Pagination
List endpoints use cursor pagination. Query parameters:limitnumber of items to return (1 to 100, default 20)aftercursor returned by a previous pagebeforecursor returned by a subsequent page
Filters (examples)
Messages historyGET /{phone_number_id}/messages:
directioninbound or outboundstatusmessage status filtersinceISO timestampuntilISO timestampconversation_idfilter by conversation
GET /{phone_number_id}/conversations:
statusactive or endedlast_active_sinceISO timestamplast_active_untilISO timestampphone_numberE.164 customer number
GET /{phone_number_id}/calls:
directionINBOUND or OUTBOUNDstatuscall statuscall_idfilter a single call
Kapso field selector
You can opt into Kapso-only fields using thefields parameter:
fields=kapso()omit the Kapso block entirelyfields=kapso(flow_response,flow_token)include only specific fieldsfields=kapso(default)include the default set (also acceptskapso(*)orkapso(all))
Media note
When using the Kapso proxy, fetching or deleting media by/{media_id} requires a phone_number_id query parameter to route the request to the correct configuration. The SDK adds this automatically.

