## 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 review ASSIGNED, which can differ from the one submitted — read it back after approval, since it determines pricing and whether marketing delivery rules apply. 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 `authentication` template takes exactly one parameter, `code`: the
      one-time code the message delivers, 1–15 characters. You generate the
      code; it is shown in the message body and is what the code button copies
      or fills in. A longer value is refused, never shortened. The `{{1}}` in
      such a template's `content.body` is where that code appears.

      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. After approval it is published on the registry's next read-back, up to about fifteen minutes later; until then it is `null` and a send is refused with `template_not_sendable` pointing at the template. `null` otherwise 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 time varies: templates have been
      approved in minutes and, in other cases, over several days, so poll this
      read rather than assuming a wait.
      `approved` — sendable. After approval, `send_schema` is published on the
      registry's next read-back, up to about fifteen minutes later.
      `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`

      When this template's registry facts last changed. An unchanged channel reconciliation does not move it.

    - `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. `one_time_code` is an authentication template's code button: it copies or fills in the code each send supplies as the `code` parameter, carries no `url`, and has no send-time slot of its own.

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

          The destination baked into the template, when present. A `url` button's destination may end in `{{1}}`, the variable each send fills.

      - `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. `one_time_code` is an authentication template's code button: it copies or fills in the code each send supplies as the `code` parameter, carries no `url`, and has no send-time slot of its own.

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

            The destination baked into the template, when present. A `url` button's destination may end in `{{1}}`, the variable each send fills.

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