WhatsApp template rules — what Meta actually approves
The most common reason a template gets rejected is not a broken payload — it is a payload that passed an API's own, looser validation and then met Meta's stricter review hours later. The numbers below are the ones that matter: what Meta approves, not just what gets accepted.
Short answer: a header tops out at 60 characters at Meta, a footer at 60, and 3 buttons is the practical maximum — build to these, not to whatever your API happens to accept.
Two sets of limits
An API validates loosely. Meta reviews strictly. Anything in the gap between the two columns below is accepted, submitted, and rejected hours later by a human reviewer.
| Limit | A typical API accepts up to | Meta approves up to |
|---|---|---|
| Header text | 1024 | 60 |
| Body text | 1024 | 1024 |
| Footer text | 1024 | 60 |
| Number of buttons | 10 | 3Meta allows more only for specific button mixes. |
| Button label | 25 | 25 |
Components, formats and categories
Components
A template is built from up to four parts: a header (0–1), a body (exactly 1, the only required one), a footer (0–1), and one buttons block (0–1) holding up to 3 buttons in practice.
Header formats
TEXT, IMAGE, VIDEO, DOCUMENT, LOCATION. A text header cannot contain a variable filled at send time — keep it static. A media header (image, video or document) needs a sample uploaded before submission.
Button types
URL, QUICK_REPLY, PHONE_NUMBER, COPY_CODE. Meta restricts which types can appear together in one template — quick replies generally don't mix freely with call-to-action buttons like URL or phone number.
Categories
- MARKETING
- Promotions, offers and announcements. The most heavily reviewed category, and the most expensive to send.
- UTILITY
- Order updates, confirmations and reminders tied to something the customer already did.
- AUTHENTICATION
- One-time passwords and login codes, with the most restricted formatting of the three.
Building or sending templates through the API?
The full developer reference — every component payload, example-value shapes and a complete template — is in the docs.