Comprar linhas telefônicas
POST /v1/phone-lines compra de 1 a 10 números obtidos em GET /v1/phone-lines/available. Cada número vira uma linha telefônica do seu workspace, ACTIVE e com o primeiro mês pago.
Requer uma chave com escopo de tenant. Com um token OAuth / MCP, só o Proprietário do workspace pode comprar (
phone_lines:purchase) — caso contrário, 403 PERMISSION_DENIED. Antes, o titular da conta precisa ser verificado, no painel — veja verificação do titular.Endpoint
POST https://pilotstatus.com.br/v1/phone-lines
Cabeçalhos
string
obrigatório
Qualquer string de até 255 caracteres sem caracteres de controle — um UUID por compra é a escolha comum. Ausente, vazia ou só com espaços em branco → 400
IDEMPOTENCY_KEY_REQUIRED; longa demais ou com caractere de controle → 400 IDEMPOTENCY_KEY_INVALID. Veja Idempotência.Corpo da requisição
string[]
obrigatório
De 1 a 10 números distintos, cada um exatamente como
GET /v1/phone-lines/available o devolveu em number: dígitos E.164 sem o + — 55, um DDD de dois dígitos começando por 1–9 e depois 8 dígitos (551148637200). Números de DDDs diferentes podem ir na mesma requisição.numbers é o único campo aceito. Qualquer outro é recusado com 400 UNKNOWN_FIELDS, que nomeia os campos — em particular, a chave de idempotência não é um campo do corpo (o requestId do painel não existe aqui).
Exemplo
Resposta: 200 com um resultado por número
Os números são independentes. Cada um é cobrado e adquirido separadamente, na ordem em que você os enviou, e um que falha não desfaz os outros. Por isso, nenhum status único descreve a requisição: ela responde 200 quando foi processada, e o resultado de cada número está em results[i].ok.
object[]
Uma entrada por número, na ordem de envio.
string
O número, como você o enviou.
boolean
true quando a linha foi comprada por esta requisição.string
Só quando
ok: true. O id da nova linha, para GET /v1/phone-lines/{id} e para os endpoints de código de ativação.string
Só quando
ok: false. Por que este número falhou — veja a tabela abaixo.string
Só quando
ok: false. Mensagem bilíngue (English | Portuguese) para esse code.Ordem das operações, por número
- Reservar o número sob a sua
Idempotency-Key(veja abaixo). Já reservado →REQUEST_ALREADY_PROCESSED. - Verificar que o número não pertence a nenhuma linha — de nenhum workspace, incluindo o seu — e que não há outra compra dele em andamento → caso contrário,
NUMBER_UNAVAILABLE, nada é cobrado. - Cobrar o preço mensal cheio: primeiro os créditos da carteira, o restante no cartão salvo. Se a etapa do cartão falhar, os créditos já descontados são devolvidos →
PAYMENT_FAILED. - Adquirir o número na operadora. Se isso falhar, o preço cheio é estornado para a sua carteira — inclusive qualquer parte paga com cartão — →
NUMBER_UNAVAILABLEouSUPPLIER_UNAVAILABLE. - Criar a linha:
status: "ACTIVE",currentPeriodEndum mês à frente, e o evento de webhookphone_line.purchased.
PAYMENT_FAILED. Antes, recarregue a carteira — pelo painel (cartão ou PIX) ou com POST /v1/billing/checkout (wallet_topup, só cartão) — ou salve um cartão (add_card).
Erros da requisição inteira
Qualquer resposta diferente de200 significa que nenhum número foi tentado por esta requisição, com uma exceção — 500, veja abaixo. As verificações rodam nesta ordem:
Idempotência
O cabeçalhoIdempotency-Key é obrigatório porque um cliente que recebe timeout nesta requisição não tem outra forma de saber se houve movimentação de dinheiro. O que ele garante, exatamente:
- A chave é rastreada por número, durante uma hora. Antes de qualquer coisa, cada número é registrado sob (seu workspace, a chave, o número). Durante a hora seguinte, enviar de novo a mesma chave com esse número não cobra nada e não compra nada: o item responde
ok: false,REQUEST_ALREADY_PROCESSED. - Uma repetição não devolve o resultado original.
REQUEST_ALREADY_PROCESSEDvolta tanto se a primeira tentativa comprou o número quanto se ela falhou. Para saber qual foi o caso, chameGET /v1/phone-lines: um número comprado está na sua lista. - Um número que falhou fica travado sob essa chave durante a hora. Depois de um
PAYMENT_FAILED, você recarrega e tenta de novo — com uma chave nova, senão a nova tentativa respondeREQUEST_ALREADY_PROCESSED. - Depois da hora, a chave é esquecida. Um número que você comprou passa a responder
NUMBER_UNAVAILABLE(ele é seu — não há segunda cobrança); um número que tinha falhado é tentado de novo. Para repetir um número que falhou, use sempre uma chave nova. - Só os números são protegidos, não a requisição. Enviar a mesma chave com um número diferente compra esse número.
- Uma requisição recusada por inteiro não registra nada. Depois de qualquer
400ou403acima, corrija a requisição e reenvie-a com a mesma chave. - Duplicatas simultâneas. Se dois envios da mesma requisição estiverem em andamento ao mesmo tempo, cada número segue em um deles; o outro recebe
REQUEST_ALREADY_PROCESSEDpara esse número. - Restrita ao seu workspace. A mesma chave enviada por outro workspace nunca colide com a sua.
O registro fica em um cache. Se esse cache estiver indisponível, a proteção deixa de ser aplicada, para não bloquear as compras — dois envios da mesma requisição que cheguem durante uma indisponibilidade dessas podem gerar duas cobranças. Envie cada compra uma única vez e tente de novo só em caso de timeout,
5xx ou erro de rede.Padrão recomendado de retentativa
1
Uma chave por compra
Gere um UUID para cada compra que o usuário fizer e envie-o como
Idempotency-Key. Use um timeout generoso no cliente: os números são processados um após o outro.2
Em timeout, 5xx ou erro de rede
Reenvie o mesmo corpo com a mesma chave. Os números já tratados voltam como
REQUEST_ALREADY_PROCESSED; os que a primeira tentativa não chegou a alcançar são processados agora.3
Reconciliar
Chame
GET /v1/phone-lines e compare por number para saber quais linhas você tem agora.4
Refazer as falhas com uma chave nova
Para os números que falharam (
PAYMENT_FAILED, SUPPLIER_UNAVAILABLE), corrija a causa e envie-os com uma chave nova.Depois da compra
- A linha fica
ACTIVEatécurrentPeriodEnd— um mês após a compra — e depois se renova mês a mês. Veja o ciclo de vida da linha. - Solicite o código de ativação do WhatsApp com
POST /v1/phone-lines/{id}/activations.