Download OpenAPI specification:Download
1MSG.IO is the perfect WhatsApp management tool for your business. With us you get full access to the official Whatsapp API/webhooks.
Every API request must contain an Authorize HTTP header with a token. This is your channel token, which can be found in your channel project on your profile page. Please do not give the token to anyone or post it publicly.
The authorization token must be added to each request in the GET parameter 'token' and always passed to query string (?token={jwtToken}). Parameters in GET queries pass query string. Parameters in POST requests — through the JSON-encoded request body.
All 'send' methods (except /sendTemplate) will only work when the dialog session with the user is open. Some of our solutions simplify and avoid such limitations, but we urge you to pay more attention to this detail
Updates from 20 May (all changes are relevant for Cloud API version:
Use this edge to retrieve your profile's About info
{- "about": "Some about info",
- "address": "Neverland, Unexpected st.",
- "description": "Some company description",
- "email": "john@neverland.play",
- "phone": "12020721369",
- "vertical": "Other",
}Get channel usage extended statistics
[- {
- "business_initiated_paid_quantity": 1,
- "business_initiated_price": 0.0691,
- "business_initiated_quantity": 2,
- "free_entry_point": 0,
- "free_quantity": 1,
- "free_tier": 1,
- "paid_quantity": 1,
- "period_date": "2022-11-01T00:00:00Z",
- "quantity": 2,
- "total_price": 0.0691,
- "user_initiated_paid_quantity": 1,
- "user_initiated_price": 0.0691,
- "user_initiated_quantity": 2
}
]Returns whether Marketing Messages Lite (MM Lite) is available for the channel and the current status.
curl -X GET 'https://api.1msg.io/{instanceId}/mmLiteStatus?token=TOKEN'
{- "available": true,
- "status": "string",
- "message": "string"
}Get WhatsApp conversational components (welcome message, prompts, commands). Proxies GET /conversational_automation.
When enable_welcome_message is true and a user opens chat for the first time, Meta delivers a webhook message with type: request_welcome. The inbound formatter exposes that as type: "request_welcome" and meta.request_welcome: true so your webhook can send a custom welcome reply.
{- "enable_welcome_message": true,
- "prompts": [
- "How can I help?"
], - "commands": [
- {
- "command_name": "help",
- "command_description": "Get support options"
}
]
}Update conversational components. Allowed fields: enable_welcome_message (boolean), prompts (string[]), commands ({command_name, command_description}[]).
| enable_welcome_message | boolean Enable automatic welcome message |
| prompts | Array of strings <= 4 items [ items <= 80 characters ] Ice-breaker prompts (max 4) |
Array of objects | |
| property name* additional property | any |
{- "enable_welcome_message": true,
- "prompts": [
- "How can I help?"
], - "commands": [
- {
- "command_name": "help",
- "command_description": "Get support options"
}
]
}{ }Configure the client webhook URL for inbound events.
WhatsApp Calling events (field=calls) are forwarded as passthrough
payloads with type: "calls" and instanceId (connect / status / terminate).
Call permission replies arrive on the normal messages path
(call_permission_reply). Details: Calling tag.
| webhookUrl | string |
| property name* additional property | any |
{ }{ }{- "instanceId": "BAL618731623",
- "messages": [
- {
- "id": "ABGHYoIXMAmY13IKOick9az6QYmt4R",
- "body": "Ok!",
- "fromMe": true,
- "self": 0,
- "isForwarded": false,
- "author": "12020721369@c.us",
- "authorBsuid": "RU.1504711984690866",
- "authorUserName": null,
- "time": 1665396610,
- "chatId": "12020721369@c.us",
- "type": "chat",
- "senderName": "John",
- "caption": "photo.jpg",
- "quotedMsgId": "ABGHYoIXMAmYTwIKOick9az6QYmt4R",
- "action": { },
- "list_reply": { },
- "button_reply": { },
- "flow_reply": { },
- "meta": {
- "referral": {
- "ctwa_clid": "CTWA_CLID",
- "source_url": "AD_OR_POST_FB_URL",
- "source_id": "ADID",
- "source_type": "ad",
- "headline": "AD_TITLE",
- "body": "AD_DESCRIPTION",
- "media_type": "image",
- "image_url": "RAW_IMAGE_URL",
- "video_url": "RAW_VIDEO_URL",
- "thumbnail_url": "RAW_THUMBNAIL_URL"
}
}, - "interactive": {
- "type": "nfm_reply",
- "list_reply": { },
- "button_reply": { },
- "nfm_reply": {
- "name": "flow",
- "response_json": { }
}
}
}
]
}| messageId required | string Example: messageId=0XzkmGNn4prUAQlzsHApGNRXQ0U Message ID. Example: 0XzkmGNn4prUAQlzsHApGNRXQ0U |
{- "hooks": [
- {
- "id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
- "type": "message",
- "status": "sent",
- "pricing": {
- "billable": true,
- "category": "business_initiated",
- "pricing_model": "CBP"
}, - "timestamp": "1654864094",
- "conversation": {
- "id": "c1f5a3a1b9ff6f2e1c43fd31543137e0",
- "origin": {
- "type": "business_initiated"
}, - "expiration_timestamp": 1654943940
}, - "recipient_id": "556123122026"
}
]
}This part of the documentation describes how to send and receive messages using the WhatsApp Business API
Send Interactive List Message to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| body required | string Main message text |
| header | string Header will be located above message text |
| footer | string Footer will be placed under message text |
| action required | string Action for open list |
required | Array of objects Up to 10 sections from which the client can choose. Each section is object with fields: title - Title of section, up to 24 symbols. Required if there are more then 1 section rows - available options. Required Each option is object with fields: id - Unique id for option, up to 200 symbols. Required title - Title of option, up to 24 symbols. Required description - Description of option, up to 72 symbols Example: [{"title":"Section 1","rows":[{"id":"1","title":"Option 1","description":"Description 1"}]},{"title":"Section 2","rows":[{"id":"2","title":"Option 2","description":"Description 2"}]}] |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send Interactive Reply Buttons Message to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| body required | string Main message text |
object or object or object or object | |
| footer | string Footer will be placed under message text |
required | Array of objects Up to 3 sections inclusive. Each section is an object with a fields: type - always "reply" Required reply – reply button objects Required Each button response is an object with fields: id - a unique identifier of the button, up to 200 characters. Required title — Button title, up to 20 characters. Required Example: "sections": [{"type": "reply","reply": {"id ": "1","title": "1 Button's Title"}},{"type": "reply", "reply": {"id": "2", "title": "2 Button's Title"}}] |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send Interactive Location Request Message to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| body required | string Message text, UTF-8 or UTF-16 string with emoji 🍏. Can be used with mentionedPhones, example: this text for @556123122026 |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send Interactive WhatsApp Flow message to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
Use this method to send a published WhatsApp Flow as a service (interactive) message. If the 24-hour window is closed, send a template with a FLOW button via /sendTemplate.
| body required | string Flow message body text |
string or object Flow header (string or text header object) | |
| footer | string Footer text |
| flowId required | string Published Flow ID |
| flowToken required | string Flow token generated by the business |
| flowCta required | string CTA button text |
| flowAction | string Enum: "navigate" "data_exchange" Flow action type |
object Required for flowAction=navigate (screen is required). Ignored for data_exchange. If data is provided, it must be a non-empty object. | |
| flowMessageVersion | string Flow message version (default "3") |
| mode | string Enum: "draft" "published" Flow mode (draft or published). If omitted, provider default applies |
object Shortcut for flowActionPayload.data (optional) | |
| flowActionScreen | string Shortcut for flowActionPayload.screen (optional) |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a reaction (emoji) to a specific message in an existing chat. Use a single emoji character to add/update reaction, or an empty string to remove reaction. Provide one destination parameter: chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately. Reference the target message via quotedMsgId.
| body required | string One emoji to add/update or empty string to remove |
| quotedMsgId required | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
body=%F0%9F%91%8D"edMsgId=wamid.HBgLdemo-text-001&chatId=12020721369%40c.us
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a file to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
Two modes:
body + filename (legacy).mediaId from /uploadMedia together with mediaType (image|video|audio|document). Do not send body and mediaId together.For a native WhatsApp voice note, send audio (preferably OGG/OPUS) with voice: true (works with URL/base64 or mediaId + mediaType=audio).
Stickers: use /sendSticker instead of /sendFile.
| body | string File source when not using mediaId:
Required together with |
| filename | string File name with extension, e.g. 1.jpg or hello.xlsx. Required with |
| caption | string Text under the file. When sending an image сan be used with mentionedPhones, example: this image for @556123122026 |
| mediaId | string Numeric WABA media id from |
| mediaType | string Enum: "image" "video" "audio" "document" Required when using |
| voice | boolean Default: false If true and the media is audio, send as a native WhatsApp voice note. Prefer OGG/OPUS. Works with URL/base64 or mediaId + mediaType= |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a WhatsApp sticker to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
Provide exactly one of:
mediaId — numeric WABA media id from /uploadMedia (webp sticker)link — public HTTPS URL to a webp stickerDo not use /sendFile for stickers.
| mediaId | string Numeric WABA media id from |
| link | string Public HTTPS URL to a webp sticker. Mutually exclusive with |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send an interactive message with a single Call-To-Action URL button. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
Required: body, displayText (button label), url (must be https://). Optional: header (same object shape as /sendButton), footer, quotedMsgId.
Outside the 24-hour customer service window use a template instead.
| body required | string Main message text |
| displayText required | string CTA button label |
| url required | string Button URL (must use https://) |
| footer | string Optional footer text |
object or object or object or object | |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a message to an existing chat. (Only if the dialogue has an Open Session). The message will be added to the queue for sending and delivered even if the phone is disconnected from the Internet or authorization is not passed.
Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| body required | string Message text, UTF-8 or UTF-16 string with emoji 🍏. Can be used with mentionedPhones, example: this text for @556123122026 |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a location to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| lat required | string Latitude of the location. Example: 45.018337 |
| lng required | string Longitude of the location. Example: -73.968285 |
| address | string Address of the location. Only displayed if name is present. Example: 9766 Valley View St., New York, NY 10024 |
| name | string Name of the location. Example: Facebook HQ |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a contact to an existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
| contacts | Array of objects Array containing contact objects. Contact object parameters: name - full contact name. Required. Object with properties:
birthday - YYYY-MM-DD formatted string. Example: 2012-08-18 addresses - array containing address objects with parameters:
emails - array containing email objects with parameters:
org - object containing parameters:
phones - array containing phone objects with parameters:
urls - array containing url objects with parameters:
Example: [{"addresses":[{"city":"Menlo Park","country":"United States","country_code":"us","state":"CA","street":"1 Hacker Way","type":"HOME","zip":"94025"},{"city":"Menlo Park","country":"United States","country_code":"us","state":"CA","street":"200 Jefferson Dr","type":"WORK","zip":"94025"}],"birthday":"2012-08-18","emails":[{"email":"test@fb.com","type":"WORK"},{"email":"test@whatsapp.com","type":"WORK"}],"name":{"first_name":"John","formatted_name":"John Smith","last_name":"Smith"},"org":{"company":"WhatsApp","department":"Design","title":"Manager"},"phones":[{"phone":"+1 (940) 555-1234","type":"HOME"},{"phone":"+1 (650) 555-1234","type":"WORK","wa_id":"16505551234"}],"urls":[{"url":"https://www.facebook.com","type":"WORK"}]}] |
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}You can send product cards via Carousel in two ways:
Template messages: do not require a 24-hour customer service window between you and the recipient. Use sendTemplate.
Free-form messages: can be sent only when a customer service window is open between you and the recipient. Use sendCarousel.
The message structure in /sendCarousel is largely similar to sending a template. However, in this case you must explicitly specify all elements that are created in advance when working with templates. This is because the message is sent without using a template.
In /sendCarousel, for sending a Catalog Carousel there can be either 1 URL button or one or more quick reply buttons.
| body | string Text shown above the carousel. Optional. If omitted and params include a body component, the body will be taken from params. |
| params required | Array of objects Required. Template-like structure (same as sendTemplate params). Must include a CAROUSEL component and its cards. Structure:
|
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Request shipping address from the user (WhatsApp interactive address_message).
India and Singapore only. Requires a WABA phone registered in that country and a recipient phone matching it (+91 ↔ IN, +65 ↔ SG).
Pass country: "IN" or country: "SG" (default IN). Eligibility is validated upstream; eligibility; mismatches return errors such as Unsupported Interactive Message type (HTTP 200 with sent: false).
Optional: values, saved_addresses, validation_errors.
| phone | integer |
| chatId | string |
| body required | string |
| country | string Enum: "IN" "SG" Address form country (IN or SG). Defaults to IN. |
object Optional prefilled address fields | |
Array of objects Optional saved addresses | |
object Optional validation errors | |
| property name* additional property | any |
{- "phone": 6531650115,
- "body": "Thanks for your order!",
- "country": "SG"
}{ }Send a WhatsApp order details payment / invoice message using a pre-approved Utility template that has an ORDER_DETAILS button.
India only (WhatsApp Payments India). Requires:
GET/POST /commerce)ORDER_DETAILS buttonUse this method when you need structured fields (order, referenceId, currency, paymentSettings). The API appends a template button sub_type: order_details and sends via the same path as POST /sendTemplate.
Works outside the 24-hour session window (template message).
You can also send the same payload yourself with POST /sendTemplate by including a button component in params with sub_type: order_details.
| phone | integer Recipient phone (India E.164 digits, no +). Use phone or chatId. |
| chatId | string Recipient chatId (e.g. phone@c.us). Use phone or chatId. |
| template required | string Approved Utility template name that includes an ORDER_DETAILS button |
| namespace required | string Template namespace from the channel / template list |
required | object Template language |
Array of objects Extra template components (HEADER / BODY / etc.). If an order_details button is missing, the API appends one from order / referenceId / currency / paymentSettings. | |
| referenceId | string Unique order / payment reference id (maps to reference_id) |
| currency | string Currency code for India payments |
object Optional payment settings (UPI / payment gateway / payment link). Forwarded as payment_settings on the order_details action. | |
required | object Order payload for the ORDER_DETAILS button. Typical fields: status, items[], subtotal, tax, shipping, discount. Amount objects use { "offset": 100, "value": |
| property name* additional property | any |
{- "phone": 919876543210,
- "template": "order_details_utility",
- "namespace": "your_namespace_uuid",
- "language": {
- "code": "en"
}, - "referenceId": "order-123",
- "currency": "INR",
- "order": {
- "status": "pending",
- "items": [
- {
- "retailer_id": "SKU-1",
- "name": "Item",
- "amount": {
- "offset": 100,
- "value": 50000
}, - "quantity": 1
}
], - "subtotal": {
- "offset": 100,
- "value": 50000
}
}
}{ }By default, the message history is not saved for output in the method. To enable the method, write to technical support
| last | boolean Example: last=true Displays the last messages. If this parameter is passed, then lastMessageNumber is ignored. |
| lastMessageNumber | integer Example: lastMessageNumber=100 The lastMessageNumber parameter from the last response. Example: 100 |
| firstMessageNumber | integer Example: firstMessageNumber=1 The firstMessageNumber parameter from the last response. Example: 1 |
| limit | integer Example: limit=200 Sets length of the message list. Default 100. With value 0 returns all messages. |
| chatId | string Example: chatId=556123122026@c.us Filter messages by chatId Chat ID from the message list. Example: 556123122026@c.us (or RU.1504711984690866@lid). |
| min_time | integer Example: min_time=1665396610 Filter messages received after specified time. Example: 1665396610 |
| max_time | integer Example: max_time=1665396610 Filter messages received before specified time. Example: 1665396610 |
| msgId | string Example: msgId=0XzkmGNn4prUAQlzsHApGNRXQ0U Message ID. Example: 0XzkmGNn4prUAQlzsHApGNRXQ0U |
{- "messages": [
- {
- "messageNumber": 1,
- "id": "0XzkmGNn4prUAQlzsHApGNRXQ0U",
- "body": "Test message",
- "fromMe": true,
- "self": 1,
- "isForwarded": 0,
- "author": "556123122026@c.us",
- "authorBsuid": "RU.1504711984690866",
- "authorUserName": null,
- "time": 1665396610,
- "chatId": "556123122026@c.us",
- "type": "chat",
- "senderName": "780005553535@c.us",
- "caption": null,
- "quotedMsgId": null,
- "meta": { },
- "metadata": { },
- "chatName": "556123122026"
}
]
}Mark an inbound message as read. Optionally show the WhatsApp typing indicator (up to ~25 seconds or until the customer replies) by setting typingIndicator: true. Typing cannot be sent without marking the message as read.
| messageId | string Message ID. Example: 0XzkmGNn4prUAQlzsHApGNRXQ0U |
| msgId | string Alias for messageId (either messageId or msgId is required). |
| typingIndicator | boolean Default: false If true, also show the WhatsApp typing indicator after marking the message as read (max ~25s or until the customer replies). |
{- "result": "success"
}Block a WhatsApp user by phone number (WABA block_users).
| phone required | integer Phone number to block/unblock |
{- "phone": 79001234567
}{- "result": "success"
}Unblock a previously blocked WhatsApp user by phone number.
| phone required | integer Phone number to block/unblock |
{- "phone": 79001234567
}{- "result": "success"
}Returns users currently blocked on this WhatsApp channel (WABA GET /block_users). Same channel token auth as blockUser / unblockUser.
curl -X GET 'https://api.1msg.io/{instanceId}/blockedUsers?token=TOKEN'
{- "blockedUsers": [
- { }
]
}Create a WhatsApp group and return its invite link.
Beta test eligibility for group chats:
| groupName required | string Group name |
| description | string Group description |
{- "created": true,
- "groupID": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD",
- "chatID": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD@g.us",
- "name": "Group name",
- "timestamp": 1675964377
}Get active groups for the account.
| limit | integer Example: limit=100 Limit number of groups returned |
| before | string Example: before=MA== Pagination cursor for groups list (before) |
| after | string Example: after=MQ== Pagination cursor for groups list (after) |
{- "groups": [
- {
- "id": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD",
- "subject": "Group name",
- "description": "Group description",
- "participants": [
- {
- "wa_id": "79001234567",
- "type": "admin"
}
], - "chatId": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD@g.us"
}
], - "paging": {
- "before": "MA==",
- "after": "MQ=="
}
}Get group metadata and participants.
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
| fields | string Example: fields=subject,description,participants Comma-separated list of fields to return for group info |
{- "id": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD",
- "subject": "Group name",
- "description": "Group description",
- "participants": [
- {
- "wa_id": "79001234567",
- "type": "admin"
}
], - "chatId": "Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD@g.us"
}Update group name, description, or profile picture.
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
| subject | string New group name |
| description | string New group description |
| profile_picture_file | string Profile picture file handle or media ID |
{- "success": true
}Leave or delete the group (bot leaves).
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
{- "success": true
}Get group invite link.
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
{
}Reset and return a new group invite link.
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
{
}Remove participants from a group (admin only).
| group_id required | string Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD Group ID without @g.us suffix. Example: Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD |
| participants required | Array of strings Array of participant phone numbers or objects like {"user":"..."} |
{- "success": true
}Send Template Message to a new or existing chat. Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
Use this method for template messages (including Carousel/Catalog templates). If a 24-hour session method (e.g. /sendCarousel) fails because the 24-hour window is closed, send a template via /sendTemplate.
Cyrillic characters in file URLs are not supported. Use URL encoding for non-Latin characters.
Request examples are provided in the payload (requestBody/examples). Available variants:
Optional MM Lite / TTL fields: useMMlite, messageActivitySharing, messageSendTtlSeconds. Check channel readiness via GET /mmLiteStatus.
Order details (India only): include a params button with sub_type: order_details to send an invoice/payment template outside the 24h window. See also POST /sendOrderDetails.
| namespace required | string Can be found by method /templates |
| template required | string Name of template |
required | object Object, containing fields "policy" and "code". policy - now "deterministic" is only available option; code - one of supported language codes |
Array of objects Array of localizable parameters to be substituted into the template. Each parameter is object contains the following field: type - section of parameters - header, body, footer, button parameters - variables for section. Each variable is an object that can contain the following fields: type - can be text, currency, date_time, image, document, video or product video- id (mediaId) document
image - object with field link (image url) product - object with catalog_id and product_retailer_id (for catalog carousel product cards) currency - object containing parameters currency_code and amount_1000.
date_time - If the date_time object is used, further definition of the date and time is required.
button - if button has parameter
coupon_code - for COPY_CODE buttons use parameters with type coupon_code and coupon_code value. limited_time_offer - for limited-time offer templates:
cards - filled in if you need to send the Carousel template
The number of parameters passed must match the number of parameters in the template | |
| useMMlite | boolean Force Marketing Messages API (POST marketing_messages). If omitted: auto for MARKETING category when the channel has mm_lite_enabled and mm_lite_available service settings. |
| messageActivitySharing | boolean Sets message_activity_sharing on the WABA payload (click tracking webhooks). Requires the MM Lite path. Ignored on Cloud API fallback. |
| messageSendTtlSeconds | integer Template message TTL in seconds (message_send_ttl_seconds). MARKETING via MM Lite: 43200–2592000. AUTHENTICATION: 30–900. UTILITY: 30–43200. AUTH/UTILITY also accept -1 (30-day custom TTL). |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}{- "total": 3,
- "templates": [
- {
- "category": "MARKETING",
- "components": [
- {
- "type": "BODY",
- "format": "TEXT",
- "text": "header text {{1}}",
- "add_security_recommendation": true,
- "code_expiration_minutes": 5,
- "example": { },
- "buttons": [
- {
- "type": "QUICK_REPLY",
- "text": "phone-button-text",
- "otp_type": "COPY_CODE",
- "autofill_text": "Autofill",
- "package_name": "com.example.myapplication",
- "signature_hash": "K8a%2FAINcGX7",
- "phone_number": "+1(234) 235-5678",
- "example": [
- null
]
}
]
}
], - "language": "en",
- "name": "start",
- "namespace": "ca300906_cfbc_410b_99fb_dcee8e13d578",
- "rejected_reason": "NONE",
- "status": "approved"
}
]
}How to build and send messages with single and multiple products.
You can send product cards via Carousel in two ways:
Template messages: do not require a 24-hour customer service window between you and the recipient. Use sendTemplate.
Free-form messages: can be sent only when a customer service window is open between you and the recipient. Use sendCarousel.
The message structure in /sendCarousel is largely similar to sending a template. However, in this case you must explicitly specify all elements that are created in advance when working with templates. This is because the message is sent without using a template.
In /sendCarousel, for sending a Catalog Carousel there can be either 1 URL button or one or more quick reply buttons.
You can send product cards via Carousel in two ways:
Template messages: do not require a 24-hour customer service window between you and the recipient. Use sendTemplate.
Free-form messages: can be sent only when a customer service window is open between you and the recipient. Use sendCarousel.
The message structure in /sendCarousel is largely similar to sending a template. However, in this case you must explicitly specify all elements that are created in advance when working with templates. This is because the message is sent without using a template.
In /sendCarousel, for sending a Catalog Carousel there can be either 1 URL button or one or more quick reply buttons.
| body | string Text shown above the carousel. Optional. If omitted and params include a body component, the body will be taken from params. |
| params required | Array of objects Required. Template-like structure (same as sendTemplate params). Must include a CAROUSEL component and its cards. Structure:
|
| quotedMsgId | string Quoted message ID (Cloud API) |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Send a single product or product list to a new or existing chat. (Only if the dialogue has an Open Session). Only one destination parameter is needed - chatId, phone, or bsuid. In BSUID-centric routing, chatId can be phone@c.us, bsuid@lid, group@g.us, or username@username. The phone field accepts a phone number or BSUID; bsuid can be passed separately.
First, you need to upload your inventory to Facebook. You can use the API or Facebook’s Commerce Manager to do that. If you already have a Facebook catalog set up, we suggest that you leverage that catalog for WhatsApp commerce use cases.
You can not send products to Business WhatsApp clients.
required | object Object containing info about product or catalog. Can contain the following fields: catalog_id - id of catalog product_retailer_id - id of product. Only for sending single product. sections - used for sending multiply products. It`s array containing objects with catalog info. See example below. Example: {"catalog_id":"{{catalog_id}}","sections":[{"title":"the-section-title","product_items":[{"product_retailer_id":"{{SKU-1}}"},{"product_retailer_id":"{{SKU-2}}"}]},{"title":"the-section-title2","product_items":[{"product_retailer_id":"{{SKU-1}}"}]}]} |
| body | string Text of message. Example: Some text. |
| footer | string Located under the message text. Example: Footer. |
| header | string Header of catalog. Example: Header. Required when sending the catalog. |
| chatId | string Required if phone and bsuid are not set Chat ID from the message list. Examples: 12020721369@c.us, RU.1504711984690866@lid, username@username, or 120363046942338209@g.us (group). Used instead of the phone parameter. |
| phone | string Required if chatId and bsuid are not set Recipient identifier. Accepts a phone number starting with the country code, or a BSUID such as RU.1504711984690866. Use chatId for full chat IDs: phone@c.us, bsuid@lid, username@username, or group@g.us. |
| bsuid | string Optional alternative to phone/chatId Recipient BSUID without the @lid suffix. Example: RU.1504711984690866. |
{- "sent": true,
- "id": "gBGGeRhGZTEfAgkJCh2wAz4ZH-8",
- "message": "Sent to 556123122026@c.us",
- "description": "Message has been sent to the provider"
}Catalog and cart commerce settings (GET/POST /commerce).
GET response fields: id (catalog id), is_cart_enabled, is_catalog_visible.
POST body: { "params": { "is_cart_enabled": boolean, "is_catalog_visible": boolean } }.
Returns catalog/cart commerce settings for the channel.
Response fields (array):
id — catalog idis_catalog_visible — show catalog storefront icon (true/false)is_cart_enabled — enable cart (true/false)[- {
- "id": "789887292550821",
- "is_cart_enabled": true,
- "is_catalog_visible": true
}
]Update catalog/cart commerce settings.
POST body:
{ "params": { "is_cart_enabled": true, "is_catalog_visible": true } }
params.is_catalog_visible — show catalog storefront iconparams.is_cart_enabled — enable cartBlocked when subscription limit exceeded.
object |
{ }{- "success": true
}Upload media and get mediaId. Uploaded media can be sent in template
| body required | string HTTP link https://... Or base64-encoded file with mime data, for example data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ... File in form-data input field |
{- "mediaId": "ed2c7be7-b779-4ba8-a17c-6722f37be2a7"
}Get WABA media URL and metadata by mediaId (from /uploadMedia). The returned url is temporary and typically expires within ~5 minutes.
| mediaId required | string Numeric WABA media id |
curl -X GET 'https://api.1msg.io/{instanceId}/retrieveMedia?token=TOKEN&mediaId=123456789012345'
{- "url": "string",
- "mimeType": "string",
- "sha256": "string",
- "fileSize": 0,
- "id": "string"
}Delete previously uploaded media by numeric mediaId (from /uploadMedia).
This is the canonical deletion endpoint and uses the REST DELETE verb on the media resource path. The older POST /deleteMedia is a deprecated alias.
| mediaId required | string Numeric WABA media id |
curl -X DELETE 'https://api.1msg.io/{instanceId}/media/123456789012345?token=TOKEN'
{- "result": "success"
}Deprecated. Use DELETE /media/{mediaId} instead.
This POST alias is kept for backward compatibility with earlier integrations. New integrations should call DELETE /media/{mediaId}: 1msg follows REST conventions for resource deletion going forward.
| mediaId required | string Numeric WABA media id from /uploadMedia |
{- "mediaId": "123456789012345"
}{- "result": "success"
}Limitations
Returns WABA-level template analytics settings.
curl -X GET 'https://api.1msg.io/{instanceId}/settings/templateAnalytics?token={token}'
{- "enable": true,
- "cta_url_link_tracking_opted_out": false,
- "external_id": "external_id"
}Enable/disable template analytics on the WABA.
| enable | boolean Enable template analytics on the WABA |
| cta_url_link_tracking_opted_out | boolean Disable URL button click tracking for a specific template |
| external_id | string Template external_id (required when setting cta_url_link_tracking_opted_out) |
{ }{- "enable": true,
- "cta_url_link_tracking_opted_out": false,
- "external_id": "external_id"
}Returns per-template URL button click tracking opt-out settings.
| template_external_id required | string Example: external_id Template external_id for per-template analytics setting (cta_url_link_tracking_opted_out). |
curl -X GET 'https://api.1msg.io/{instanceId}/settings/templateAnalyticsOptOut/<template_id>?token={token}'
{- "enable": true,
- "cta_url_link_tracking_opted_out": false,
- "external_id": "external_id"
}Enable/disable URL button click tracking for a specific template.
| template_external_id required | string Example: external_id Template external_id for per-template analytics setting (cta_url_link_tracking_opted_out). |
| enable | boolean Enable template analytics on the WABA |
| cta_url_link_tracking_opted_out | boolean Disable URL button click tracking for a specific template |
| external_id | string Template external_id (required when setting cta_url_link_tracking_opted_out) |
{ }{- "enable": true,
- "cta_url_link_tracking_opted_out": false,
- "external_id": "external_id"
}Template analytics are reported with daily granularity. Data is returned in UTC by default, or in the WABA timezone when use_waba_timezone=true.
Limitations:
If template analytics is disabled for the channel, the API returns an error: Template analytics is disabled for this channel.
| start required | string Example: start=2024-01-01 Start time for the date range. Unix timestamp or YYYY-MM-DD. If using use_waba_timezone=true, use YYYY-MM-DD. |
| end required | string Example: end=2024-01-07 End time for the date range. Unix timestamp or YYYY-MM-DD. If using use_waba_timezone=true, use YYYY-MM-DD. |
| granularity required | string Value: "DAILY" Example: granularity=DAILY Analytics granularity. Only DAILY is supported. |
| template_ids required | Array of strings Example: template_ids=1156697826259690&template_ids=1309207764213383 Array of template IDs to retrieve analytics for. Maximum 10. |
| metric_types | Array of strings Items Enum: "COST" "CLICKED" "DELIVERED" "READ" "SENT" "APP_ACTIVATIONS" "APP_ADD_TO_CART" "APP_CHECKOUTS_INITIATED" "APP_PURCHASES" "APP_PURCHASES_CONVERSION_VALUE" "WEBSITE_ADD_TO_CART" "WEBSITE_CHECKOUTS_INITIATED" "WEBSITE_PURCHASES" "WEBSITE_PURCHASES_CONVERSION_VALUE" Example: metric_types=SENT&metric_types=DELIVERED&metric_types=READ Types of metrics to retrieve. If omitted, all metric types are returned. |
| product_type | string Enum: "CLOUD_API" "MARKETING_MESSAGES_LITE_API" Example: product_type=CLOUD_API Filter metrics by product type. If omitted, only Cloud API metrics are returned. |
| use_waba_timezone | boolean Example: use_waba_timezone=true Show metrics in the WABA timezone. If true, start and end must be YYYY-MM-DD. |
curl -X GET 'https://api.1msg.io/{instanceId}/templateAnalytics?start=2024-01-01&end=2024-01-07&granularity=DAILY&template_ids=<template_id>&metric_types=SENT&product_type=CLOUD_API&token={token}'
{- "data": [
- {
- "granularity": "DAILY",
- "product_type": "CLOUD_API",
- "waba_timezone": "America/Los_Angeles",
- "data_points": [
- {
- "template_id": "1156697826259690",
- "start": 1759708800,
- "end": 1759795200,
- "sent": 3,
- "delivered": 3,
- "read": 3,
- "replied": 0,
- "clicked": [
- {
- "type": "url_button",
- "button_content": "Buy Now",
- "count": 3
}
], - "cost": [
- {
- "type": "amount_spent",
- "value": 0.26
}
]
}
]
}
], - "paging": {
- "cursors": {
- "before": "MAZDZD",
- "after": "MjQZD"
}
}
}Create a new WhatsApp Flow in draft state. Supports optional flow.json upload and immediate publish.
| name required | string Flow name |
| categories required | Array of strings (FlowCategory) Items Enum: "SIGN_UP" "SIGN_IN" "APPOINTMENT_BOOKING" "LEAD_GENERATION" "CONTACT_US" "CUSTOMER_SUPPORT" "SURVEY" "OTHER" Categories (comma or array) |
| endpointUri | string <uri> Data endpoint URL |
| cloneFlowId | string Clone existing flow id |
| publish | boolean Publish immediately |
string or object Flow JSON definition (string or object) | |
| file | string <binary> Optional flow.json upload |
{- "id": "string",
- "success": true,
- "flowJson": {
- "success": true,
- "validationErrors": [
- {
- "error": "string",
- "errorType": "string",
- "message": "string",
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "pointers": [
- {
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "path": "string"
}
]
}
]
}, - "publish": { }
}Returns all flows for the instance.
| fields | string Comma list of fields to return (id,name,status,categories,preview,validation_errors,json_version,data_api_version,endpoint_uri,data_channel_uri,whatsapp_business_account) |
{- "items": [
- {
- "id": "string",
- "name": "string",
- "status": "DRAFT",
- "categories": [
- "SIGN_UP"
], - "validationErrors": [
- {
- "error": "string",
- "errorType": "string",
- "message": "string",
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "pointers": [
- {
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "path": "string"
}
]
}
], - "jsonVersion": "string",
- "dataApiVersion": "string",
- "whatsappBusinessAccount": { }
}
], - "paging": { },
- "count": 0,
- "total": 0
}| flowId required | string Flow identifier |
| fields | string Comma list of fields to return (id,name,status,categories,preview,validation_errors,json_version,data_api_version,endpoint_uri,data_channel_uri,whatsapp_business_account) |
{- "id": "string",
- "name": "string",
- "status": "DRAFT",
- "categories": [
- "SIGN_UP"
], - "validationErrors": [
- {
- "error": "string",
- "errorType": "string",
- "message": "string",
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "pointers": [
- {
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "path": "string"
}
]
}
], - "jsonVersion": "string",
- "dataApiVersion": "string",
- "whatsappBusinessAccount": { }
}| flowId required | string Flow identifier |
| name | string |
| categories | Array of strings (FlowCategory) Items Enum: "SIGN_UP" "SIGN_IN" "APPOINTMENT_BOOKING" "LEAD_GENERATION" "CONTACT_US" "CUSTOMER_SUPPORT" "SURVEY" "OTHER" |
| endpointUri | string <uri> |
{ }{- "success": true
}| flowId required | string Flow identifier |
required | string or object Flow JSON definition |
| file | string <binary> flow.json upload |
{- "success": true,
- "validationErrors": [
- {
- "error": "string",
- "errorType": "string",
- "message": "string",
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "pointers": [
- {
- "lineStart": 0,
- "lineEnd": 0,
- "columnStart": 0,
- "columnEnd": 0,
- "path": "string"
}
]
}
]
}WhatsApp Calling API (beta) — VoIP signaling proxy.
1msg does not host media, store call history, or store recordings. You need your own WebRTC or SIP stack.
subscriptionBlocked → 403 plain textPOST /webhook) for calls eventstype=calls, event=connect — take call_id + SDP offerPOST /initiateCall action=pre_accept + WebRTC answer SDPaction=accept + WebRTC answer SDP, or action=rejectevent=terminate, or action=terminate to hang upAnswer within ~30–60s or Meta ends as unanswered.
Critical: accept / pre_accept need a WebRTC-generated SDP answer.
Do not echo Meta's offer. Postman/curl alone cannot establish real media.
call_permission_reply)POST /initiateCall action=connect + business SDP offercalls connect webhookMeta limits (summary): permission ~7 days; up to 5 calls / 24h / user; max 2 CPR / 7 days; auto-revoke after 4 unanswered.
type=calls)Passthrough of Meta field=calls plus type, instanceId.
Events: connect (offer or answer SDP), statuses (RINGING / ACCEPTED /
REJECTED), terminate. CPR replies use the messages path, not type=calls.
See operations below for request bodies and examples.
Return WhatsApp Calling API settings for this channel (beta).
Proxies upstream GET /calling/settings.
Prerequisites
subscriptionBlocked channels receive 403 plain textSee the Calling tag overview for inbound/outbound flows and webhooks.
{- "calling": {
- "status": "ENABLED",
- "call_icon_visibility": "DEFAULT",
- "callback_permission_status": "ENABLED",
- "sip": {
- "status": "DISABLED"
}
}
}Enable, disable, or update WhatsApp Calling settings (beta).
Proxies upstream POST /calling/settings.
Body is forwarded as-is (1msg does not validate fields).
Common fields under calling
status (ENABLED | DISABLED) — required to turn calling on/offcall_icon_visibility (DEFAULT | DISABLE_ALL) — optionalcallback_permission_status (ENABLED | DISABLED) — optional;
when enabled, inbound user calls grant callback permissioncall_hours — optional hours / timezone objectsip — optional SIP trunk; when SIP is ENABLED, Graph call actions and
calling webhooks are not usedsrtp_key_exchange_protocol (DTLS | SDES) — SDES only with SIPvideo.status — optionalMeta may accept only one feature group per request — prefer focused updates (e.g. enable status first, then SIP).
Trial / subscriptionBlocked → 403 plain text.
object Calling feature configuration for the business phone number | |
| property name* additional property | any |
{- "calling": {
- "status": "ENABLED",
- "call_icon_visibility": "DEFAULT",
- "callback_permission_status": "ENABLED"
}
}{- "success": true
}Perform a WhatsApp Calling action (beta).
Proxies upstream POST /calling/calls. Despite the historical path
name /initiateCall, this endpoint handles all call actions:
| action | Use | Required |
|---|---|---|
connect |
Outbound business → user | to + session (sdp_type: offer) |
pre_accept |
Inbound (optional, reduces audio clipping) | call_id + session (sdp_type: answer) |
accept |
Inbound answer | call_id + session (sdp_type: answer) |
reject |
Decline inbound | call_id |
terminate |
Hang up | call_id |
SDP / media (critical)
accept / pre_accept require a WebRTC-generated SDP answer.Answer within ~30–60 seconds of an inbound connect webhook or Meta
terminates as unanswered. Common Meta errors include Calling not enabled
(138000), no permission (138006), SDP validation failures.
Outbound requires a prior Call Permission Request (CPR) acceptance. See the Calling tag overview for the full outbound flow and CPR limits.
Trial / subscriptionBlocked → 403 plain text.
Upstream failures often return HTTP 200 with { "response": { "error": "..." } }.
| messaging_product required | string Value: "whatsapp" Must be |
| action required | string Enum: "connect" "pre_accept" "accept" "reject" "terminate" Call control action |
| call_id | string WhatsApp call id from the inbound/outbound calls webhook ( |
| to | string Recipient WhatsApp user phone (digits, country code, no +).
Required for outbound |
| biz_opaque_callback_data | string <= 512 characters Optional opaque string echoed on later call webhooks for correlation |
object WebRTC SDP session (required for connect / pre_accept / accept) | |
| property name* additional property | any |
{- "messaging_product": "whatsapp",
- "to": "12185552828",
- "action": "connect",
- "biz_opaque_callback_data": "order-123",
- "session": {
- "sdp_type": "offer",
- "sdp": "[REPLACE_WITH_WEBRTC_SDP]"
}
}{- "messaging_product": "whatsapp",
- "success": true
}Update WhatsApp Business Account profile fields. At least one updatable field required. Blocked when subscription limit exceeded.
| about | string |
| address | string |
| description | string |
string | |
| vertical | string |
| photo | string |
| websites | Array of strings |
| property name* additional property | any |
{ }{- "error": "Wrong token \"xxx7i1crxjxpkxxx\" for channel \"123\". Please provide token as a GET parameter."
}