Who the typed recipient is, and what can be done with them
GET/api/compose/resolve
The one answer behind the universal "To:" box, shared by the phone and
the panel. Send the raw text as q; when the client's parser
recognised it, add the one structured value — phone (E.164, +…),
email, or handle (+ platform when a pasted link named one).
contact_id asks about a person already picked.
- Name (
qonly): every matching contact, saved or not. - Number: the contact who owns it (never a second one), otherwise
the contacts it might belong to (
recipient.needs_confirmation) and the actions for the number itself. Re-checked strictly: a number without a country code is answered withinput.problemand no actions. - E-mail: the owner, or the actions for the address.
- @handle: only a lookup. Every platform with handles lets a
business write only to somebody who wrote first; the connected ones
are listed in
handle.inbound_only_sources.
Actions come from the same resolver as GET /api/contacts/\{contact\}/reachability and carry what a composer needs
on top: template_required (WhatsApp's 24-hour rule), warnings
(marketing_opt_out, blocked, whatsapp_unconfirmed), and a
reason when not available (adds sms_not_configured,
call_permission_required and thread_restricted to the
reachability reasons). Nothing is written.
Requires the conversations.reply permission. Throttled (120/min).
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 429
The resolution.
Not authenticated. code: account_disabled means the member's seat was deactivated in this workspace: the session is over even though the token was not revoked (clients sign out and clean up).
Authenticated but not allowed.
Resource not found (or not visible to the current tenant).
The request failed validation.
Rate limit exceeded.
Response Headers
Request quota for the current window.
Remaining requests in the current window.
Seconds to wait before retrying.