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

# Obter entrega do webhook de linha

> Retorna `{ "delivery": { … } }`: os campos da lista mais o `durationMs` e o `responseBody` da última tentativa, e o **`payload` — o corpo exato que foi enviado e assinado, como uma string JSON**, para você conferir o seu código de assinatura contra ele. ⚠️ O payload de um `phone_line.code_received` traz o **código de ativação**, que é uma credencial: a resposta é enviada com `Cache-Control: private, no-store` — não a registre em log. Uma entrega de outro webhook ou workspace, ou um id desconhecido, responde **404 `WEBHOOK_DELIVERY_NOT_FOUND`**.

Permissões: com um token OAuth / MCP, o usuário precisa ser **Proprietário ou Administrador** (`phone_lines:webhooks`) — caso contrário, `403 PERMISSION_DENIED`.

Todo endpoint `/v1/phone-lines` aceita só uma chave **com escopo de tenant**: os webhooks das linhas pertencem ao workspace, não a um número de WhatsApp, então uma chave com escopo de número (ou uma concessão OAuth por número) recebe `403 NUMBER_SCOPE_NOT_ALLOWED` antes de qualquer verificação de papel. Um `403 PERMISSION_DENIED` / `WORKSPACE_MEMBERSHIP_REQUIRED` é enviado com `Cache-Control: no-store`.

Estes são os **webhooks das linhas** — um cadastro separado de `/v1/webhooks`: recebem só eventos `phone_line.*`, e um webhook de número nunca recebe um deles.

**Requer uma chave com escopo de tenant.**

