我們即將停用內部部署 API。詳情請參閱內部部署 API 停用文件,並從中了解如何轉用新一代雲端 API。
We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.
/v1/messages
Use the messages
node to send text, media, contacts, locations, and interactive messages, as well as message templates to your customers.
See the following guides for information regarding the specific types of messages you can send: Text Messages, Media Messages, Contacts and Location Messages, Interactive Messages, Message Templates, Media Message Templates, and Interactive Message Templates.
You need:
Starting in v2.39 and above, you do not have to call the contacts node before sending a message.
You send messages by making a POST
call to the /messages
node regardless of message type. The content of the JSON message body differs for each type of message (text, image, etc.).
These are the main parameters used in /messages
POST requests:
名稱 | 說明(點擊左欄的箭咀以了解支援選項。) |
---|---|
|
包含音訊的 |
| 此為選用項目。 任何字串,有助追蹤。 舉例來說,您可以在此欄位輸入訊息範本編號,以從您傳送的第一則訊息開始追蹤顧客體驗歷程。然後,您可以追蹤不同訊息範本類型的投資回報率,以找出哪個類型最有效。 此字串包含在 Webhook 裝載的 雲端 API 不會處理此欄位,只會將其作為已傳送/已送達/已讀訊息 Webhooks 的一部分傳回。 最多 512 個字元。 |
|
|
| 回覆對話中任何訊息時,此為必要項目。 此物件包含您所回覆的之前訊息其編號。例如:
|
|
包含文件的 |
| 包含 僅限內部部署 API。 |
|
包含圖像的 |
|
|
|
|
| 此為必要項目 要求所用的訊息往來服務。使用 |
|
允許在文字訊息中顯示網址預覽。請參閱在文字訊息中傳送網址。如不在訊息中加入網址,此為可選欄位。值: |
| 此為選用項目。 您目前僅可向個人用戶傳送訊息。請將此設定為 預設: |
| 訊息狀態。您可使用此欄位將訊息標記為 |
|
包含貼圖的 雲端 API:除了所有傳入訊息的貼圖類型外,亦支援傳出訊息的第三方靜態和動態貼圖。靜態貼圖須為 512x512 像素,不得超過 100 KB。動態貼圖須為 512x512 像素,不得超過 500 KB。 內部部署 API:除了所有傳入訊息的貼圖類型外,僅支援傳出訊息的第三方靜態貼圖。靜態貼圖須為 512x512 像素,不得超過 100 KB。不支援動態貼圖。 |
|
|
| 此為文字訊息的必要項目。 |
| 此為必要項目。 作為訊息傳送對象的顧客之 WhatsApp 編號或手機號碼。請參閱手機號碼格式。 如有需要,內部部署 API 用戶可呼叫 |
| 此為選用項目。 要傳送的訊息類型。如略過,則預設為 |
Name | Description |
---|---|
| Required. Contains the text of the message, which can contain URLs and formatting. |
For the On-Premises API, the media object id is returned when the media is successfully uploaded to the WhatsApp Business on-premises/reference client via the media
endpoint.
Name | Description |
---|---|
| Required when The media object ID. Do not use this field when message |
| Required when The protocol and URL of the media to be sent. Use only with HTTP/HTTPS URLs. Do not use this field when message Cloud API users only:
|
| Optional. Media asset caption. Do not use with On-Premises API users:
|
| Optional. Describes the filename for the specific document. Use only with The extension of the filename will specify what format the document is displayed as in WhatsApp. |
| Optional. On-Premises API only. This path is optionally used with a |
Inside contacts
, you can nest the following objects: addresses
, emails
, name
, org
, phone
, and urls
. Pluralized objects are to be wrapped in an array as shown in the example below.
Name | Description |
---|---|
| Optional. Full contact address(es) formatted as an
|
| Optional.
|
| Optional. Contact email address(es) formatted as an
|
| Required. Full contact name formatted as a
*At least one of the optional parameters needs to be included along with the |
| Optional. Contact organization information formatted as an
|
| Optional. Contact phone number(s) formatted as a
|
| Optional. Contact URL(s) formatted as a
|
Example of a contacts
object with pluralized objects nested inside:
"contacts": [ { "addresses": [ { "city": "city name", "country": "country name", "country_code": "code", "state": "Contact's State", "street": "Contact's Street", "type": "Contact's Address Type", "zip": "Contact's Zip Code" } ], "birthday": "birthday", "emails": [ { "email": "email", "type": "HOME" }, { "email": "email", "type": "WORK" } ], "name": { "first_name": "first name value", "formatted_name": "formatted name value", "last_name": "last name value", "suffix": "suffix value" }, "org": { "company": "company name", "department": "dep name", "title": "title" }, "phones": [ { "phone": "Phone number", "wa-id": "WA-ID value", "type": "MAIN" }, { "phone": "Phone number", "type": "HOME" }, { "phone": "Phone number", "type": "WORK" } ], "urls": [{ "url": "some url", "type": "WORK" }] } ]
Name | Description |
---|---|
| Required. Location latitude in decimal degrees. |
| Required. Location longitude in decimal degrees. |
| Required. Name of the location. |
| Required. Address of the location. |
Inside template
, you can nest the components
and the language
objects.
Beginning in v2.27.8
, a template's namespace
must be the namespace associated with the WABA that owns the phone number in the current WhatsApp Business on-prem client. Otherwise, the message will fail to send.
In addition, from v2.41
and onwards, namespace
will be an optional field.
Name | Description |
---|---|
| Required. Name of the template. |
| Required. Contains a The
|
| Optional. Array of |
| Optional. Only used for On-Premises API. Namespace of the template. |
Inside components
, you can nest the parameters
object. Additionally, you can set type
to button
.
Name | Description (Click the arrow in the left column for supported options.) |
---|---|
| Required. Describes the Example of a "components": [{ "type": "body", "parameters": [{ "type": "text", "text": "name" }, { "type": "text", "text": "Hi there" }] }] |
| Required when Type of button to create. |
| Required when Array of For components of type=button, see the |
| Required when Position index of the button. You can have up to 10 buttons using index values of 0 to 9. |
Name | Description |
---|---|
| Required. Describes the Example of a { "type": "text", "text": "Customer" } Example of a { "type": "document", "document":{ "id": "doc_id", "filename": "doc_name" } } This is also known as a Media message template and they only support PDF documents. For more information about |
Inside the components
object, you can set type
to button
. These are the button parameters:
Name | Description |
---|---|
| Required. Type of button being created. |
| Required. Position index of the button. You can have up to 10 buttons using index values of |
| Required. The parameters for the button, which are set at creation time in your Business Manager. Include the following parameters:
|
Example of button
type with sub_type quick_reply
:
{ "type": "button", "sub_type": "quick_reply", "index": 0, "parameters": [{ "type": "payload", "payload": "Yes-Button-Payload" }] }
Example of button
type with sub_type copy_code
{ "type": "button", "sub_type": "copy_code", "index": 0, "parameters": [{ "type": "coupon_code", "coupon_code": "DISCOUNT20" }] }
The hsm
object has been deprecated with v2.39
of the WhatsApp Business on-premises/reference. Please use the template
object instead.
Name | Description |
---|---|
| Required. The namespace to be used. Beginning with |
| Required. The element name that indicates which template to use within the namespace. Beginning with |
| Required. Allows for the specification of a deterministic language. See the Language section for more information. This field used to allow for a |
| Required. This field is an array of values to apply to variables in the template. See the Localizable Parameters section for more information. |
The interactive
object generally contains 4 main components: header
, body
, footer
, and action
. Additionally, some of those components can contain one or more different objects:
header
, you can nest media
objects.action
, you can nest section
and button
objects.Name | Description |
---|---|
| Required. The type of interactive message you want to send. Supported values:
|
| Required for type Header content displayed on top of a message. You cannot set a The
|
| Optional for type An object with the body of the message. The
|
| Optional. An object with the footer of the message. The
|
| Required. An |
Name | Description |
---|---|
| Required for List Messages. Button content. It cannot be an empty string and must be unique within the message. Emojis are supported, markdown is not. Maximum length: 20 characters. |
| Required for Reply Button Messages. A
在您設定此編號時,開頭和末尾均不能有空格。 |
| Required for List Messages and Multi-Product Messages. Array of |
| Required for Single-Product Messages and Multi-Product Messages. Unique identifier of the Facebook catalog linked to your WhatsApp Business Account. This ID can be retrieved via Commerce Manager. |
| Required for Single-Product Messages and Multi-Product Messages. Unique identifier of the product in a catalog. Maximum 100 characters for both Single-Product and Multi-Product messages. To get this ID, go to Commerce Manager, select your Facebook Business account, and you will see a list of shops connected to your account. Click the shop you want to use. On the left-side panel, click Catalog > Items, and find the item you want to mention. The ID for that item is displayed under the item's name. |
| Optional for Flows Messages. The current mode of the Flow, either Default: |
| Required for Flows Messages. Must be |
| Required for Flows Messages. A token that is generated by the business to serve as an identifier. |
| Required for Flows Messages. Unique identifier of the Flow provided by WhatsApp. |
| Required for Flows Messages. Text on the CTA button, eg. "Signup". Maximum length: 20 characters (no emoji). |
| Optional for Flows Messages.
Default: |
| Optional for Flows Messages. Required only if
|
Name | Description |
---|---|
| Required if the message has more than one Title of the section. Maximum length: 24 characters. |
| Required for List Messages. Contains a list of row objects. Limited to 10 rows across all sections. Each
|
| Required for Multi-Product Messages. Array of Each
|
Audio messages:
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "audio", "audio": { "id": "your-media-id", } }
Document messages, using filename
:
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "document", "document": { "id": "your-media-id", "filename": "your-document-filename" } }
Document messages, using link
:
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "document", "document": { "link": "http(s)://the-url" "provider": { "name" : "provider-name" } } }
Video messages, using link
:
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "video", "video": { "link": "http(s)://the-url" "provider": { "name" : "provider-name" } } } }
Text messages:
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "text", "text": { "body": "your-message-content" } }
Interactive messages (lists):
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "interactive", "interactive":{ "type": "list", "header": { "type": "text", "text": "your-header-content-here" }, "body": { "text": "your-text-message-content-here" }, "footer": { "text": "your-footer-content-here" }, "action": { "button": "cta-button-content-here", "sections":[ { "title":"your-section-title-content-here", "rows": [ { "id":"unique-row-identifier-here", "title": "row-title-content-here", "description": "row-description-content-here", } ] }, { "title":"your-section-title-content-here", "rows": [ { "id":"unique-row-identifier-here", "title": "row-title-content-here", "description": "row-description-content-here", } ] }, ... ] } } }
Interactive messages (reply buttons):
POST /v1/messages { "recipient_type": "individual", "to": "whatsapp-id", "type": "interactive", "interactive": { "type": "button", "header": { # optional "type": "text" | "image" | "video" | "document", "text": "your text" # OR "document": { "id": "your-media-id", "filename": "some-file-name" } # OR "document": { "link": "the-provider-name/protocol://the-url", "provider": { "name": "provider-name", }, "filename": "some-file-name" }, # OR "video": { "id": "your-media-id" } # OR "video": { "link": "the-provider-name/protocol://the-url", "provider": { "name": "provider-name" } } # OR "image": { "id": "your-media-id" } # OR "image": { "link": "http(s)://the-url", "provider": { "name": "provider-name" } } }, # end header "body": { "text": "your-text-body-content" }, "footer": { # optional "text": "your-text-footer-content" }, "action": { "buttons": [ { "type": "reply", "reply": { "id": "unique-postback-id", "title": "First Button’s Title" } }, { "type": "reply", "reply": { "id": "unique-postback-id", "title": "Second Button’s Title" } } ] } # end action } # end interactive }
Interactive messages (Multi and Single-Product Messages):
{ "recipient_type": "individual", "to" : "{{Recipient-WA-ID}}", "type": "interactive", "interactive": { "type": "product", "body": { "text": "body text" }, "footer": { "text": "footer text" }, "action": { " _id": "catalog-ID", "product_retailer_id": "product-ID" } } }
Interactive messages (Multi-Product Messages):
{ "recipient_type": "individual", "to" : "whatsapp-id", "type": "interactive", "interactive": { "type": "product_list", "Header":{ "type": "text", "text": "text-header-content" }, "body":{ "text": "text-body-content" }, "footer":{ "text":"text-footer-content" }, "action":{ "catalog_id":"catalog-id", "sections": [ { "title": "section-title", "product_items": [ { "product_retailer_id": "product-SKU-in-catalog" }, { "product_retailer_id": "product-SKU-in-catalog" }, ... ]}, { "title": "the-section-title", "product_items": [ { "product_retailer_id": "product-SKU-in-catalog" } ... ]}, ... ] }, } }
Interactive messages (Catalog Messages):
{ "recipient_type": "individual", "to" : "whatsapp-id", "type": "interactive", "interactive": { "type": "catalog_message", "body":{ "text": "text-body-content" }, "footer":{ "text":"text-footer-content" }, "action":{ "name": "catalog_message", "parameters":{ "thumbnail_product_retailer_id": "product-SKU-in-catalog" } }, } }
Interactive messages (Flows):
{ "recipient_type": "individual", "to": "{{Recipient-WA-ID}}", "type": "interactive", "interactive": { "type": "flow", "header": { "type": "text", "text": "Flow message header" }, "body": { "text": "Flow message body" }, "footer": { "text": "Flow message footer" }, "action": { "name": "flow", "parameters": { "flow_message_version": "3", "flow_token": "AQAAAAACS5FpgQ_cAAAAAD0QI3s", "flow_id": "<FLOW_ID>", "flow_cta": "Book!", "flow_action": "navigate", "flow_action_payload": { "screen": "<SCREEN_ID>", "data": { # optional "user_name": "name", "user_age": 25 } } } } } }
The following shows an example of payload
in a response; the meta and error objects are omitted for brevity.
{ "messages": [{ "id": "message-id" }] }
If the request is successful, you receive a response with a message ID. If the request returns an errors
section, check the originating message and correct the errors before resending the request. For more information about errors, see WhatsApp Business on-premises/reference Client Error Codes and HTTP Status Codes.
Applies to businesses in Brazil, Colombia, and Singapore, starting September 12, 2023. Applies to all businesses starting October 12, 2023.
If the request is held for quality assessment, the response will contain a message_status
property with a message indicating that the message was not sent immediately and will be sent or dropped after quality has been validated. This property will only exist if the message is held.
{ "messages": [{ "id": "message-id", "message_status": "Message has been held because quality assessment is pending", }] }
WhatsApp allows some formatting in messages. To format all or part of a message, use these formatting symbols:
Formatting | Symbol | Example |
---|---|---|
Bold | Asterisk (*) | Your total is *$10.50*. |
Italics | Underscore (_) | Welcome to _WhatsApp_! |
Tilde (~) | This is ~better~ best! | |
| Three backticks (```) | ```print 'Hello World';``` |
In this context, performance represents the number of messages that can be sent in any given second using the WhatsApp Business on-premises/reference client. The maximum achievable performance depends on a variety of factors, the most important factor being your client setup choice and whether a message is being sent to a new user or an existing user —encryption sessions setup take a little longer when messaging a new user.
Client Setup | Supported Text Messages Per Second |
---|---|
Single Shard | 70 |
Multi Shard (32 shards) | 250 |
備註:請勿使用 WhatsApp Business API 向同一位傳送對象重複傳送相同訊息。
訊息送達率不是 100% 的原因有很多種。其中一些常見情況包括:用戶的網絡斷斷續續、用戶在一段時間內沒有任何活動,或建立 優質用戶體驗。
可以透過 WhatsApp 送達的訊息會有非常高的送達率。可是,也有很多原因會導致訊息傳送失敗。您可以監察回呼,以了解訊息的具體狀態。由於您無法存取最後送達狀態,而再次傳送訊息可能反而會產生不同成效,因此這方式有別於短訊等其他訊息傳送方式。
訊息可能會因為用戶手機停機、沒電,或用戶在遺失手機後更換新手機並停用 SIM 卡,而無法送達至用戶。另此,企業的用戶端網絡連線功能也有可能出錯,系統也有可能無法送達回呼(Webhooks)。您可使用此 health
節點監察這些狀況。只需開啟伺服器接收回呼,即可知道訊息有否成功進入 WhatsApp 伺服器雲端。
當用戶重新連接至網絡時,您之前所傳送的所有訊息都將會送達至他們。對用戶而言,重複收到內容相同的訊息會令體驗欠佳。他們較有可能會封鎖或投訴您,而您亦較有可能會被停權。
如果您在傳送訊息後收到了來自 API 的訊息編號,則代表您已經完成可做的操作來傳送此訊息。請勿向同一位傳送對象重複傳送相同內容。
如果您發現送達率長期偏低,請提交支援工作單至 直接支援服務。
當您傳送訊息時,只要您獲得訊息編號,便代表系統已將該訊息要求儲存在資料庫中。WhatsApp Business API 用戶端會不斷嘗試傳送該訊息,直至收到 WhatsApp 伺服器的確認為止。這個過程不設任何結束期限。然後,WhatsApp 伺服器會嘗試將該訊息傳送至用戶的手機。如果用戶的手機不在線,則系統會將訊息存儲在 WhatsApp 伺服器 30 天,然後將之捨棄。
可以!WhatsApp 允許您為訊息的所選文字使用粗體、斜體、刪除線或等寬字體。
不能,我們無法保證訊息的送達順序會與它們的傳送順序相同。如果訊息排序對您的使用案例十分重要,則我們建議您先偵聽第一則訊息的送達回調,然後再觸發第二則訊息。
在某些情況下,您可能需要更多時間來處理顧客的查詢,或者您只能在 24 小時後回覆其訊息。我們建議您建立訊息範本,以用於下列兩個用途:
在這兩種情況中,請務必盡可能為訊息範本提供最多的背景資訊。例如: