## Create an invitation template

**post** `/v1/invitation_templates`

Creates an invitation template: the name (and optionally the logo file)
that fill the card, saved once, referenced by id on every send. The
response's `ETag` carries the version `PUT` will want in `If-Match`.

**Errors**

- HTTP 403 `code` 2029: your brand is not approved
  for invitations of this shape (with/without a logo); raised with us,
  not self-service.
- HTTP 422: field-level validation (`name_required`, `too_long`,
  `brand_logo_not_png`, `logo_too_large`).
- HTTP 413 `code` 1073: the whole request body exceeds the ceiling:
  the logo may be at most 143,360 bytes raw.

### Returns

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

### Example

```http
curl https://messages.api.linqapp.com/v1/invitation_templates \
    -H 'Content-Type: multipart/form-data' \
    -H "Authorization: Bearer $LINQ_AMB_API_KEY" \
    -F name=name
```

#### Response

```json
{
  "id": "invt_a4f2c718d0",
  "name": "Acme Rides",
  "has_logo": true,
  "version": 1,
  "created_at": "2026-08-10T09:00:00Z",
  "updated_at": "2026-08-10T09:00:00Z"
}
```
