Verificar o titular da conta
Alugar uma linha telefônica exige um titular da conta verificado: um CNPJ ou um CPF, uma foto ou PDF do documento que o comprova, e um contato confirmado. Ela é pedida uma única vez por workspace, antes da primeira compra. Estes endpoints fazem isso sem o painel — e é a mesma verificação do painel (Linhas → Comprar linhas): o que você fizer por um caminho aparece no outro.Exige uma chave com escopo de tenant, como todo endpoint
/v1/phone-lines. Com um token OAuth / MCP, só o Proprietário do workspace pode verificar — a permissão é phone_lines:purchase, a mesma da compra —, e qualquer outro papel recebe 403 PERMISSION_DENIED. O estado é enviado com Cache-Control: no-store.Como funciona
1
Envie os dados e o documento
POST /v1/phone-lines/verification com o CNPJ ou CPF, um e-mail de contato, um número de WhatsApp e o arquivo do documento. Conferimos o número (dígitos verificadores; um CNPJ também precisa ser encontrado e estar ativo na Receita), enviamos os códigos de contato, guardamos o arquivo de forma privada e lemos o número impresso nele.2
Confirme os códigos de contato
Cada canal em
contact.requiredChannels recebe um código de 6 dígitos. Confirme cada um com POST …/contact/{channel}/confirm.3
Leia a decisão
Assim que o último código é confirmado e o documento está enviado, a verificação é decidida — nessa mesma resposta:
APPROVED, ou IN_REVIEW quando uma pessoa precisa conferir. Os dois permitem comprar (canPurchase: true). A decisão também é entregue como o evento de webhook phone_line.verification_updated.EMAIL é sempre exigido, enviado para contactEmail. WHATSAPP também é exigido sempre que a Pilot Status está enviando códigos pelo WhatsApp — aí os dois são. contact.requiredChannels diz exatamente quais, e a lista fica congelada quando a verificação começa.
A decisão. APPROVED quando o número lido no documento é o número que você enviou e a Receita pôde ser consultada (CPF não tem essa consulta: o documento decide). Caso contrário, ela espera uma pessoa — IN_REVIEW —, que aprova, recusa ou pede outro documento (NEEDS_DOCUMENT).
Enviar os dados
POST https://pilotstatus.com.br/v1/phone-lines/verification — responde 201 com o estado, em PENDING_CONTACT: os códigos estão a caminho.
string
obrigatório
Qualquer string de até 255 caracteres, sem caracteres de controle — um UUID por envio. Ausente ou em branco → 400
IDEMPOTENCY_KEY_REQUIRED; mais longa, ou com um caractere de controle → 400 IDEMPOTENCY_KEY_INVALID. Veja Idempotência.string
obrigatório
"CNPJ" ou "CPF".string
obrigatório
O CNPJ ou CPF, com ou sem pontuação (
11.222.333/0001-81 ou 11222333000181). CNPJs alfanuméricos são aceitos.string
obrigatório
O e-mail de contato do titular, com até 254 caracteres. Ele recebe um código.
string
obrigatório
O número de WhatsApp do titular no formato internacional — código do país, DDD e número, por exemplo
+55 11 90000-0000; a pontuação é ignorada. Ele recebe um código quando WHATSAPP é exigido.string
obrigatório
O arquivo do documento como data URI em base64:
data:<tipo>;base64,<conteúdo>. Tipos: application/pdf, image/jpeg, image/png, image/webp; no máximo 10 MB de arquivo (cerca de 14 MB depois de codificado). Para CNPJ: cartão CNPJ, contrato social ou comprovante de inscrição. Para CPF: RG, CNH ou comprovante de inscrição no CPF, com o número legível.UNKNOWN_FIELDS. O arquivo é conferido antes de qualquer coisa começar: tipo ou tamanho errado não envia código nem cria nada.
base64 -w0 no Linux, base64 -i arquivo no macOS).
Enviar de novo. Enquanto a verificação ainda está em PENDING_CONTACT, um novo envio a substitui — use para corrigir um erro de digitação: os códigos já enviados deixam de valer e novos são enviados. Depois que ela avançou, um envio responde 409 VERIFICATION_WRONG_STATE (IN_REVIEW ou APPROVED — você já pode comprar — ou NEEDS_DOCUMENT — envie o documento) ou 403 VERIFICATION_REJECTED (fale com o suporte).
Confirmar um código
POST https://pilotstatus.com.br/v1/phone-lines/verification/contact/{channel}/confirm — {channel} é whatsapp ou email, em minúsculas (qualquer outro valor → 400 INVALID_CONTACT_CHANNEL).
string
obrigatório
O código de 6 dígitos recebido nesse canal.
200 com o estado. Quando era o último código exigido e o documento já foi enviado, o estado já traz a decisão.
- Um código expira 10 minutos depois de enviado (400
CONTACT_CODE_EXPIRED). - Um código errado é 400
CONTACT_CODE_INVALIDe conta como tentativa; depois de 5 tentativas erradas o código é bloqueado (429CONTACT_CODE_TOO_MANY_ATTEMPTS) — peça um novo. - Um código só vale uma vez. Repetir uma confirmação que já deu certo responde
CONTACT_CODE_INVALID: nesse caso, leia o estado comGET. - Um canal fora de
requiredChannelsé 400CONTACT_CODE_NOT_REQUIRED. Sem nenhuma verificação, 404VERIFICATION_NOT_FOUND.
Enviar um novo código
POST https://pilotstatus.com.br/v1/phone-lines/verification/contact/{channel}/send — sem corpo. Envia um novo código em um canal exigido e responde 200 com o estado. O novo código substitui o anterior.
Os primeiros códigos são enviados pelo próprio envio dos dados: chame este endpoint para um código que expirou, foi bloqueado ou não chegou.
- No máximo um código por canal a cada 60 segundos, contando o que o envio dos dados mandou (429
CONTACT_CODE_COOLDOWN). - Só enquanto a verificação está em
PENDING_CONTACT(409VERIFICATION_WRONG_STATEdepois disso), e só em um canal derequiredChannels(400CONTACT_CODE_NOT_REQUIRED). - 503
SUPPLIER_UNAVAILABLE: não foi possível colocar o código na fila de envio. Nada conta para o intervalo de 60 segundos — tente de novo.
Enviar um novo documento
POST https://pilotstatus.com.br/v1/phone-lines/verification/document com { "document": "data:…;base64,…" } — as mesmas regras de arquivo do envio dos dados, e conta no mesmo limite de envios. Substitui o documento da verificação atual e responde 200 com o estado.
É aceito em dois estados:
PENDING_CONTACT— para substituir o documento que você enviou. Faça isso quandodocument.statusforUNREADABLEouUNCLEAR: não conseguimos ler do arquivo um número confiável, então envie uma foto mais nítida ou o PDF. Se você confirmar o último código sem substituí-lo, a verificação vai para análise manual (IN_REVIEW,reviewReason: "DOCUMENT_CHECK").NEEDS_DOCUMENT— o revisor pediu outro documento (reviewNotepode dizer qual). Os códigos de contato já foram confirmados, então o novo documento leva a verificação direto a uma nova decisão, nesta mesma resposta.
VERIFICATION_WRONG_STATE; sem nenhuma verificação, 404 VERIFICATION_NOT_FOUND.
Ler o estado
GET https://pilotstatus.com.br/v1/phone-lines/verification responde 200 com o estado da verificação atual do workspace. Antes de qualquer envio:
O objeto de estado
Todos os endpoints desta página respondem com ele.string
NONE, PENDING_CONTACT, IN_REVIEW, APPROVED, NEEDS_DOCUMENT ou REJECTED — veja a tabela abaixo. O webhook phone_line.verification_updated usa os mesmos valores para os quatro últimos.boolean
Se
POST /v1/phone-lines é permitido agora: true para APPROVED e IN_REVIEW.object | null
null para NONE.string
Identifica a verificação — é o
verificationId do evento de webhook, e o que o suporte vai pedir.string
CNPJ ou CPF.string
Mascarado:
**.***.333/0001-** (CNPJ) ou ***.456.789-** (CPF). O número completo nunca é retornado.string | null
A razão social na Receita (CNPJ).
null para CPF, e quando a Receita não pôde ser consultada.string
O e-mail de contato, mascarado (
a***@example.com).string | null
O WhatsApp de contato, mascarado (
+5511****0000).string[]
WHATSAPP e/ou EMAIL: os códigos de que esta verificação precisa.string[]
Os canais exigidos já confirmados.
string[]
Os canais exigidos que ainda esperam o código.
string
RECEIVED, UNREADABLE, UNCLEAR, REQUESTED ou MISSING — veja a tabela abaixo.string | null
Só em
IN_REVIEW: REGISTRY_UNAVAILABLE (não foi possível consultar a Receita) ou DOCUMENT_CHECK (o documento precisa ser conferido). null nos outros casos.string | null
A mensagem do revisor, só em
REJECTED e NEEDS_DOCUMENT. null nos outros casos — e pode ser null nesses também.string
ISO 8601 — quando esta verificação foi enviada.
string
ISO 8601 — a última mudança dela.
Idempotência
O envio dos dados exige umIdempotency-Key, porque tem efeitos que uma nova tentativa não pode repetir às cegas: ele envia os códigos, e um segundo envio substitui o primeiro (os códigos recém-enviados deixam de valer). Durante 24 horas:
- Mesma chave, mesma requisição, a primeira já terminou →
200(não201) com o estado atual do workspace e o headerIdempotent-Replayed: true. Nada é enviado nem lido de novo. - Mesma chave enquanto a primeira ainda está rodando → 409
IDEMPOTENCY_KEY_IN_USE. Aguarde e envie de novo para receber o resultado. - Mesma chave, requisição diferente (qualquer campo, inclusive o arquivo) → 409
IDEMPOTENCY_KEY_REUSED. Use uma chave nova para dados novos. - Uma requisição recusada como um todo (qualquer resposta
4xxou5xx) não guarda nada: a mesma chave pode ser enviada de novo, e roda.
Limites
- 10 envios por hora por workspace, somando o envio dos dados e o de documento → 429
RATE_LIMITED, com o headerRetry-After(em segundos) eretryAfterSecondsno corpo. Uma requisição recusada pela validação antes de rodar — campo, tipo ou arquivo errado — não conta. - Códigos de contato: valem 10 minutos, aceitam 5 tentativas erradas cada, um por canal a cada 60 segundos.
- O arquivo: PDF, JPEG, PNG ou WEBP, com no máximo 10 MB.
Privacidade
O documento é um dado pessoal. Ele fica guardado em um armazenamento privado, só os revisores da Pilot Status podem abri-lo (toda abertura fica registrada), e nenhum endpoint o retorna — nem o número completo do documento, nem o que foi lido do arquivo. As respostas mascaram o número do documento e os contatos, e nunca retornam o nome do titular de um CPF.Erros
O envelope é o mesmo de todo erro das linhas telefônicas:{ "error": "English. | Português.", "code": "…" } — decida pelo code. Erros de validação podem incluir details (unknownFields, maxLength).
Além dos erros de todo endpoint das linhas telefônicas:
401, 403 NUMBER_SCOPE_NOT_ALLOWED, 403 PERMISSION_DENIED, 403 WORKSPACE_MEMBERSHIP_REQUIRED e 500 INTERNAL_ERROR.