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

# Quickstart

> Do zero à primeira notificação certificada, com o laudo em mãos. Quatro chamadas.

Quatro chamadas separam uma credencial nova de uma notificação extrajudicial certificada, com laudo.
As três primeiras não custam nada.

<Note>
  **A terceira chamada envia de verdade.** Não há ambiente de teste, veja
  [Ambiente](/api/introducao#ambiente). Use um número seu até ter certeza do formato.
</Note>

<Steps>
  <Step title="Pegue sua credencial">
    Em [Conta → API Keys](https://pombo.digital/conta/api-keys), crie uma credencial. O segredo completo
    aparece uma única vez.

    ```bash theme={null}
    export POMBO_API_KEY="sk_live_..."
    ```

    Confirme que ela funciona antes de seguir. Um `404` aqui é boa notícia: significa que a credencial
    autenticou e o identificador é que não existe.

    ```bash theme={null}
    curl https://pombo.digital/api/integrations/v1/templates/PBD_TPL_000000000000000000000000000 \
      -H "Authorization: Bearer $POMBO_API_KEY"
    ```
  </Step>

  <Step title="Leia o modelo">
    O texto do envio vem sempre de um modelo, e é do modelo que saem **as chaves de `parameters`**. Por
    isso esta chamada não é opcional: sem ela você não consegue montar a próxima.

    Para começar sem preparar nada, use este modelo **pré-aprovado**, disponível para qualquer
    organização:

    ```
    PBD_TPL_01KH95AJW64MRQGCMJJX8P16BN
    ```

    É um modelo de cobrança por WhatsApp, só texto, já aprovado. Serve para o quickstart inteiro.

    <Note>
      No painel esse modelo aparece como **Pré-aprovado**. Na API o valor é
      `template_status: "APPROVED"` com `template_origin: "SYSTEM"`: não existe um status
      `PRE_APPROVED`. É a mesma coisa com dois nomes.
    </Note>

    <CodeGroup>
      ```python Python theme={null}
      import os, requests

      BASE = "https://pombo.digital/api/integrations/v1"
      AUTH = {"Authorization": f"Bearer {os.environ['POMBO_API_KEY']}"}
      TEMPLATE_ID = "PBD_TPL_01KH95AJW64MRQGCMJJX8P16BN"

      template = requests.get(f"{BASE}/templates/{TEMPLATE_ID}", headers=AUTH).json()

      print(template["channel"])           # "whatsapp"
      print(template["template_status"])   # "APPROVED"
      print(template["variables"])         # as chaves de parameters
      ```

      ```bash cURL theme={null}
      curl "https://pombo.digital/api/integrations/v1/templates/PBD_TPL_01KH95AJW64MRQGCMJJX8P16BN" \
        -H "Authorization: Bearer $POMBO_API_KEY"
      ```
    </CodeGroup>

    <Accordion title="Usar um modelo seu">
      Os modelos da sua organização ficam em
      [Conta → Modelos](https://pombo.digital/conta/modelos). Abra o modelo e copie o `template_id`.
      Ele também está na URL da página, no formato `/conta/modelos/PBD_TPL_...`.

      Você também pode criar um com `POST /templates`. Se fizer isso, **guarde o `template_id` que a
      resposta devolve**: a API não lista modelos, então esse é o único momento em que você o recebe. Em
      WhatsApp o modelo novo ainda precisa da aprovação da Meta antes do primeiro envio.

      Para enviar por **e-mail** você vai precisar de um modelo seu com `channel: "email"`.
    </Accordion>

    O campo `variables` vem assim:

    ```json theme={null}
    {
      "{{1}}": { "variable_name": "nome_destinatario", "variable_example": "Fernando" }
    }
    ```

    A chave de `parameters` é **o marcador literal**, `"{{1}}"`. Não é o índice e não é o
    `variable_name`.
  </Step>

  <Step title="Envie">
    <Warning>
      Esta chamada entrega uma mensagem real e desconta um envio do saldo. Use um número seu.
    </Warning>

    Os sete `parameters` abaixo são as variáveis do modelo pré-aprovado do passo anterior. Troque
    `recipient_phone`, `recipient_full_name` e `recipient_tax_id` pelos seus dados e o corpo está pronto.

    <CodeGroup>
      ```python Python theme={null}
      import os, uuid, requests

      BASE = "https://pombo.digital/api/integrations/v1"

      notification = requests.post(
          f"{BASE}/notifications",
          headers={
              "Authorization": f"Bearer {os.environ['POMBO_API_KEY']}",
              "Idempotency-Key": f"quickstart-{uuid.uuid4()}",
          },
          json={
              "template_id": "PBD_TPL_01KH95AJW64MRQGCMJJX8P16BN",
              "channel": "WHATSAPP",
              "recipient_full_name": "Maria Souza",
              "recipient_tax_id": "12345678901",
              "recipient_tax_id_type": "CPF",
              "recipient_phone": "+5511999998888",
              "sender": {
                  "name": "Sua Empresa Ltda",
                  "tax_id": "00000000000191",
                  "tax_id_type": "CNPJ",
              },
              "parameters": {
                  "{{1}}": "Maria",
                  "{{2}}": "R$ 1.200,00",
                  "{{3}}": "parcela em atraso",
                  "{{4}}": "5",
                  "{{5}}": "Sua Empresa Ltda",
                  "{{6}}": "00.000.000/0001-91",
                  "{{7}}": "contato@suaempresa.com.br",
              },
          },
      ).json()

      notification_id = notification["notification_id"]
      ```

      ```bash cURL theme={null}
      curl -X POST "https://pombo.digital/api/integrations/v1/notifications" \
        -H "Authorization: Bearer $POMBO_API_KEY" \
        -H "Content-Type: application/json" \
        -H "Idempotency-Key: quickstart-0001" \
        -d '{
          "template_id": "PBD_TPL_01KH95AJW64MRQGCMJJX8P16BN",
          "channel": "WHATSAPP",
          "recipient_full_name": "Maria Souza",
          "recipient_tax_id": "12345678901",
          "recipient_tax_id_type": "CPF",
          "recipient_phone": "+5511999998888",
          "sender": {
            "name": "Sua Empresa Ltda",
            "tax_id": "00000000000191",
            "tax_id_type": "CNPJ"
          },
          "parameters": {
            "{{1}}": "Maria",
            "{{2}}": "R$ 1.200,00",
            "{{3}}": "parcela em atraso",
            "{{4}}": "5",
            "{{5}}": "Sua Empresa Ltda",
            "{{6}}": "00.000.000/0001-91",
            "{{7}}": "contato@suaempresa.com.br"
          }
        }'
      ```
    </CodeGroup>

    Guarde o `notification_id`. É por ele que você acompanha a entrega e baixa o laudo, e a API não tem
    listagem para recuperá-lo depois.

    <Note>
      **Para enviar um anexo**, o arquivo viaja nesta mesma chamada, em `multipart/form-data`. Em
      WhatsApp o anexo exige um modelo `DOCUMENT` ou `IMAGE`: o pré-aprovado deste guia é só texto e
      recusa o arquivo. As partes, os tipos aceitos e os limites estão em
      [Cria uma notificação extrajudicial](/api-reference/notificações/cria-uma-notificação-extrajudicial).
    </Note>

    <Accordion title="Enviar por e-mail">
      Troque `channel` por `"EMAIL"` e `recipient_phone` por `recipient_email`. E-mail exige um modelo
      seu com `channel: "email"`: o modelo pré-aprovado acima é de WhatsApp.

      O endereço de origem é resolvido pelo Pombo. Sem endereço dedicado verificado, o e-mail sai do
      endereço compartilhado do Pombo, que é o caso comum. Se a organização já verificou um endereço
      próprio, passa a haver mais de um endereço utilizável e o envio é recusado com
      `422 SENDER_CHOICE_REQUIRED`. Nesse caso, fale com o suporte do Pombo.
    </Accordion>
  </Step>

  <Step title="Acompanhe e baixe o laudo">
    Não há notificação ativa de eventos: o acompanhamento é por consulta, até o status ser terminal.

    ```python Python theme={null}
    import time

    while True:
        n = requests.get(f"{BASE}/notifications/{notification_id}", headers=AUTH).json()
        status = n["notification_delivery_status"]
        print(status)
        if status in ("DELIVERED", "READ", "FAILED"):
            break
        time.sleep(5)

    laudo = requests.get(
        f"{BASE}/notifications/{notification_id}/report/download", headers=AUTH
    )
    open("laudo.pdf", "wb").write(laudo.content)
    ```

    Leia **`notification_delivery_status`**, não `notification_status`. O segundo descreve o
    processamento interno e não acompanha a entrega.

    Os eventos certificados (`sent`, `delivered`, `read` e `failed`) vêm com sua atestação, com
    `proof_hash` e `certified_at`. `enqueued` não é certificado: `attestation` é sempre `null` nele.
    É isso que o laudo consolida.

    <Warning>
      A certificação é assíncrona e conclui **depois** de `notification_delivery_status` chegar ao estado
      final. Se você parar de consultar assim que o estado for terminal, pode ler `attestation: null` em
      eventos que ainda vão ser certificados. Continue consultando até a atestação aparecer, ou baixe o
      laudo, que só é montado quando está completo.
    </Warning>
  </Step>
</Steps>

## Deu errado?

Dois tropeços são deste caminho em particular:

| O que você viu                     | O que fazer                                                                                                               |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `400` com `MISSING_REQUIRED_FIELD` | A mensagem lista o que falta. `sender` também é obrigatório, mas a sua ausência devolve `INVALID_SENDER`, não este código |
| `422` com `TEMPLATE_NOT_APPROVED`  | O modelo precisa estar `APPROVED`. O pré-aprovado acima já está                                                           |

Todos os outros estão em [Erros](/api/erros), com o envelope, a ordem de validação e a ação sugerida
para cada status.

## Depois daqui

<CardGroup cols={2}>
  <Card title="Idempotência" icon="refresh-cw" href="/api/idempotencia">
    Como repetir uma chamada sem enviar duas vezes.
  </Card>

  <Card title="Glossário" icon="book" href="/comecar/glossario">
    Laudo, atestação, modelo, remetente: o vocabulário do Pombo.
  </Card>
</CardGroup>
