Linhas telefônicas
Uma linha telefônica é um número fixo brasileiro que você aluga da Pilot Status para ativar uma conta do WhatsApp Business nele — sem chip envolvido. Quando o WhatsApp verifica o número, ele liga para a linha; nós capturamos essa ligação, transcrevemos e entregamos o código de 6 dígitos pela API, pelo painel e por um webhook. As linhas só recebem: não fazem ligações nem enviam SMS, e um número fixo não recebe SMS — o código sempre chega por ligação. A linha é um produto à parte: comprar uma não cria nem conecta um número de WhatsApp no seu workspace.Todo endpoint
/v1/phone-lines exige uma chave com escopo de tenant (painel Perfil → API). A linha pertence ao workspace, não a um número de WhatsApp, então uma chave com escopo de número recebe 403 NUMBER_SCOPE_NOT_ALLOWED.Endpoints
Os eventos (
phone_line.purchased, phone_line.code_received, …) são entregues aos webhooks das linhas, um cadastro separado dos webhooks dos seus números — veja Webhooks das linhas.
Credenciais e permissões
Uma chave
ps_ clássica não tem usuário e, portanto, não tem papel: sua autoridade é o seu escopo. Um token OAuth ou MCP carrega um usuário, e o token nunca vai além do papel atual desse usuário no workspace:
Um papel sem a permissão recebe 403
PERMISSION_DENIED.
Antes da primeira compra: verificação do titular
Alugar uma linha telefônica exige um titular da conta verificado (CNPJ ou CPF, mais a confirmação de contato). A verificação é feita só no painel — Linhas (/linhas) → Comprar linhas — e é pedida uma única vez, na primeira compra. Não há endpoint de verificação na API pública.
Pela API, um workspace não verificado pode buscar números e tentar comprar; a compra então responde:
As mudanças de estado da verificação também são entregues como o evento de webhook
phone_line.verification_updated.
Preço e pagamento
- R$ 33,90 por linha por mês para workspaces em BRL, US$ 33.90 para workspaces em USD. O preço é congelado em cada linha no momento da compra:
priceecurrencyda linha são o que toda renovação dessa linha cobra. - O primeiro mês é cobrado integralmente na compra — sem cobrança proporcional.
- Cada linha tem seu próprio ciclo, ancorado na data da compra. Ela renova no mesmo dia do mês seguinte; quando esse dia não existe, no último dia do mês, e esse dia mais curto passa a valer daí em diante: comprada em 31/01 → renova em 28/02 (ou 29/02) → 28/03 → 28/04. As datas são calculadas em UTC. O
currentPeriodEndda linha é a próxima renovação. - O pagamento sai primeiro da carteira pré-paga, e o que os créditos não cobrirem é cobrado no seu cartão salvo. Se a etapa do cartão falhar, os créditos já descontados são devolvidos. Recarregue a carteira pelo painel (cartão ou PIX), ou pela API com
POST /v1/billing/checkout—wallet_topup(só cartão) ouadd_cardpara salvar um cartão. - As linhas estão disponíveis em todos os planos, inclusive o Free, sem limite de quantas um workspace pode ter. Um único
POSTcompra no máximo 10. - As linhas compartilham a carteira com o produto WhatsApp. O painel mostra o extrato agrupado por produto.
Ciclo de vida da linha
Prazos:
- A renovação é tentada quando
currentPeriodEndé atingido. O faturamento roda uma vez por hora, então a cobrança — e cada transição abaixo — acontece em até cerca de uma hora depois do respectivo prazo. - Uma renovação que falha leva a linha para
PAYMENT_PENDINGe é tentada de novo a cada 6 horas. Créditos ou um cartão adicionados são aproveitados na próxima tentativa; o botão Pagar tudo do painel tenta de novo na hora. - 2 dias após a falha, a linha fica
SUSPENDED; 1 dia depois, ficaRETURNED. Da primeira cobrança que falhou até perder o número: cerca de 3 dias. - Pagar com atraso mantém a data de aniversário. Quando uma renovação finalmente dá certo — mesmo em
SUSPENDED— a linha volta paraACTIVEe o novo período conta a partir da data original de renovação, não da data do pagamento. - Cada etapa envia um aviso e um evento de webhook:
phone_line.payment_failed(uma vez por renovação, na primeira tentativa que falha),phone_line.suspendedephone_line.returned. Uma renovação bem-sucedida enviaphone_line.renewed.
Cancelamento
DELETE /v1/phone-lines/{id} depende do estado — veja Cancelar uma linha:
ACTIVE— sem estorno. A linha continuaACTIVEe utilizável (inclusive para códigos) atécurrentPeriodEnd, comcancelAtPeriodEnd: true; ela não é renovada e passa aCANCELEDno fim do período. Desfazer um cancelamento agendado só é possível no painel.PAYMENT_PENDING/SUSPENDED— não resta período pago, então a linha é devolvida imediatamente (RETURNED).RETURNED/CANCELED— 409NOT_CANCELABLE.
O fluxo do código de ativação
1
Prepare a linha
POST /v1/phone-lines/{id}/activations (sem corpo). A linha é reiniciada na operadora — assim a gravação de uma ligação anterior nunca é lida como o código desta — e um pedido de código é aberto em WAITING, com uma janela de 5 minutos (pollDeadline). Chame este endpoint antes de pedir ao WhatsApp que ligue.2
Peça ao WhatsApp para ligar para a linha
Registre o número no WhatsApp Business e, quando o WhatsApp perguntar como receber o código, escolha a opção de receber o código por ligação (“Call me” no app em inglês). A linha é fixa: esperar por um SMS só consome a janela.
3
Capturamos e transcrevemos a ligação
Verificamos a linha a cada 15 segundos, aproximadamente, durante a janela. Quando a gravação da ligação aparece, nós a armazenamos, transcrevemos e extraímos o código de 6 dígitos.
4
Leia o código
Consulte
GET /v1/phone-lines/activations/{activationId} a cada poucos segundos até status ser TRANSCRIBED (ou outro estado definitivo), ou assine o webhook phone_line.code_received. Digite o code no WhatsApp.ACTIVATION_IN_PROGRESS). Não há limite de quantos códigos uma linha pode pedir ao longo da vida; cada pedido aberto incrementa o activationCount da linha. Linhas suspensas e encerradas não podem pedir códigos (409 LINE_NOT_ACTIVE). A gravação da ligação só pode ser ouvida no painel. Detalhes completos, status e casos de borda: Códigos de ativação.
Idempotência
POST /v1/phone-lines movimenta dinheiro, por isso exige o header Idempotency-Key. Uma nova tentativa com a mesma chave nunca cobra duas vezes pelo mesmo número dentro de uma hora: o item volta com ok: false e REQUEST_ALREADY_PROCESSED. As regras exatas — inclusive o que uma repetição informa e o que não informa — estão em Comprar linhas telefônicas → Idempotência.
Os outros endpoints não precisam de chave: leituras são seguras, DELETE em uma linha ACTIVE não tem efeito na segunda vez, e um segundo POST …/activations enquanto outro pedido está aguardando responde 409 ACTIVATION_IN_PROGRESS em vez de abrir mais um.
Limites
- De 1 a 10 números por requisição de compra, sem duplicados. Sem limite de linhas por workspace.
- Um pedido de código aguardando por linha.
- Histórico de códigos:
limitde 1–100 por chamada (padrão 20). - As requisições que chegam à nossa operadora — buscar, comprar, pedir um código, cancelar uma linha em atraso — consomem uma cota de requisições compartilhada por toda a plataforma. Quando ela se esgota, elas respondem 503
SUPPLIER_UNAVAILABLE(“Tente de novo em alguns minutos”), ou oSUPPLIER_UNAVAILABLEpor número dentro de uma compra. Busque uma vez por DDD e reutilize o resultado, em vez de consultá-lo repetidamente. - Não há outro limite de taxa específico para estes endpoints.
Erros
Todo corpo de erro tem o mesmo envelope. A stringerror traz uma frase em inglês e outra em português separadas por " | "; decida pelo code, nunca pelo texto:
details (unknownFields, invalidNumbers, maxLength). Os erros de autenticação e de escopo compartilhados por toda a API são a exceção à regra bilíngue: um 401 traz só error (sem code), e os 403 de escopo e de papel trazem um error só em inglês. Outros erros comuns a toda a API também podem aparecer aqui — por exemplo 403 WORKSPACE_ARCHIVED para um workspace arquivado, ou 404 NUMBER_NOT_FOUND quando um header x-whatsapp-number-id não corresponde a nenhum número da sua conta.
Resultados por número de uma compra
POST /v1/phone-lines responde 200 com um resultado por número. Um item que falhou traz code e um error bilíngue, mas nenhum status HTTP próprio — a requisição como um todo foi processada:
Um estorno após uma cobrança sempre vai para a carteira, inclusive qualquer parte que tenha sido paga com cartão. Veja Comprar linhas telefônicas para a semântica completa.
Mensagens de erro exatas
Mensagens de erro exatas
Os erros de validação das próprias rotas (
INVALID_QUERY, INVALID_LIMIT, IDEMPOTENCY_KEY_*, INVALID_BODY, UNKNOWN_FIELDS, INVALID_NUMBERS) montam a mensagem a partir da requisição — ela cita o campo ou os números com problema — e seguem o mesmo padrão English | Portuguese.Só no painel
Estes itens não têm endpoint na API pública; use o painel (Linhas,/linhas):
- Verificação do titular (envio de documento e código de contato).
- Ouvir a gravação da ligação de um pedido de código.
- Desfazer um cancelamento agendado.
- Pagar tudo e Escolher quais linhas manter para linhas em atraso.
- O extrato da carteira agrupado por produto.
- Criar e gerenciar webhooks das linhas e ler o log de entregas deles.