Invitations
An invitation is the only way to initiate contact. It sends a templated card to a phone number, not a free-text message.
Setup, once: create an invitation template: the brand name printed on the card, and optionally your logo, uploaded in the same request:
POST /v1/invitation_templates
Content-Type: multipart/form-data
name = "Acme Rides"
logo = <PNG file, optional>
The response carries the template’s id (invt_…). A template with a logo
renders the card with your image; one without renders the plain card: the
platform picks the right card for you. If creation is refused
403 invitation_card_not_granted, your brand is not yet approved for
invitations of that shape: approval is per-brand and raised with us, not
self-service.
Then, per invitation:
POST /v1/invitations
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
{"to": "+15551234567", "template_id": "invt_a4f2c718d0", "reference_id": "order-4417"}
Two conditions apply:
- A recorded opt-in for that number, posted to
POST /v1/consentwithsubject_kind: "tel". Without one the send returns403 consent_required. - One of your template ids.
GET /v1/invitation_templateslists them.
If the customer accepts, a chat is created and you message it normally. The
outcome arrives as invitation.accepted, invitation.declined, or
invitation.opted_out.
POST /v1/invitation_batches submits up to 10,000 invitations at once, all
from one template: its name and logo are resolved when you submit and
frozen into the run, so editing the template mid-run never changes what
queued recipients receive. We check every recipient when you submit, so you
learn which ones will fail before we send anything. Track the run by its id
rather than per message, and POST /v1/invitation_batches/{batch}/cancel
stops any recipient we haven’t tried yet.