> [!WARNING]
>
> **O `payload` pode conter um código de ativação**, que é uma credencial: quem o tiver pode registrar uma conta do WhatsApp na linha. Não compartilhe nem registre esta resposta em log. Veja [Webhooks das linhas](https://docs.pilotstatus.com.br/pt-BR/api/phone-lines/webhooks.md).


## OpenAPI

````yaml openapi.pt.json GET /v1/phone-lines/webhooks/{id}/deliveries/{deliveryId}
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/phone-lines/webhooks/{id}/deliveries/{deliveryId}:
    get:
      tags:
        - Phone Lines
      summary: Obter uma entrega do webhook
      description: >-
        Retorna `{ "delivery": { … } }`: os campos da lista mais o `durationMs`
        e o `responseBody` da última tentativa, e o **`payload` — o corpo exato
        que foi enviado e assinado, como uma string JSON**, para você conferir o
        seu código de assinatura contra ele. ⚠️ O payload de um
        `phone_line.code_received` traz o **código de ativação**, que é uma
        credencial: a resposta é enviada com `Cache-Control: private, no-store`
        — não a registre em log. Uma entrega de outro webhook ou workspace, ou
        um id desconhecido, responde **404 `WEBHOOK_DELIVERY_NOT_FOUND`**.


        Permissões: com um token OAuth / MCP, o usuário precisa ser
        **Proprietário ou Administrador** (`phone_lines:webhooks`) — caso
        contrário, `403 PERMISSION_DENIED`.


        Todo endpoint `/v1/phone-lines` aceita só uma chave **com escopo de
        tenant**: os webhooks das linhas pertencem ao workspace, não a um número
        de WhatsApp, então uma chave com escopo de número (ou uma concessão
        OAuth por número) recebe `403 NUMBER_SCOPE_NOT_ALLOWED` antes de
        qualquer verificação de papel. Um `403 PERMISSION_DENIED` /
        `WORKSPACE_MEMBERSHIP_REQUIRED` é enviado com `Cache-Control: no-store`.


        Estes são os **webhooks das linhas** — um cadastro separado de
        `/v1/webhooks`: recebem só eventos `phone_line.*`, e um webhook de
        número nunca recebe um deles.


        **Requer uma chave com escopo de tenant.**
      operationId: get_phone_lines_webhooks_id_deliveries_deliveryid
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          example: cmh1w8b2k0001wh8example3d
          description: >-
            O `id` do webhook (de `GET /v1/phone-lines/webhooks` ou da resposta
            da criação).
        - name: deliveryId
          in: path
          required: true
          schema:
            type: string
          example: cmh1w9c4m0002dl8example5f
          description: >-
            O `id` da entrega (da lista de entregas, ou o `id` que o seu
            endpoint recebeu).
      responses:
        '200':
          description: A entrega completa
          content:
            application/json:
              schema:
                type: object
                properties:
                  delivery:
                    type: object
                    properties:
                      id:
                        type: string
                        description: >-
                          O id da entrega — o mesmo `id` (e cabeçalho
                          `Idempotency-Key`) que o seu endpoint recebeu.
                        example: cmh1w9c4m0002dl8example5f
                      event:
                        type: string
                        example: phone_line.code_received
                      status:
                        type: string
                        enum:
                          - PENDING
                          - DELIVERED
                          - FAILED
                        description: >-
                          `PENDING` (ainda em tentativas), `DELIVERED` ou
                          `FAILED` (tentativas esgotadas, ou o webhook foi
                          pausado).
                        example: DELIVERED
                      attempts:
                        type: integer
                        description: Tentativas até agora (no máximo 6).
                        example: 1
                      responseStatus:
                        type:
                          - integer
                          - 'null'
                        description: >-
                          Status HTTP da última tentativa, `null` quando não
                          houve resposta HTTP.
                        example: 200
                      lastError:
                        type:
                          - string
                          - 'null'
                        description: >-
                          Por que a última tentativa falhou, `null` quando não
                          falhou.
                        example: null
                      createdAt:
                        type: string
                        format: date-time
                        example: '2026-10-27T14:11:51.000Z'
                      deliveredAt:
                        type:
                          - string
                          - 'null'
                        format: date-time
                        example: '2026-10-27T14:11:52.000Z'
                      durationMs:
                        type:
                          - integer
                          - 'null'
                        description: >-
                          Quanto a última tentativa levou, até os cabeçalhos da
                          resposta. `null` quando não houve requisição.
                        example: 184
                      responseBody:
                        type:
                          - string
                          - 'null'
                        description: >-
                          O corpo da resposta da última tentativa, até 1000
                          caracteres. `null` quando não houve resposta HTTP.
                        example: ok
                      payload:
                        type: string
                        description: >-
                          O **corpo exato que foi enviado e assinado**, como uma
                          **string** JSON — calcule o HMAC sobre ela para
                          conferir o seu código de assinatura. ⚠️ O payload de
                          um `phone_line.code_received` traz o código de
                          ativação, que é uma credencial.
                        example: >-
                          {"id":"cmh1w9c4m0002dl8example5f","event":"phone_line.code_received","createdAt":"2026-10-27T14:11:51.000Z","data":{"lineId":"cmg5k2l1n0001pl8example9x","number":"551148637200","name":"Suporte
                          SP","activationId":"cmg5k3a7c0002ac8example4q","code":"123456","failureReason":null,"audioUrl":"https://pilotstatus.com.br/v1/phone-lines/activations/cmg5k3a7c0002ac8example4q/audio"}}
              example:
                delivery:
                  id: cmh1w9c4m0002dl8example5f
                  event: phone_line.code_received
                  status: DELIVERED
                  attempts: 1
                  responseStatus: 200
                  lastError: null
                  createdAt: '2026-10-27T14:11:51.000Z'
                  deliveredAt: '2026-10-27T14:11:52.000Z'
                  durationMs: 184
                  responseBody: ok
                  payload: >-
                    {"id":"cmh1w9c4m0002dl8example5f","event":"phone_line.code_received","createdAt":"2026-10-27T14:11:51.000Z","data":{"lineId":"cmg5k2l1n0001pl8example9x","number":"551148637200","name":"Suporte
                    SP","activationId":"cmg5k3a7c0002ac8example4q","code":"123456","failureReason":null,"audioUrl":"https://pilotstatus.com.br/v1/phone-lines/activations/cmg5k3a7c0002ac8example4q/audio"}}
          headers:
            Cache-Control:
              schema:
                type: string
              example: no-store
        '401':
          description: >-
            Credencial ausente ou inválida (`x-api-key`, `x-api-key-id` ou
            `Authorization: Bearer`). O corpo traz só `error`, sem `code`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              examples:
                missing:
                  summary: Sem credencial
                  value:
                    error: >-
                      Missing x-api-key, x-api-key-id or Authorization Bearer
                      token
                invalid:
                  summary: API key inválida
                  value:
                    error: Invalid API key
        '403':
          description: >-
            Chave com escopo de número (`NUMBER_SCOPE_NOT_ALLOWED`), token
            OAuth/MCP de um usuário que não é Proprietário nem Administrador
            (`PERMISSION_DENIED`) ou que não é mais membro ativo
            (`WORKSPACE_MEMBERSHIP_REQUIRED`), ou workspace arquivado
            (`WORKSPACE_ARCHIVED`). `TENANT_REQUIRED`: credencial sem workspace
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              examples:
                numberScope:
                  summary: Chave com escopo de número
                  value:
                    error: This endpoint requires a tenant-scoped API key
                    code: NUMBER_SCOPE_NOT_ALLOWED
                permissionDenied:
                  summary: Usuário OAuth/MCP que não é Proprietário nem Administrador
                  value:
                    error: >-
                      Your workspace role does not allow this action
                      (phone_lines:webhooks).
                    code: PERMISSION_DENIED
                notMember:
                  summary: Usuário OAuth/MCP que não é mais membro
                  value:
                    error: >-
                      The user behind this token is not an active member of this
                      workspace.
                    code: WORKSPACE_MEMBERSHIP_REQUIRED
                archived:
                  summary: Workspace arquivado
                  value:
                    error: >-
                      This workspace has been archived and its API is closed. |
                      Este workspace foi arquivado e sua API está encerrada.
                    code: WORKSPACE_ARCHIVED
                tenantRequired:
                  summary: Credencial sem workspace
                  value:
                    error: This credential is not bound to a workspace.
                    code: TENANT_REQUIRED
        '404':
          description: >-
            Nenhuma entrega com esse id neste webhook do seu workspace
            (`WEBHOOK_DELIVERY_NOT_FOUND`)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: >-
                  Webhook delivery not found. | Entrega do webhook não
                  encontrada.
                code: WEBHOOK_DELIVERY_NOT_FOUND
        '500':
          description: Falha inesperada (`INTERNAL_ERROR`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: Unexpected error. | Erro inesperado.
                code: INTERNAL_ERROR
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.