Skip to main content

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.
O código de ativação é uma credencial. Quem o tiver pode registrar uma conta do WhatsApp na linha. É por isso que só Proprietário e Administrador leem linhas e códigos, e por isso que toda resposta que pode conter um código é enviada com Cache-Control: no-store. Mantenha a chave do tenant no seu backend.

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: price e currency da 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 currentPeriodEnd da 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) ou add_card para 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 POST compra 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_PENDING e é 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, fica RETURNED. 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 para ACTIVE e 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.suspended e phone_line.returned. Uma renovação bem-sucedida envia phone_line.renewed.
A devolução de um número é irreversível. O número volta para o estoque de números da operadora e deixa de ser seu; nada desfaz uma devolução, e não há garantia de que você consiga esse número de novo. A conta do WhatsApp ativada nele continua vinculada a esse número: quem alugá-lo em seguida pode pedir um código de verificação para ele. Mantenha créditos ou um cartão salvo disponíveis.

Cancelamento

DELETE /v1/phone-lines/{id} depende do estado — veja Cancelar uma linha:
  • ACTIVE — sem estorno. A linha continua ACTIVE e utilizável (inclusive para códigos) até currentPeriodEnd, com cancelAtPeriodEnd: true; ela não é renovada e passa a CANCELED no 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 — 409 NOT_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.
Só pode haver um pedido aguardando por linha de cada vez (409 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: limit de 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 o SUPPLIER_UNAVAILABLE por 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 string error traz uma frase em inglês e outra em português separadas por " | "; decida pelo code, nunca pelo texto:
Erros de validação gerados pelas próprias rotas podem incluir um objeto 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.
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.