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

# Pareamento remoto (link de conexão)

> Gera um link para que outra pessoa conecte o próprio número. provider=PILOT_STATUS (padrão) exige name + number e devolve um link de pareamento por QR; provider=META devolve um link de Embedded Signup hospedado (a pessoa escolhe o número dentro do diálogo do Facebook, sem name/number).



## OpenAPI

````yaml openapi.pt.json POST /v1/numbers/remote-pairing
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/remote-pairing:
    post:
      tags:
        - Numbers
      summary: Pareamento remoto (link de conexão)
      description: >-
        Gera um link para que outra pessoa conecte o próprio número.
        provider=PILOT_STATUS (padrão) exige name + number e devolve um link de
        pareamento por QR; provider=META devolve um link de Embedded Signup
        hospedado (a pessoa escolhe o número dentro do diálogo do Facebook, sem
        name/number).
      operationId: post_numbers_remote-pairing
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                provider:
                  type: string
                  description: Tipo de link (padrão PILOT_STATUS).
                  example: PILOT_STATUS
                name:
                  type: string
                  description: Obrigatório para PILOT_STATUS; ignorado para META.
                  example: Cliente Acme
                number:
                  type: string
                  description: Obrigatório para PILOT_STATUS; ignorado para META.
                  example: '5511988887777'
                sendViaWhatsApp:
                  type: boolean
                  description: Enviar o link por WhatsApp (PILOT_STATUS). Padrão false.
                  example: 'false'
                redirectUrl:
                  type: string
                  description: URL de redirecionamento após concluir (META).
                  example: https://app.acme.com/done
                externalRef:
                  type: string
                  description: Referência externa opcional para correlação (META).
                  example: customer-42
                linkToApiKey:
                  type: boolean
                  description: >-
                    Obsoleto: aceito e ignorado. Nenhuma API key é alterada e
                    `linkedApiKeyId` é sempre null.
                  example: 'true'
                metaFlow:
                  type: string
                  enum:
                    - embedded
                    - credentials
                  description: >-
                    Só META: `embedded` (padrão) roda o Embedded Signup da Meta
                    na página hospedada; `credentials` coleta as credenciais de
                    uma WABA existente.
                  example: embedded
                settings:
                  type: object
                  description: >-
                    Configurações com que o número NASCE — o mesmo bloco do
                    `PATCH /v1/numbers/{id}`. Vale para os dois providers: no
                    `META` é gravado na linha provisória em que a conexão vai
                    cair. É aqui que se decide o histórico:
                    `settings.historyImportEnabled` tem padrão `true`, o
                    provider entrega o histórico do aparelho uma única vez, logo
                    depois de a pessoa conectar, e mudar a flag depois não o
                    traz de volta nem o desfaz. Valores inválidos respondem `400
                    INVALID_SETTINGS` e nada é criado.
                  properties:
                    historyImportEnabled:
                      type: boolean
                      example: false
                    webhookHistoricalMessages:
                      type: boolean
                      example: false
                    ignoreNewsletters:
                      type: boolean
                      example: false
                    markReadOnSend:
                      type: boolean
                      example: true
                  additionalProperties: true
      responses:
        '201':
          description: >-
            Link de pareamento criado. `META` responde com o `numberId` da linha
            provisória, o link, o `expiresAt` (30 min) e os `settings` com que a
            linha provisória foi criada.
          content:
            application/json:
              examples:
                pilot_status:
                  summary: PILOT_STATUS (QR)
                  value:
                    provider: PILOT_STATUS
                    remotePairingToken: rp_01HZX...
                    remotePairingUrl: https://pilotstatus.com.br/connect/rp_01HZX...
                    numberId: num_01HZX...
                meta:
                  summary: META (Embedded Signup)
                  value:
                    provider: META
                    numberId: num_01HZX...
                    remotePairingUrl: https://connect.pilotstatus.com.br/connect/eyJhbGciOi...
                    expiresAt: '2026-09-16T14:06:38.000Z'
                    settings:
                      historyImportEnabled: true
                      webhookHistoricalMessages: false
                      ignoreNewsletters: false
                      markReadOnSend: true
                      alwaysOnline: null
                      rejectCall: null
                      msgRejectCall: null
                      readMessages: null
                      ignoreGroups: null
                      ignoreStatus: null
                      appliesTo:
                        history: all
                        advanced: none
                        sending: meta
        '400':
          description: >-
            Payload ou parâmetros inválidos — 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:
                validation:
                  summary: Erro de validação
                  value:
                    error: Validation error
                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
        '402':
          description: >-
            Nenhum link foi criado (e, no `META`, nenhum placeholder). Decida
            pelo `code`. No plano Grátis, um número acima da cota do plano
            sempre responde `PLAN_NUMBER_LIMIT_REACHED`, com ou sem saldo na
            carteira ou cartão salvo — o plano Grátis nunca compra um número
            extra sozinho —, e o mesmo vale para um link de um telefone que já
            existe no workspace mas nunca conectou (esse corpo traz só `plan`,
            `maxNumbers` e `currentNumberCount`). Em um plano pago, a recusa só
            acontece quando o número seria um extra que não pode ser custeado (o
            saldo da carteira não cobre o `proratedTotal` e não há cartão
            salvo): `PLAN_NUMBER_LIMIT_REACHED` quando a cota do próprio plano
            está cheia e nenhum extra foi comprado, `INSUFFICIENT_FUNDS` quando
            é mais um extra pago.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    enum:
                      - PLAN_NUMBER_LIMIT_REACHED
                      - INSUFFICIENT_FUNDS
                  code:
                    type: string
                    enum:
                      - PLAN_NUMBER_LIMIT_REACHED
                      - INSUFFICIENT_FUNDS
                  plan:
                    type: string
                  maxNumbers:
                    type: integer
                  currentNumberCount:
                    type: integer
                  extras:
                    type: integer
                    description: Quantos números extras novos a requisição exigiria.
                  proratedTotal:
                    type: number
                    description: >-
                      O valor proporcional desses números extras pelo resto do
                      ciclo.
                  walletBalance:
                    type: number
                  currency:
                    type: string
                    example: BRL
              examples:
                freePlanNewNumber:
                  summary: Plano Grátis — número novo (saldo não resolve)
                  value:
                    error: PLAN_NUMBER_LIMIT_REACHED
                    code: PLAN_NUMBER_LIMIT_REACHED
                    proratedTotal: 14.95
                    currency: BRL
                    walletBalance: 50
                    extras: 1
                    plan: FREE
                    maxNumbers: 1
                    currentNumberCount: 1
                freePlanExistingPhone:
                  summary: Plano Grátis — telefone já existe e nunca conectou
                  value:
                    error: PLAN_NUMBER_LIMIT_REACHED
                    code: PLAN_NUMBER_LIMIT_REACHED
                    plan: FREE
                    maxNumbers: 1
                    currentNumberCount: 1
                insufficientFunds:
                  summary: Plano pago — INSUFFICIENT_FUNDS
                  value:
                    error: INSUFFICIENT_FUNDS
                    code: INSUFFICIENT_FUNDS
                    proratedTotal: 14.95
                    currency: BRL
                    walletBalance: 0
                    extras: 1
                    plan: ON_DEMAND
                    maxNumbers: 3
                    currentNumberCount: 3
        '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.