Description
What is a WhatsApp text message?
A text message is the simplest message type on the WhatsApp Business Platform: a single block of text with no media, buttons or template. Through the Cloud API you send it with a POST to the messages endpoint, setting type to text and putting the content in text.body, which holds up to 4,096 characters, including emoji, line breaks and WhatsApp's formatting markup.
The optional preview_url flag asks the recipient's WhatsApp client to try to render a link preview for the first URL in the body. The URL must start with http:// or https://, and any later URLs appear as ordinary clickable links. Without the flag, or when no preview can be fetched, links are still tappable. Inbound text works the same way in reverse: a messages webhook whose message has type: text and a text.body.
Because it is free-form, a text message is a session message. It can only be sent while the 24-hour customer service window is open, and since 1 October 2026 a reply inside that window in India is billed per delivered message at the service rate, ₹0.145. To start a conversation, or to write after the window has closed, send an approved message template instead. This page is about the message type itself: the markup inside the body is covered under WhatsApp text formatting, the preview card under link preview, and every field cap under message character limits.
Key takeaways
- A text message is the Cloud API's
type: textmessage: onetext.bodystring of up to 4,096 characters sent to one recipient. - Set
preview_url: trueto let WhatsApp render a preview of the first http(s) link in the body; later links stay plain. - Free-form text can only be sent inside an open 24-hour customer service window; outside it, send an approved template.
- A successful send returns a
wamid; delivered, read and failed statuses arrive later by webhook. - Add
context.message_idto quote the customer's message and answer it as a contextual reply.
Usage
A WhatsApp text message in code
curl -X POST "https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"messaging_product": "whatsapp","recipient_type": "individual","to": "919812345678","type": "text","text": {"preview_url": true,"body": "Yes, 3 in stock at Edappally. Reserve here: https://example.com/r/55tv"}}'
Properties
A WhatsApp text message: key facts and limits
- Message type
- type: text, content in text.body
- Body limit
- 4,096 characters
- Link preview
- First http(s) URL only, with preview_url: true
- When allowed
- Inside an open 24-hour customer service window
- India price
- ₹0.145 per delivered reply since 1 October 2026
- Success response
- messages[0].id, the wamid
- Endpoint
- POST /{PHONE_NUMBER_ID}/messages
Mechanics
How does a WhatsApp text message work?
step 1 — Check the window is open
A free-form text needs a customer message in the last 24 hours. Look up the conversation's last inbound timestamp; if the window has closed, send a template instead.
step 2 — Build the body
Set
messaging_product: whatsapp,recipient_type: individual,to(country code and number, digits only),type: textandtext.body. Addpreview_url: trueif the first link should show a preview.step 3 — POST to the messages endpoint
Send it to
https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messageswith a bearer access token. A 200 response means the platform accepted the message, not that it was delivered.step 4 — Store the wamid
The response's
messages[0].idis the message'swamidandcontacts[0].wa_idthe recipient's WhatsApp ID. Save both with your own message record.step 5 — Follow the status webhooks
sent,deliveredandreadstatuses arrive on the messages webhook, keyed by the wamid. Afailedstatus carries an error code, such as 131047 when the window had closed.
Caveats
Common mistakes with a WhatsApp text message
Sending free-form text outside the window
If the customer's last message is more than 24 hours old, the text fails with error 131047. Check the window before sending and fall back to an approved utility or marketing template.
Running past 4,096 characters
Long bot or LLM answers can exceed the limit and are rejected. Cap generated replies, split at paragraph breaks, or send long material as a document.
Expecting a preview for every link
Only the first URL is previewed, and only if the page can be fetched and has preview metadata. Put the link that matters first and keep the others for later messages.
Formatting the recipient wrongly
totakes the country code and number as digits. A leading 0 or a missing 91 sends to the wrong number or fails. Normalise numbers to E.164 when you collect them.Treating 200 as delivered
A 200 with a wamid means the platform accepted the message. Delivery can still fail later, so drive your UI from the status webhooks, not the send response.
Example
Example: A stock check at a Kochi electronics store
At 7:10 pm a customer asks a Kochi electronics store's WhatsApp number whether a 55-inch TV is in stock at its Edappally branch. The store's bot checks inventory and sends a text message with preview_url set to true: "Yes, 3 in stock at Edappally. Reserve here: https://example.com/r/55tv". The product page's preview appears under the text. The bot stores the returned wamid, and the delivered and read statuses arrive within seconds. When the customer then asks about returns, the bot's long policy answer runs to just over 1,000 characters — fine as text, but too long for an interactive message with buttons, so it sends the policy as text and the "Reserve" button separately.
Why it matters
Why does a WhatsApp text message matter?
Most of what a support team or a bot sends is plain text, so getting the text message right — the recipient format, a sensible length, previews only where they help — is the base of every integration. It is also the quickest end-to-end test of a new setup: if a text to your own phone arrives and its delivered status comes back, the access token, the phone number ID and the webhook loop all work.
Notes
Best practices for a WhatsApp text message
- Test a new number and token by texting your own phone first.
- Put the link you want previewed first in the body.
- Keep bot replies to a few short paragraphs; nobody reads a 4,000-character message on a phone.
- Use
context.message_idwhen answering one of several questions so the customer sees which one you mean. - Store the wamid next to your own message ID so status webhooks can be matched later.
Questions
Text Message FAQs
- What is the character limit for a WhatsApp text message?
- 4,096 characters in
text.body. That count includes spaces, emoji, line breaks and formatting markers. Longer content must be split into several messages or sent as a document. - How do I show a link preview in a WhatsApp API message?
- Set
preview_urlto true in thetextobject. The recipient's app then tries to render a preview for the first http:// or https:// URL in the body; later URLs stay plain links, and if no preview can be fetched the link is still clickable. - Can I send a text message to a customer who has not messaged me?
- Not as free-form text. A text message is a session message and needs an open 24-hour customer service window. Start the conversation with an approved template; once the customer replies, you can switch to text messages.
- Is a WhatsApp API text message charged?
- Yes, in India since 1 October 2026. A text reply inside the service window is billed per delivered message at the service rate, ₹0.145; until 30 September 2026 such replies were free. Undelivered messages are not billed.
- How is a text message different from a template message?
- A text message is free-form and only allowed inside the window; a template is pre-approved and can be sent at any time. Text needs no review and can say anything relevant to the conversation, while a template's wording is fixed at approval, with variables for the parts that change.
* Per-message rates for India, ex-GST: marketing, utility and authentication effective 1 July 2026; service messages ₹0.145 since 1 October 2026 (they were ₹0 until 30 September 2026). Volume commitments earn discounts — final rate is confirmed on your account; applicable GST extra. Rates for other countries differ (see the international rate table on /pricing).