Skip to content
Linq

Invitation Templates

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/consent with subject_kind: "tel". Without one the send returns 403 consent_required.
  • One of your template ids. GET /v1/invitation_templates lists 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.


List invitation templates
GET/v1/invitation_templates
Create an invitation template
POST/v1/invitation_templates
Get an invitation template
GET/v1/invitation_templates/{invt}
Download an invitation template's logo
GET/v1/invitation_templates/{invt}/logo
Update an invitation template
PUT/v1/invitation_templates/{invt}
Delete an invitation template
DELETE/v1/invitation_templates/{invt}
ModelsExpand Collapse
InvitationTemplateListResponse object { data, next_cursor }

One page of your invitation templates, newest-first.

data: array of object { id, created_at, has_logo, 3 more }
id: string

The template id (invt_…); what a send’s template_id references.

created_at: string
formatdate-time
name: string

The brand name printed on the invitation card.

updated_at: string
formatdate-time
version: number

Edit counter that only ever counts up, also returned as this resource’s strong ETag. Echo it in If-Match on the next PUT; a stale one is refused 412 rather than overwriting someone else’s edit.

formatint64
next_cursor: string

Pass back as ?cursor= for the next page. EMPTY when this page exhausted the list, that, not an empty data, is how paging ends.

InvitationTemplateCreateResponse object { id, created_at, has_logo, 3 more }

One of YOUR invitation templates: the brand name and optional logo that fill the card, saved once under an id we mint, referenced on every send. You never see or supply Apple’s internal card identifiers: the platform picks the right card from whether the template carries a logo.

id: string

The template id (invt_…); what a send’s template_id references.

created_at: string
formatdate-time
name: string

The brand name printed on the invitation card.

updated_at: string
formatdate-time
version: number

Edit counter that only ever counts up, also returned as this resource’s strong ETag. Echo it in If-Match on the next PUT; a stale one is refused 412 rather than overwriting someone else’s edit.

formatint64
InvitationTemplateRetrieveResponse object { id, created_at, has_logo, 3 more }

One of YOUR invitation templates: the brand name and optional logo that fill the card, saved once under an id we mint, referenced on every send. You never see or supply Apple’s internal card identifiers: the platform picks the right card from whether the template carries a logo.

id: string

The template id (invt_…); what a send’s template_id references.

created_at: string
formatdate-time
name: string

The brand name printed on the invitation card.

updated_at: string
formatdate-time
version: number

Edit counter that only ever counts up, also returned as this resource’s strong ETag. Echo it in If-Match on the next PUT; a stale one is refused 412 rather than overwriting someone else’s edit.

formatint64
InvitationTemplateUpdateResponse object { id, created_at, has_logo, 3 more }

One of YOUR invitation templates: the brand name and optional logo that fill the card, saved once under an id we mint, referenced on every send. You never see or supply Apple’s internal card identifiers: the platform picks the right card from whether the template carries a logo.

id: string

The template id (invt_…); what a send’s template_id references.

created_at: string
formatdate-time
name: string

The brand name printed on the invitation card.

updated_at: string
formatdate-time
version: number

Edit counter that only ever counts up, also returned as this resource’s strong ETag. Echo it in If-Match on the next PUT; a stale one is refused 412 rather than overwriting someone else’s edit.

formatint64
InvitationTemplateDeleteResponse object { ok }

The bare {"ok":true} acknowledgement; failures ride the error envelope instead.

ok: true