Comprar e liberar um número
Comprar um número exige duas chamadas: pesquisar um país para ver o que está à venda e depois pedir o número desejado. Tudo aqui precisa de uma chave API com o escopo numbers, e a primeira compra em uma organização exige verificação de identidade.
Pesquisar um país
A pesquisa é sempre restrita a um país, então country_code é obrigatório. Refine ainda mais com number_type, capabilities ou um prefix de dígitos nacionais.
// The search is always country-scoped, so country_code is required.
const page = await bird.numbers.available.list({
country_code: "GB",
capabilities: ["sms", "voice"],
});
for (const candidate of page.data) {
console.log(candidate.number, candidate.number_type);
}# The search is always country-scoped, so country_code is required.
page = client.numbers.available.list(country_code="GB", capabilities=["sms", "voice"])
for candidate in page.data:
print(candidate.number, candidate.number_type)for candidate, err := range client.Numbers.Available.List(context.Background(), bird.NumbersAvailableListParams{
CountryCode: "GB",
Capabilities: []string{"sms", "voice"},
}) {
if err != nil {
log.Fatal(err)
}
fmt.Println(candidate.Number, candidate.NumberType)
}// The search is always country-scoped, so country_code is required.
$page = $bird->numbers->available->list([
'country_code' => 'GB',
'capabilities' => ['sms', 'voice'],
]);
foreach ($page as $candidate) {
echo $candidate->getNumber(), ' ', $candidate->getNumberType(), "\n";
}curl "https://us1.platform.bird.com/v1/numbers/available?country_code=GB" \
-H "Authorization: Bearer bk_us1_..."Use o host regional que corresponde ao prefixo bk_{region}_ da sua chave: https://us1.platform.bird.com ou https://eu1.platform.bird.com.
Cada resultado traz apenas o que você precisa para escolher um:
{
"data": [
{
"number": "+447700900123",
"country_code": "GB",
"number_type": "mobile",
"capabilities": ["sms", "voice"]
}
],
"next_cursor": null,
"prev_cursor": null
}Nosso próprio inventário é retornado primeiro e pagina normalmente. A última página pode incluir números que uma operadora está oferecendo ao vivo, então um número listado há pouco pode já ter sido vendido quando você fizer o pedido.
Para confirmar que um número ainda está disponível antes de comprá-lo, consulte-o com GET /v1/numbers/available/{number}. Um 404 significa que ele não está disponível para venda no momento, seja porque a operadora o retirou ou porque nosso próprio inventário o reservou. A reverificação consome o mesmo limite de requisições numbers_availability da busca, então reverifique apenas o candidato que você vai comprar, não todos os resultados.
Comprar o número
Passe um número da busca para POST /v1/numbers/orders. Para proteção contra novas tentativas, veja Idempotência.
const order = await bird.numbers.orders.create({ number: "+447700900201" });
// Most orders finish inside the request. One that has to wait on a carrier
// comes back without a number_id. Poll it until it is completed or failed.
if (order.status === "completed") {
console.log("allocated as", order.number_id);
} else {
console.log("still", order.status, "; poll", order.id);
}order = client.numbers.orders.create(number="+447700900201")
# Most orders finish inside the request. One that has to wait on a carrier
# comes back without a number_id. Poll it until completed or failed.
if order.status == "completed":
print("allocated as", order.number_id)
else:
print("still", order.status, "; poll", order.id)order, err := client.Numbers.Orders.Create(context.Background(), bird.NumbersOrdersCreateParams{
Number: "+447700900201",
})
if err != nil {
log.Fatal(err)
}
// An order that has to wait on a carrier comes back without a NumberId.
// Poll it until it is completed or failed.
fmt.Println(order.Status, order.Id)$order = $bird->numbers->orders->create(
(new NumbersOrderCreate())->setNumber('+447700900201'),
);
// Most orders finish inside the request. One that has to wait on a carrier
// comes back without a number_id. Poll it until it is completed or failed.
if ($order->getStatus() === 'completed') {
echo 'allocated as ', $order->getNumberId(), "\n";
} else {
echo 'still ', $order->getStatus(), '; poll ', $order->getId(), "\n";
}curl -X POST "https://us1.platform.bird.com/v1/numbers/orders" \
-H "Authorization: Bearer bk_us1_..." \
-H "Content-Type: application/json" \
-d '{"number": "+447700900123"}'A maioria dos pedidos termina dentro da própria requisição e responde 201 com o número já sendo seu:
{
"id": "nor_01m0da22b0e39anhzyhtw3gzdg",
"number": "+447700900123",
"country_code": "GB",
"number_type": "mobile",
"status": "completed",
"number_id": "nda_7eqywfwzxwa1za9n8wp7e1xkr8",
"failure_reason": null,
"completed_at": "2026-08-19T15:25:56.479320Z",
"created_at": "2026-08-19T15:25:56.448051Z",
"updated_at": "2026-08-19T15:25:56.479320Z"
}number_id é o identificador para tudo depois disso: consultar o número e liberá-lo.
Consultar um pedido que não terminou
Um pedido que precisa aguardar uma operadora responde 202, com number_id ainda em null. Consulte-o novamente até que status seja completed ou failed.
const order = await bird.numbers.orders.get("nor_01krdgeqcxet5s7t44vh8rt9mg");
// failure_reason says what went wrong, and only ever on a failed order.
console.log(order.status, order.failure_reason ?? "");order = client.numbers.orders.get("nor_01krdgeqcxet5s7t44vh8rt9mg")
# failure_reason says what went wrong, and only ever on a failed order.
print(order.status, order.failure_reason or "")order, err := client.Numbers.Orders.Get(context.Background(), "nor_01krdgeqcxet5s7t44vh8rt9mg")
if err != nil {
log.Fatal(err)
}
// FailureReason says what went wrong, and only ever on a failed order.
fmt.Println(order.Status)$order = $bird->numbers->orders->get('nor_01krdgeqcxet5s7t44vh8rt9mg');
// failure_reason says what went wrong, and only ever on a failed order.
echo $order->getStatus(), ' ', $order->getFailureReason() ?? '', "\n";curl "https://us1.platform.bird.com/v1/numbers/orders/nor_01m0da22b0e39anhzyhtw3gzdg" \
-H "Authorization: Bearer bk_us1_..."Um pedido passa por charging, ordering e pending antes de se resolver. Em failed, failure_reason diz o que deu errado em termos simples. Uma taxa de ativação já cobrada não é reembolsada, então um pedido com falha pode deixar uma cobrança; entre em contato com o suporte se isso acontecer.
Liberar um número
Liberar encerra a cobrança mensal e o número para de funcionar para você. Apenas um número dedicated pode ser liberado, e um número liberado não volta imediatamente para venda.
// Releasing stops the monthly charge and the number stops working for you.
// Only a dedicated number can be released; a shared one answers E14002.
await bird.numbers.release("nda_01krdgeqcxet5s7t44vh8rt9mg");# Releasing stops the monthly charge and the number stops working for you.
# Only a dedicated number can be released; a shared one answers E14002.
client.numbers.release("nda_01krdgeqcxet5s7t44vh8rt9mg")// Only a dedicated number can be released; a shared one answers E14002.
if err := client.Numbers.Release(context.Background(), "nda_01krdgeqcxet5s7t44vh8rt9mg"); err != nil {
log.Fatal(err)
}// Releasing stops the monthly charge and the number stops working for you.
// Only a dedicated number can be released; a shared one answers E14002.
$bird->numbers->release('nda_01krdgeqcxet5s7t44vh8rt9mg');curl -X DELETE "https://us1.platform.bird.com/v1/numbers/nda_7eqywfwzxwa1za9n8wp7e1xkr8" \
-H "Authorization: Bearer bk_us1_..."Uma liberação bem-sucedida responde 204 sem corpo.
Quando um pedido é recusado
Quatro recusas cobrem quase toda compra com falha.
402 com E03000 significa que a carteira não cobre o número. Adicione saldo e compre novamente. Nenhum pedido é criado, então nada é cobrado.
412 significa que a organização não completou a verificação de identidade que uma primeira compra exige. Complete-a e tente novamente.
409 com E14000 significa que o número foi vendido enquanto você escolhia. Busque novamente e escolha outro.
409 com E14001 significa que muitos dos seus pedidos já estão em andamento. Aguarde um terminar e compre novamente.
Próximos passos
- Visão geral de números explica o que os campos de um número significam.
- Referência da API de números documenta cada operação e campo.
- Idempotência explica como as chaves tornam seguro tentar novamente um pedido.
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico.