## List templates

**get** `/v1/templates`

Lists the templates registered for this key's account, newest first, with
the parameter schema each one takes.

This is the read a `422 outside_customer_window` points you at: outside a
customer's service window only an approved `template` part sends, and this
is where the sendable ones and their variables are. It is also the read to
hand an agent — `parameters` is a JSON Schema shaped to be used verbatim as
a tool definition.

Templates in every status are listed, including ones that are not sendable,
so a pause or a rejection is visible rather than looking like a template
that vanished. Filter on `status == "approved"` for the sendable set.

### Query Parameters

- `cursor: optional string`

  A `next_cursor` from a previous page. Omit for the first page.

- `limit: optional number`

  How many templates to return, 1–100. Defaults to 100. A value outside the range is refused rather than clamped.

### Returns

- `TemplatePage object { data, has_more, next_cursor }`

  One page of templates, newest first.

  - `data: array of Template`

    - `category: string`

      `utility`, `marketing` or `authentication` — the category the channel ASSIGNED, which may not be the one that was requested: a template that reads as marketing is recategorised on review, and the category is what a send is priced at. Values grow additively.

    - `created_at: string`

    - `language: string`

      The locale this variant is written in, such as `en_US`.

    - `name: string`

      Lowercase letters, digits and underscores. Permanent once submitted.

    - `parameters: unknown`

      The variables this template takes, as a JSON Schema (2020-12) object —
      ready to hand to a model verbatim as a tool schema. Every property is a
      string and every one is required: the channel substitutes all of them.

      Each property publishes `minLength`, `maxLength` and `pattern` alongside
      its example, so a model sees the same value rules the send path enforces:
      values are 1–1024 characters, not whitespace-only, and contain no line
      break, tab or run of four spaces.

      An empty `properties` object means the template takes no variables.
      `null` means something different and specific: this template's variables
      cannot be addressed by name over this API (they are positional, or they
      live in a part of the template this API does not read yet). A `template`
      part naming such a template cannot supply its variables.

    - `quality: string`

      The channel's quality signal for this template, when it has one. `null` until it does. Free text; treat an unknown value as no signal.

    - `rejected_reason: string`

      Why the template was refused or held, when the channel said. Free text for a human; the wording is not stable and must not be branched on. `null` when there is nothing to say.

    - `send_schema: unknown`

      The complete schema for the `template` part that sends this exact template, including its fixed identity, named parameters, media header, and carousel values. `null` means this template cannot be addressed safely through this API.

    - `status: string`

      Where this template stands. Only `approved` may be sent.

      `draft` — a submission attempt has not produced a registered template.
      Consult `retry_allowed`; draft status alone never permits resubmission.
      `pending` — under review. Review is an unbounded queue; an hour or more is
      ordinary for a first submission.
      `approved` — sendable.
      `rejected` — refused; `rejected_reason` may say why.
      `paused` — was approved and is currently held, usually for quality. Not
      terminal: it can become `approved` again without you doing anything.
      `disabled` — no longer usable.

      Values grow additively, and anything you do not recognise is not sendable.

    - `updated_at: string`

    - `content: optional object { body, buttons, carousel, 2 more }`

      Human-readable copy and fixed actions in a registered template.

      - `body: optional string`

      - `buttons: optional array of object { type, phone_number, text, url }`

        - `type: string`

          The action kind; values grow additively.

        - `phone_number: optional string`

          A fixed telephone destination baked into the template, when present.

        - `text: optional string`

          The label shown to the recipient, when the channel supplies one.

        - `url: optional string`

          A fixed destination baked into the template, when present.

      - `carousel: optional array of object { body, buttons, header }`

        - `body: optional string`

        - `buttons: optional array of object { type, phone_number, text, url }`

          - `type: string`

            The action kind; values grow additively.

          - `phone_number: optional string`

            A fixed telephone destination baked into the template, when present.

          - `text: optional string`

            The label shown to the recipient, when the channel supplies one.

          - `url: optional string`

            A fixed destination baked into the template, when present.

        - `header: optional object { kind, text }`

          A media or text header as it will appear to the recipient.

          - `kind: string`

            `text`, `image`, `video`, or `document`; values grow additively.

          - `text: optional string`

            Fixed header copy. Omitted for media headers.

      - `footer: optional string`

      - `header: optional object { kind, text }`

        A media or text header as it will appear to the recipient.

        - `kind: string`

          `text`, `image`, `video`, or `document`; values grow additively.

        - `text: optional string`

          Fixed header copy. Omitted for media headers.

    - `retry_allowed: optional boolean`

      Whether another submission using this draft's name and language is currently allowed. A corrected definition may be required. Present on all responses from current servers. Clients must not offer retry unless this is explicitly `true`.

  - `has_more: boolean`

    True when another page follows.

  - `next_cursor: optional string`

    Pass as `cursor` to read the next page. Present only when `has_more` is true.

### Example

```http
curl https://whatsapp.messages.api.linqapp.com/v1/templates \
    -H "Authorization: Bearer $LINQ_WHATSAPP_API_KEY"
```

#### Response

```json
{
  "data": [
    {
      "category": "category",
      "created_at": "2019-12-27T18:11:19.117Z",
      "language": "language",
      "name": "name",
      "parameters": {},
      "quality": "quality",
      "rejected_reason": "rejected_reason",
      "send_schema": {},
      "status": "status",
      "updated_at": "2019-12-27T18:11:19.117Z",
      "content": {
        "body": "body",
        "buttons": [
          {
            "type": "type",
            "phone_number": "phone_number",
            "text": "text",
            "url": "url"
          }
        ],
        "carousel": [
          {
            "body": "body",
            "buttons": [
              {
                "type": "type",
                "phone_number": "phone_number",
                "text": "text",
                "url": "url"
              }
            ],
            "header": {
              "kind": "kind",
              "text": "text"
            }
          }
        ],
        "footer": "footer",
        "header": {
          "kind": "kind",
          "text": "text"
        }
      },
      "retry_allowed": true
    }
  ],
  "has_more": true,
  "next_cursor": "next_cursor"
}
```
