> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pilotstatus.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Atualizar template

> Atualiza um template existente (pelo id ou nome) no escopo do número vinculado. O corpo segue o mesmo contrato de Criar template: body como OBJETO { header?, body, footer?, buttons? } (recomendado), o mesmo JSON como STRING ou TEXTO PURO; header NONE | TEXT (0–1 variável, até 60) | IMAGE | VIDEO | DOCUMENT (mídia via header.url OU header.base64 re-hospedado); body.text até 1024 (variáveis {{nome}}, sem começar/terminar com variável); footer até 60 sem variáveis; até 10 buttons — QUICK_REPLY (≤ 10), URL (≤ 2; estática ou dinâmica com uma variável nomeada como {{link}} no fim + example), PHONE_NUMBER (≤ 1), COPY_CODE (≤ 1; código em button.example). O campo examples é OBRIGATÓRIO quando há variáveis; faltando → 400 { code: "TEMPLATE_EXAMPLES_REQUIRED", details: { missing: [...] } }. Para números Meta a nova versão é re-submetida à Meta para aprovação (metaStatus PENDING); 400 META_TEMPLATE_SUBMIT_FAILED se a Meta recusar. 409 TEMPLATE_NOT_EDITABLE se a Meta não permitir editar o template no estado atual (só templates rejeitados podem ser editados); quando a Meta recusa uma edição por qualquer motivo, o template guardado fica inalterado. 404 TEMPLATE_NOT_FOUND se não existir no escopo do número. Requer key escopada a número.

**Requer uma chave com escopo de número.**



## OpenAPI

````yaml openapi.pt.json PUT /v1/templates/{id}
openapi: 3.1.0
info:
  title: API Pilot Status
  version: 1.0.0
  license:
    name: Pilot Status Terms of Service
    url: https://pilotstatus.com.br/terms
  description: >-
    API REST pública do Pilot Status. Autentique com o header `x-api-key:
    ps_...` (ou `x-api-key-id`). Base URL: https://pilotstatus.com.br
servers:
  - url: https://pilotstatus.com.br
security:
  - apiKey: []
  - apiKeyId: []
