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

# Ver a chave de endpoint do Flow

> O par de chaves do endpoint `data_exchange` de UM número: se existe (`configured`), a metade pública (`publicKey`), quando a Meta a aceitou (`uploadedAt`), a URL base para registrar num Flow (`endpointUrl`) e — a parte que não tem outro sintoma — o que a META diz que tem (`metaStatus`).

⛔ `metaStatus` tem QUATRO valores e `UNKNOWN` não é `NOT_SET`. `VALID` é a Meta ter a chave que nós temos; `MISMATCH` é a Meta ter OUTRA, o que quebra em silêncio todos os Flows `data_exchange` do número e não levanta erro nenhum do nosso lado; `NOT_SET` é a Meta responder que não tem chave; `UNKNOWN` é nós não termos conseguido perguntar. Juntar os dois últimos faz um operador rotacionar por causa de um 500 passageiro do Graph — e rotacionar substitui a chave que a Meta tem.

`uploadedAt: null` significa que um par foi gerado aqui mas a Meta nunca o aceitou. Não é o mesmo que não ter chave nenhuma, e é o estado que um `POST` repetido RETOMA em vez de substituir.

A metade PRIVADA nunca está neste payload. `endpointUrl` é uma credencial — embute o token de caminho do endpoint do número — e é por isso que a permissão é `flows:manage` e deliberadamente não `flows:read`. Acrescente o id do Flow como último segmento para obter o `endpoint_uri` de um Flow.

⚠️ O `{id}` do caminho é CONFERIDO contra o número da própria credencial, nunca usado para procurar um. Um id que não bate responde 404 `FLOW_NUMBER_NOT_FOUND` — nunca 403, e com o mesmo corpo quer o id seja de outro tenant, quer de outro número seu, para que um palpite errado não aprenda nada.

**Exige chave com escopo de número.** Uma chave de tenant precisa nomear o número no header `x-whatsapp-number-id`, senão recebe 403 `TENANT_SCOPE_NOT_ALLOWED`.



## OpenAPI

````yaml openapi.pt.json GET /v1/numbers/{id}/flow-endpoint-key
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/numbers/{id}/flow-endpoint-key:
    get:
      tags:
        - Numbers
      summary: Ver a chave de endpoint do Flow
      description: >-
        O par de chaves do endpoint `data_exchange` de UM número: se existe
        (`configured`), a metade pública (`publicKey`), quando a Meta a aceitou
        (`uploadedAt`), a URL base para registrar num Flow (`endpointUrl`) e — a
        parte que não tem outro sintoma — o que a META diz que tem
        (`metaStatus`).


        ⛔ `metaStatus` tem QUATRO valores e `UNKNOWN` não é `NOT_SET`. `VALID` é
        a Meta ter a chave que nós temos; `MISMATCH` é a Meta ter OUTRA, o que
        quebra em silêncio todos os Flows `data_exchange` do número e não
        levanta erro nenhum do nosso lado; `NOT_SET` é a Meta responder que não
        tem chave; `UNKNOWN` é nós não termos conseguido perguntar. Juntar os
        dois últimos faz um operador rotacionar por causa de um 500 passageiro
        do Graph — e rotacionar substitui a chave que a Meta tem.


        `uploadedAt: null` significa que um par foi gerado aqui mas a Meta nunca
        o aceitou. Não é o mesmo que não ter chave nenhuma, e é o estado que um
        `POST` repetido RETOMA em vez de substituir.


        A metade PRIVADA nunca está neste payload. `endpointUrl` é uma
        credencial — embute o token de caminho do endpoint do número — e é por
        isso que a permissão é `flows:manage` e deliberadamente não
        `flows:read`. Acrescente o id do Flow como último segmento para obter o
        `endpoint_uri` de um Flow.


        ⚠️ O `{id}` do caminho é CONFERIDO contra o número da própria
        credencial, nunca usado para procurar um. Um id que não bate responde
        404 `FLOW_NUMBER_NOT_FOUND` — nunca 403, e com o mesmo corpo quer o id
        seja de outro tenant, quer de outro número seu, para que um palpite
        errado não aprenda nada.


        **Exige chave com escopo de número.** Uma chave de tenant precisa nomear
        o número no header `x-whatsapp-number-id`, senão recebe 403
        `TENANT_SCOPE_NOT_ALLOWED`.
      operationId: get_numbers_id_flow_endpoint_key
      parameters:
        - name: id
          in: path
          required: true
          description: >-
            O id do número ao qual a chave está vinculada — o `id` (ou o id da
            instância) que `GET /v1/numbers` devolve. Ele é CONFERIDO contra o
            número da própria credencial, nunca usado para procurar um.
          schema:
            type: string
          example: num_01HZX...
      responses:
        '200':
          description: >-
            O par de chaves do endpoint `data_exchange` do número, como está
            aqui e na Meta. A metade privada nunca vai no payload
          content:
            application/json:
              example:
                configured: true
                publicKey: |
                  -----BEGIN PUBLIC KEY-----
                  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
                  -----END PUBLIC KEY-----
                uploadedAt: '2026-09-02T10:00:00.000Z'
                endpointUrl: https://pilotstatus.com.br/api/flows/endpoint/AbC123...
                metaStatus: VALID
        '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,
            ou o papel da chave não tem `flows:manage`
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: >-
                  This endpoint acts on a single WhatsApp number: send the
                  x-whatsapp-number-id header naming the number to act on (its
                  id or instance id from GET /v1/numbers) | Este endpoint atua
                  sobre um único número de WhatsApp: envie o header
                  x-whatsapp-number-id indicando o número desejado (o id dele ou
                  o id da instância, obtidos em GET /v1/numbers)
                code: TENANT_SCOPE_NOT_ALLOWED
        '404':
          description: >-
            O `{id}` do caminho não é o número ao qual esta credencial está
            vinculada. Nunca 403: o número de outro tenant e outro número seu
            respondem o mesmo corpo, byte a byte, para que um id adivinhado
            nunca seja confirmado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Portuguese half
                  errorEN:
                    type: string
                    description: English half
                  code:
                    type: string
              example:
                error: >-
                  Número não encontrado para esta chave. Esta rota atua sobre o
                  número ao qual a chave está vinculada — use a chave do número
                  em questão, ou o header x-whatsapp-number-id se a chave for de
                  conta.
                errorEN: >-
                  Number not found for this key. This route acts on the number
                  the key is bound to — use that number's key, or the
                  x-whatsapp-number-id header if the key is an account-wide one.
                code: FLOW_NUMBER_NOT_FOUND
        '422':
          description: >-
            O número da chave não é Meta (API Oficial), ou não tem WABA
            associada
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Portuguese half
                  errorEN:
                    type: string
                    description: English half
                  code:
                    type: string
              example:
                error: >-
                  Flows existem apenas em números Meta (API Oficial). O número
                  desta chave não é Meta ou não tem uma WABA associada — use uma
                  chave de um número Meta.
                errorEN: >-
                  Flows only exist on Meta (Cloud API) numbers. This key's
                  number is not a Meta number, or has no WABA behind it — use a
                  key bound to a Meta number.
                code: FLOW_REQUIRES_META_NUMBER
        '429':
          description: Limite de taxa excedido
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    type: string
              example:
                error: Too many requests
        '500':
          description: Erro interno. Nunca carrega a mensagem interna — essa fica no log
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Portuguese half
                  errorEN:
                    type: string
                    description: English half
                  code:
                    type: string
              example:
                error: Erro interno do servidor.
                errorEN: Internal server error.
                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)

````