Chúng tôi sẽ ngừng cung cấp API Tại chỗ. Hãy tham khảo tài liệu về việc Ngừng cung cấp API Tại chỗ để biết chi tiết, đồng thời tìm hiểu cách chuyển sang API Đám mây thế hệ tiếp theo của chúng tôi.
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:
Tên | Mô tả (Nhấp vào mũi tên ở cột bên trái để xem các tùy chọn được hỗ trợ.) |
---|---|
| Bắt buộc khi Một đối tượng |
| Không bắt buộc. Một chuỗi tùy ý, hữu ích để theo dõi. Ví dụ: bạn có thể chuyển ID mẫu tin nhắn vào trường này để theo dõi hành trình của khách hàng kể từ tin nhắn đầu tiên mà bạn gửi. Sau đó, bạn có thể theo dõi ROI của các loại mẫu tin nhắn khác nhau để xác định loại hiệu quả nhất. Bất kỳ ứng dụng nào mà bạn đăng ký trường webhook API Đám mây không xử lý trường này, mà chỉ trả về trong webhook thông báo đã gửi/đã phân phối/đã đọc. Tối đa 512 ký tự. Chỉ API Đám mây. |
| Bắt buộc khi Một đối tượng |
| Bắt buộc nếu trả lời bất kỳ tin nhắn nào trong cuộc trò chuyện. Một đối tượng có chứa ID của tin nhắn trước đó mà bạn đang trả lời. Ví dụ:
Chỉ API Đám mây. |
| Bắt buộc khi Một đối tượng |
| Chứa đối tượng Chỉ API Tại chỗ. |
| Bắt buộc khi Một đối tượng |
| Bắt buộc khi Một đối tượng |
| Bắt buộc khi Một đối tượng |
| Bắt buộc Dịch vụ nhắn tin được dùng cho yêu cầu. Hãy sử dụng Chỉ API Đám mây. |
| Bắt buộc nếu Cho phép xem trước URL trong tin nhắn văn bản - Xem phần Gửi URL trong tin nhắn văn bản. Đây là trường không bắt buộc nếu tin nhắn không có URL. Giá trị: Chỉ API Tại chỗ. Người dùng API Đám mây có thể sử dụng chức năng tương tự với trường |
| Không bắt buộc. Hiện tại, bạn chỉ có thể gửi tin nhắn cho cá nhân. Hãy đặt trường này thành Giá trị mặc định: |
| Trạng thái của tin nhắn. Bạn có thể sử dụng trường này để đánh dấu tin nhắn là
|
| Bắt buộc khi Một đối tượng API Đám mây: Hỗ trợ nhãn dán gửi đi dạng tĩnh và có hoạt ảnh của bên thứ ba, ngoài mọi loại nhãn dán gửi đến. Nhãn dán tĩnh cần phải có kích thước 512x512 pixel và không được vượt quá 100KB. Nhãn dán có hoạt ảnh phải có kích thước 512x512 pixel và không được vượt quá 500KB. API Tại chỗ: Chỉ hỗ trợ nhãn dán gửi đi dạng tĩnh của bên thứ ba, ngoài mọi loại nhãn dán gửi đến. Nhãn dán tĩnh cần phải có kích thước 512x512 pixel và không được vượt quá 100KB. Không hỗ trợ nhãn dán có hoạt ảnh. |
| Bắt buộc khi Một đối tượng |
| Bắt buộc đối với tin nhắn văn bản. Một đối tượng |
| Bắt buộc. ID WhatsApp hoặc số điện thoại của khách hàng mà bạn muốn gửi tin nhắn. Hãy xem phần Định dạng số điện thoại. Nếu cần, người dùng API Tại chỗ có thể lấy số này bằng cách gọi điểm cuối |
| Không bắt buộc. Loại tin nhắn mà bạn muốn gửi. Nếu bạn bỏ qua, giá trị mặc định sẽ là |
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
Bạn không được có khoảng trắng ở đầu hoặc cuối khi đặt ID. |
| 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 |
Lưu ý: Vui lòng không gửi cùng một tin nhắn nhiều lần cho cùng một người nhận bằng API WhatsApp Business.
Có thể có nhiều lý do khiến tỷ lệ gửi không đạt 100%. Một số trường hợp thường gặp bao gồm người dùng có quyền truy cập không thường xuyên vào mạng, không hoạt động trong một khoảng thời gian hoặc để tạo trải nghiệm chất lượng cao cho người dùng.
Tin nhắn có thể gửi được bằng WhatsApp sẽ có tỷ lệ gửi rất cao. Tuy nhiên, có nhiều lý do khiến hệ thống có thể không gửi được tin nhắn. Bạn sẽ có quyền truy cập vào trạng thái chính xác của tin nhắn bằng cách giám sát lệnh gọi lại. Điều này khác với việc gửi tin nhắn bằng SMS, chẳng hạn trong trường hợp bạn không có quyền truy cập vào trạng thái gửi cuối cùng và việc gửi lại tin nhắn có thể thực sự mang lại kết quả khác.
Tin nhắn có thể vẫn chưa gửi được vì điện thoại của người dùng không hoạt động hoặc hết pin hay người dùng bị mất điện thoại rồi có điện thoại mới và đã vô hiệu hóa SIM. Có thể xảy ra lỗi liên quan đến khả năng kết nối mạng của ứng dụng kinh doanh. Cũng có thể lệnh gọi lại (Webhooks) hiện không được gửi. Bạn có thể dùng nút health
để giám sát những tình huống này. Bạn có thể bật lệnh gọi lại cho hoạt động nhận trên máy chủ để biết rằng tin nhắn đã đến đám mây trên máy chủ WhatsApp.
Nếu và khi một người dùng kết nối lại với mạng, người dùng đó sẽ nhận được tất cả tin nhắn bạn đã gửi. Việc nhận nhiều tin nhắn có cùng nội dung sẽ để lại trải nghiệm không tốt cho người dùng. Có nhiều khả năng người dùng sẽ chặn bạn hoặc phàn nàn. Có nhiều khả năng bạn sẽ bị cấm.
Nếu gửi một tin nhắn và nhận được ID tin nhắn từ API thì bạn không cần phải làm gì nữa để gửi tin nhắn này. Đừng gửi lại cùng một nội dung cho cùng một người nhận.
Nếu bạn nhận thấy tỷ lệ gửi thấp trong một khoảng thời gian dài, vui lòng gửi phiếu hỗ trợ qua kênh Hỗ trợ trực tiếp.
Khi gửi một tin nhắn, ngay khi bạn nhận lại ID tin nhắn thì nghĩa là yêu cầu tin nhắn đã được lưu trữ trong cơ sở dữ liệu. Ứng dụng API WhatsApp Business sẽ không ngừng tìm cách gửi tin nhắn đó cho đến khi được máy chủ WhatsApp công nhận. Quá trình này không có thời điểm kết thúc. Sau đó, máy chủ WhatsApp sẽ tìm cách gửi tin nhắn đó đến điện thoại của người dùng. Nếu điện thoại của người dùng không có kết nối mạng, tin nhắn sẽ được lưu trữ trong 30 ngày trước khi bị máy chủ WhatsApp xóa bỏ.
Có! Với WhatsApp, bạn có thể định dạng văn bản đã chọn bên trong tin nhắn thành In đậm, In nghiêng, Gạch ngang hoặc Đơn cách.
Hiện tại, không có cách nào để xem số người dùng hoặc người dùng nào đã chặn doanh nghiệp của bạn. Dấu hiệu tốt nhất là nghe lệnh gọi lại trạng thái và nếu bạn không nhận được trạng thái delivered
thì nghĩa là người dùng đã chặn doanh nghiệp của bạn hoặc họ không có kết nối mạng. Hãy xem tài liệu Webhook để biết thêm chi tiết.
Nếu một người dùng đã chặn doanh nghiệp của bạn, API Danh bạ sẽ tiếp tục trả về số điện thoại đó dưới dạng người dùng WhatsApp hợp lệ. Tuy nhiên, khi bạn gửi tin nhắn, người dùng đó sẽ không bao giờ nhận được tin nhắn. Nếu đó là tin nhắn trả phí thì bạn sẽ không bị tính phí.
Không, thứ tự tin nhắn đến nơi không được đảm bảo đúng như thứ tự tin nhắn đã gửi. Nếu thứ tự là yếu tố quan trọng trong trường hợp sử dụng của bạn, bạn nên nghe lệnh gọi lại đã gửi tin nhắn cho tin nhắn đầu tiên trước khi gửi tin nhắn thứ hai.
Khi sử dụng nút messages
, bạn cần đặt tiêu đề Content-Type
thành application/json
để ứng dụng API WhatsApp Business phân tích chính xác nội dung tin nhắn. Bạn cũng cần đặt tiêu đề Authorization
và tiêu đề này phải chứa một mã truy cập chưa hết hạn. Hãy xem tài liệu Đăng nhập và xác thực để biết thông tin về cách lấy mã và thời điểm mã hết hạn.
Có thể có các trường hợp mà bạn cần thêm thời gian để xử lý câu hỏi của khách hàng và chỉ có thể phản hồi sau 24 giờ. Bạn nên tạo mẫu tin nhắn để:
Trong cả hai trường hợp, vui lòng đảm bảo rằng bạn đưa nhiều ngữ cảnh nhất có thể vào mẫu tin nhắn. Ví dụ: