## List invitation templates

**get** `/v1/invitation_templates`

Lists your invitation templates, newest-first, one page at a time.
An empty list on a fresh brand means none created yet; create one and
send; if creation is refused `403 invitation_card_not_granted`, your
brand is not yet approved for invitations of that shape: approval is
per-brand, raised with us, not self-service.

### Query Parameters

- `cursor: optional string`

  The previous page's `next_cursor`, verbatim; absent starts from the first page. Not a cursor this API issued returns HTTP 400 `code` 1013.

- `limit: optional number`

  Page size; absent (or non-numeric) reads as 25, above 100 reads as 100.

### Returns

- `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`

  - `has_logo: boolean`

    Whether a logo is stored. A template with a logo renders the image card; one without renders the plain card.

  - `name: string`

    The brand name printed on the invitation card.

  - `updated_at: string`

  - `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.

- `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.

### Example

```http
curl https://messages.api.linqapp.com/v1/invitation_templates \
    -H "Authorization: Bearer $LINQ_AMB_API_KEY"
```

#### Response

```json
{
  "data": [
    {
      "id": "invt_a4f2c718d0",
      "name": "Acme Rides",
      "has_logo": true,
      "version": 3,
      "created_at": "2026-08-10T09:00:00Z",
      "updated_at": "2026-08-12T15:30:00Z"
    }
  ],
  "next_cursor": ""
}
```