paths:
  /v1/templates/{id}:
    put:
      tags:
        - Templates
      summary: Atualizar template
      description: >-
        Atualiza um template existente (pelo id ou nome) no escopo do número
        vinculado. O corpo segue o mesmo contrato de Criar template: body como
        OBJETO { header?, body, footer?, buttons? } (recomendado), o mesmo JSON
        como STRING ou TEXTO PURO; header NONE | TEXT (0–1 variável, até 60) |
        IMAGE | VIDEO | DOCUMENT (mídia via header.url OU header.base64
        re-hospedado); body.text até 1024 (variáveis {{nome}}, sem
        começar/terminar com variável); footer até 60 sem variáveis; até 10
        buttons — QUICK_REPLY (≤ 10), URL (≤ 2; estática ou dinâmica com uma
        variável nomeada como {{link}} no fim + example), PHONE_NUMBER (≤ 1),
        COPY_CODE (≤ 1; código em button.example). O campo examples é
        OBRIGATÓRIO quando há variáveis; faltando → 400 { code:
        "TEMPLATE_EXAMPLES_REQUIRED", details: { missing: [...] } }. Para
        números Meta a nova versão é re-submetida à Meta para aprovação
        (metaStatus PENDING); 400 META_TEMPLATE_SUBMIT_FAILED se a Meta recusar.
        409 TEMPLATE_NOT_EDITABLE se a Meta não permitir editar o template no
        estado atual (só templates rejeitados podem ser editados); quando a Meta
        recusa uma edição por qualquer motivo, o template guardado fica
        inalterado. 404 TEMPLATE_NOT_FOUND se não existir no escopo do número.
        Requer key escopada a número.


        **Requer uma chave com escopo de número.**
      operationId: put_templates_id
      parameters:
        - name: id
          in: path
          required: true
          description: Id ou nome do template a atualizar.
          schema:
            type: string
          example: promo_cupom
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  type: object
                  description: >-
                    Novo conteúdo do template: objeto { header?, body, footer?,
                    buttons? } (recomendado), o mesmo JSON como string, ou texto
                    puro (embrulhado automaticamente).
                  example:
                    body:
                      text: Oi {{nome}}!
                body.header:
                  type: object
                  description: >-
                    Cabeçalho opcional. TEXT: text com 0–1 variável (até 60
                    caracteres). IMAGE/VIDEO/DOCUMENT: informe url (http/https)
                    OU base64 (data URI); base64 é re-hospedado no servidor. Sem
                    cabeçalho de localização.
                  example:
                    type: IMAGE
                    url: https://cdn.loja.com/promo.png
                body.footer:
                  type: object
                  description: Rodapé opcional, até 60 caracteres, sem variáveis.
                  example:
                    text: Promoção por tempo limitado
                body.buttons:
                  type: array
                  description: >-
                    Até 10 botões: QUICK_REPLY (≤ 10; text), URL (≤ 2; text +
                    url estática ou dinâmica com uma variável nomeada no fim,
                    ex.: {{link}}), PHONE_NUMBER (≤ 1; text + phone_number
                    E.164), COPY_CODE (≤ 1; código em example). Quick-reply e
                    CTA podem coexistir.
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        enum:
                          - QUICK_REPLY
                          - URL
                          - PHONE_NUMBER
                          - COPY_CODE
                        description: Tipo do botão.
                      text:
                        type: string
                        description: Rótulo do botão (todos os tipos).
                      url:
                        type: string
                        description: >-
                          Só `URL` — link estático, ou dinâmico com uma variável
                          nomeada no final (ex.:
                          `https://loja.com/promo/{{link}}`).
                      phone_number:
                        type: string
                        description: Só `PHONE_NUMBER` — número a discar, E.164.
                      example:
                        type: array
                        items:
                          type: string
                        description: >-
                          Só `COPY_CODE` — código(s) de exemplo do valor
                          copiável. Num número oficial (Meta) isto é só a
                          amostra que a Meta revisa: a menos que seja uma
                          `{{variável}}`, o código que o cliente copia vai a
                          cada envio em `variables.button_<N>` (N = posição do
                          botão entre todos os botões, começando em 1).
                    required:
                      - type
                  example:
                    - type: QUICK_REPLY
                      text: Quero!
                    - type: URL
                      text: Comprar
                      url: https://loja.com/promo/{{link}}
                examples:
                  type: object
                  description: >-
                    Obrigatório quando há variáveis: mapeia cada variável usada
                    no body/header (e na URL dinâmica) a um valor de amostra. O
                    código do COPY_CODE vai em button.example, não aqui.
                    Faltando → 400 TEMPLATE_EXAMPLES_REQUIRED.
                  additionalProperties:
                    type: string
                  example:
                    nome: Maria
                    desconto: 15%
                    link: abc123
                category:
                  type: string
                  description: Categoria do template (padrão UTILITY).
                  example: MARKETING
                language:
                  type: string
                  description: Idioma do template (padrão pt_BR).
                  example: pt_BR
              required:
                - body
      responses:
        '200':
          description: Atualizar template
          content:
            application/json:
              example:
                id: tpl_01HZX...
                name: promo_cupom
                category: MARKETING
                metaStatus: PENDING
        '400':
          description: >-
            Faltando examples — ou `INVALID_BODY` quando o corpo não é um JSON
            válido
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              examples:
                templateExamplesRequired:
                  summary: TEMPLATE_EXAMPLES_REQUIRED
                  value:
                    code: TEMPLATE_EXAMPLES_REQUIRED
                    details:
                      missing:
                        - nome
                invalidBody:
                  summary: Corpo não é um JSON válido
                  value:
                    error: >-
                      The request body is not valid JSON | O corpo da requisição
                      não é um JSON válido
                    code: INVALID_BODY
        '401':
          description: Header `x-api-key` / `x-api-key-id` ausente ou inválido
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: Unauthorized
        '403':
          description: Chave com escopo de tenant usada em endpoint com escopo de número
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: Tenant-scoped keys cannot call number endpoints
                code: TENANT_SCOPE_NOT_ALLOWED
        '409':
          description: >-
            A Meta recusou editar este template (código 100, subcódigo 2388003
            da Graph — a Meta só permite editar templates rejeitados). Nada
            mudou: o template guardado mantém o corpo e o `metaStatus`
            anteriores. Crie um novo template com a alteração ou envie o
            documento como parâmetro no momento do envio. O `error` é uma frase
            bilíngue `English | Português`; `meta_user_message` é o texto da
            própria Meta, ou `null`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
                    enum:
                      - TEMPLATE_NOT_EDITABLE
                  meta_user_message:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Texto de erro da própria Meta, ou `null` quando a Meta não
                      enviou nenhum.
              example:
                error: >-
                  Meta does not allow editing this template in its current state
                  (only rejected templates can be edited). Create a new template
                  with the change, or send the document at send time. | A Meta
                  não permite editar este template no estado atual (só templates
                  rejeitados podem ser editados). Crie um novo template com a
                  alteração ou envie o documento no momento do envio.
                code: TEMPLATE_NOT_EDITABLE
                meta_user_message: >-
                  Message templates can only be edited if they have been
                  rejected.
        '429':
          description: Limite de taxa excedido
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: Too many requests
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: Sua chave de API ps_
    apiKeyId:
      type: apiKey
      in: header
      name: x-api-key-id
      description: Id da chave de API (alternativa ao x-api-key)

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.