Exhibit A
Walk one user's permission from request to expiry
- No permission to Request delivered: Send request
- Request delivered to Temporary: User allows
- Request delivered to Permanent: Allows permanently
- Request delivered to Declined: User declines
- Temporary to No permission: 7 days pass
- Temporary to Revoked: Revoked / 4 missed calls
- Permanent to Revoked: User revokes
- No permission to Temporary: User calls you (callback)
- Declined to Request delivered: Ask again later
- Revoked to Request delivered: New request
- No permission
- Request delivered
- Temporary
Step 3 of 3 · end of walk
Temporary
response accept, is_permanent false. Calls are allowed for 7 days from approval; no webhook marks the expiry.
Arrived from Request delivered via User allows.
Can move to
- No permission · 7 days pass
- Revoked · Revoked / 4 missed calls
Happy path, step 3 of 3: Temporary (via User allows). response accept, is_permanent false. Calls are allowed for 7 days from approval; no webhook marks the expiry.
What is a call permission request?
A call permission request is the consent step of the WhatsApp Business Calling API: a message asking a user whether the business may call them on WhatsApp. The user sees the business's explanation with options to allow or decline, and their choice comes back to the business as a webhook. Until a user has granted permission, a business-initiated call to them fails with error 138006.
It comes in two forms. Inside an open 24-hour customer service window, a free-form interactive message with interactive.type and action.name both set to call_permission_request carries optional body text; it has no header or footer, and nothing else in the interactive object can be changed. Outside the window, the request travels as an approved message template that includes a call_permission_request component alongside its header, body and footer. Either way it is billed as a message: a template by its category, a free-form request as a service message.
Permission is temporary or permanent. A temporary approval lasts seven calendar days (168 hours) from the moment the user accepts; permanent permission, where the user chooses it, does not expire. The user can revoke either at any time. Permission is also granted automatically when a user calls a business that has callback permission switched on in its calling settings, and revoked automatically after repeated unanswered calls. Meta caps how many requests a business may send one user per day and per week; the caps reset when a call between the two connects.
Key takeaways
- A call permission request asks a WhatsApp user to let the business call them; business-initiated calls work only after they agree.
- Send it as an interactive
call_permission_requestinside an open window, or as an approved template outside it. - The answer arrives as an interactive
call_permission_replywebhook: accept or reject, temporary or permanent. - A temporary approval lasts 7 days from the user's tap, and no webhook marks its expiry, so check
call_permissionsbefore dialling. - Meta caps how often you can ask one user; read the live limits from the call_permissions endpoint instead of hard-coding them.
How does a call permission request work?
Ask in context
Send the request where a call obviously helps — after a support question, a booking or a failed delivery attempt — and say in the body text who will call and roughly when.
Choose the form
Inside the customer service window, send the interactive
call_permission_request. Outside it, send an approved template that includes acall_permission_requestcomponent.Receive the reply
The choice arrives on the
messageswebhook asinteractive.type: "call_permission_reply"withresponse(acceptorreject),is_permanent,expiration_timestampfor temporary approvals,response_sourceandcontext.idpointing at your request.Record the consent
Store the user, the decision, its source and the expiry as a consent record. It is your evidence of permission and your agents' "callable until" indicator.
Check before every call
Call
GET /{PHONE_NUMBER_ID}/call_permissions?user_wa_id=…: it returnspermission.status(no_permission,temporaryorpermanent) and whetherstart_callandsend_call_permission_requestare allowed right now, with their limits.
Common mistakes with a call permission request
Asking with no reason
A bare "Allow calls?" reads like telemarketing and gets declined. Say who will call, why and when — the body text is the only part of the interactive request you can customise.
Waiting for an expiry webhook
None is sent when a temporary permission lapses. Use the
expiration_timestampyou stored, and confirm withcall_permissionsbefore dialling.Re-asking straight after a decline
Requests are capped per user per day and per week, and a refusal is a signal. Offer chat instead and ask again only when the context changes; the caps reset after a connected call.
Ignoring response_source
automaticmeans the permission came from the user calling you, or was withdrawn after unanswered calls, rather than from a tap on your request. Keep the source in your consent record.No fallback for older apps
Users on older WhatsApp versions cannot receive the request and the send fails with error
131026. Fall back to a text inviting them to call you or reply in chat.
A call permission request 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": "interactive","interactive": {"type": "call_permission_request","action": { "name": "call_permission_request" },"body": { "text": "Our technician may need to call you on WhatsApp to find your flat. Allow calls?" }}}'
The free-form version needs an open customer service window; outside it, send an approved template with a call_permission_request component.
Example: A technician who needs to find the flat
A Bengaluru appliance-repair service confirms a fridge repair for Monday 19 October. With the confirmation, its bot sends a call permission request: "Our technician may need to call you on WhatsApp to find your flat. Allow calls?" The customer taps Allow. The webhook returns accept with an expiry seven days out, and the CRM shows "callable until Mon 26 Oct". On the visit, the technician's app checks call_permissions, sees temporary, and calls from the business number when he cannot find the right tower. A customer who taps Decline gets a text with the technician's arrival time instead, and is not asked again that week.
Why does a call permission request matter?
Outbound WhatsApp calls are only as good as the consent behind them. A clear, well-timed request — "Can our technician call you when he reaches your building?" — turns a call from an interruption into a service the customer chose, and gives the business a record of that choice it can show an auditor. Sending it carelessly does the opposite: a declined or ignored request uses up one of very few attempts, and a customer who feels ambushed can revoke permission or block the number altogether.
Best practices for a call permission request
- Pair the request with a concrete time window ("between 4 and 6 pm") so the call is expected when it comes.
- Show permission status and expiry to agents in the inbox, not only in the CRM.
- In templates, tie the request to the customer's own booking or order so it reads as service, not sales.
- Switch on callback permission in calling settings so people who call you can be called back without a separate request.
Call Permission Request FAQs
How long does WhatsApp call permission last?+
Can I send a call permission request outside the 24-hour window?+
How do I know whether a user accepted?+
How many times can I ask a user for call permission?+
Is a call permission request charged?+
* 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).