- Create a contact under
/projects/{projectId}/contactsand record genuine opt-in through its/consentendpoint. - Create a Utility or Marketing template through
/templates. Supply sequential variables{{1}},{{2}}, and one bounded example for each distinct variable. Organization name is not a template-creation field. - For Live, submit the draft through
/templates/{id}/submitand wait for Meta approval. If submission has an uncertain outcome, reconcile it; do not blindly resubmit. - Send using
POST /messageswith a stableIdempotency-Key:
messages:send alone does not grant that permission.
Acceptance and delivery
HTTP 202 means the request and its charge were durably accepted. It does not mean Meta accepted, delivered or read the message. Savedata.id, inspect GET /messages/{id} and subscribe to message.status.
Statuses include Simulated, Queued, Sending, Accepted, Sent, Delivered, Read, Failed, NeedsReview and Cancelled. Provider acceptance is Accepted; successful delivery is Delivered. Unknown billable provider outcomes become NeedsReview rather than being blindly retried. Revoked keys, unavailable senders or suppression can block queued work.
Later failure does not silently reverse the finalized acceptance charge. Reviewed financial corrections use ledger adjustments. Do not resend with a new idempotency key merely because delivery is delayed.
Message metadata and content are separate permissions. messages:read exposes status, events and customer charges, not message bodies. The dashboard-only content endpoint is deliberately outside this developer reference.