Skip to main content

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.
Efeito colateral real: esta chamada cobra dinheiro. Cada número custa o preço mensal cheio (R$ 33,90 ou US$ 33.90), descontado primeiro dos créditos da sua carteira e depois do seu cartão salvo.

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.
Um 200 não significa que você comprou alguma coisa. Todos os itens podem ter falhado. Sempre leia results.
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

  1. Reservar o número sob a sua Idempotency-Key (veja abaixo). Já reservado → REQUEST_ALREADY_PROCESSED.
  2. 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.
  3. 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.
  4. 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_UNAVAILABLE ou SUPPLIER_UNAVAILABLE.
  5. Criar a linha: status: "ACTIVE", currentPeriodEnd um mês à frente, e o evento de webhook phone_line.purchased.
A cobrança acontece antes da aquisição de propósito: a venda do número pela operadora não pode ser desfeita, e um estorno para você é instantâneo. Não há link de checkout aqui (diferente dos números extras): sem créditos e sem cartão salvo, o item falha com 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 de 200 significa que nenhum número foi tentado por esta requisição, com uma exceção — 500, veja abaixo. As verificações rodam nesta ordem:
Um 500 ou um timeout não prova que nada aconteceu. Os números são processados um após o outro, e uma falha no meio do caminho pode vir depois que números anteriores já foram cobrados e comprados. Repita a mesma requisição com a mesma Idempotency-Key e depois liste suas linhas com GET /v1/phone-lines para ver quais números são seus.

Idempotência

O cabeçalho Idempotency-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_PROCESSED volta tanto se a primeira tentativa comprou o número quanto se ela falhou. Para saber qual foi o caso, chame GET /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 responde REQUEST_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 400 ou 403 acima, 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_PROCESSED para 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