Migrar do Telserv para o Bird
Este guia é para integrações que chamam a API de parceiro Telserv, V1 ou V2, para comprar, rotear e liberar números, e que agora migram para a Bird API.
A Bird API atende todos os produtos Bird, então suas operações de números e voz seguem as convenções do próprio Bird em vez das do Telserv. A maioria das funcionalidades que sua integração usa tem uma chamada Bird correspondente. Os endpoints, payloads, identificadores e autenticação são diferentes, então planeje reescrever a integração. Onde o Bird faz uma tarefa de forma diferente, este guia mostra como.
Este guia é um trabalho em andamento. Ele cobre o que o Bird faz e cresce conforme a migração avança. Se uma operação do Telserv que você usa não está listada aqui, ela ainda precisa de escopo e desenvolvimento antes de ser adicionada; pergunte ao seu contato de migração sobre ela.
Antes de começar
- Uma organização Bird com verificação de identidade concluída, que a primeira compra de número exige.
- Uma chave API com os escopos que as receitas usam:
numbersem nível de escrita para números e pedidos,complianceem nível de escrita para as operações avulsas de documentação de titularidade, evoice_managementem nível de escrita para trunks SIP, números de voz e números verificados. A chamada de teste também precisa devoice:write, e a leitura de legs de chamada precisa devoice:read. - Saldo da carteira. Os pedidos são pagos com a carteira. Quando um pedido é recusado explica as recusas
402e412.
Os números que sua integração gerencia no Telserv não precisam ser comprados novamente. Quando seus números forem movidos para o seu espaço de trabalho Bird, eles aparecem em GET /v1/numbers. Seu contato de migração confirma quando isso acontece. Para obter o identificador nda_ de um número migrado, consulte-o com GET /v1/numbers?number=<digits>, informando os dígitos com o código do país, e guarde o id como NUMBER_ID.
Os exemplos leem sua chave de BIRD_API_KEY e seu host regional de BIRD_API_URL: https://eu1.platform.bird.com para uma chave bk_eu1_, ou https://us1.platform.bird.com para uma chave bk_us1_. As outras variáveis, como TRUNK_ID e NUMBER_ID, guardam um identificador de uma resposta anterior; cada passo nomeia a que ele define.
O que muda no contrato
| Área | API de parceiro Telserv | Bird API |
|---|---|---|
| Autenticação | Cabeçalho X-ApiKey (V2) ou parâmetro apiKey (V1), verificado contra sua lista de IPs permitidos | Authorization: Bearer com uma chave API cujos escopos indicam as áreas de produto que ela pode usar. A lista de IPs permitidos é opcional: configure-a em IP restrictions na chave em API keys |
| Identificadores | Inteiros. Comprar um número atribui a ele um novo id | TypeIDs prefixados como nda_, nor_, vnu_ e spt_. Um número mantém seu id nda_ enquanto estiver alocado a você |
| Números de telefone | Dígitos sem o + inicial | E.164 com o + inicial |
| Paginação | Offsets start e limit, até 1.000 por página | Cursores: limit até 100 (padrão 25), depois starting_after definido como o next_cursor da página anterior. Veja Paginação |
| Erros | errorCode nomeia uma classe de exceção, e 403 cobre recurso não encontrado e muitas falhas de validação | error.code é um código E estável com uma página de documentação e, quando uma recuperação é conhecida, um remediation. Um recurso não encontrado responde 404, uma pré-condição não atendida 412, e entrada inválida 422 com detalhes do campo. Veja Erros |
| Ambientes | LIVE e SANDBOX, cada um com suas próprias chaves | Um único ambiente. Cada pedido compra e cobra por um número real, e cada chamada de teste é uma chamada real |
| Novas tentativas | Sem chave de idempotência | Um cabeçalho Idempotency-Key em escritas. A mesma chave e corpo reproduzem a primeira resposta com Idempotency-Replay: true; a mesma chave com um corpo diferente responde 409. Veja Idempotência |
A Bird API recusa um parâmetro de consulta que não reconhece com 422 e E01029. Remova filtros exclusivos do Telserv, como city, das suas solicitações em vez de enviá-los.
Dois identificadores para um número
Um número com capacidade de voz alocado ao seu espaço de trabalho tem dois registros, cada um com seu próprio identificador:
- A alocação, retornada por
GET /v1/numbers. Seuidcomeça comnda_para um número dedicado e comnal_para um compartilhado, e onumber_idde um pedido é o identificadornda_do número comprado. Use-a para ler, nomear e referenciar o número, e para liberar um número dedicado. - O registro de voz,
vnu_, retornado porGET /v1/voice/numbers. Use-o para ler e alterar para onde vão as chamadas recebidas do número. Um número sem capacidade de voz, como um número apenas de SMS, não tem registro de voz.
As operações de voz recusam um identificador nda_ ou nal_ com 422. Para encontrar o registro de voz de um número, liste os números de voz com search definido como os dígitos do número e pegue a entrada cujo provider.number_id é igual ao id da alocação. Rotear um número para o seu trunk SIP mostra a solicitação, e Gerenciando seus números de telefone cobre a consulta.
O GET /numbers/{dnisId} do Telserv se torna duas leituras no Bird: a alocação para status e documentação de titularidade, e o registro de voz para a rota.
Mapear operações do Telserv para Bird
Cada tabela lista uma tarefa, a chamada do Telserv que a executava e a chamada Bird que a executa agora. As notas abaixo de cada tabela cobrem o que muda na solicitação ou na resposta.
Loja
| Tarefa | Telserv | Bird |
|---|---|---|
| Pesquisar números à venda | GET /shop | GET /v1/numbers/available |
| Consultar um número | GET /shop/{stockDnisId} | GET /v1/numbers/available/{number} |
| Comprar um número | POST /shop/{stockDnisId} | POST /v1/numbers/orders |
| Reservar um número | POST /shop/{stockDnisId}/reserve, GET /shop/reserved | POST /v1/numbers/orders |
- Pesquisa.
country_codeé obrigatório, então uma pesquisa cobre um país.prefixrecebe os dígitos nacionais após o código do país: oprefix=3170do Telserv se tornacountry_code=NL&prefix=70. Filtre por código de área comprefixno lugar decity, e pornumber_typeecapabilitiesno lugar deproductId. - Documentação nos resultados de pesquisa. Cada resultado traz
ownership_registration_requiredno lugar do filtroexcludeNumbersRequireVerification. Um valortruesignifica que o número é cobrado a partir da compra, mas não envia SMS nem transporta chamadas de voz de entrada ou saída até que sua documentação seja aprovada. - Consultar um número. Ele é endereçado pelo seu número E.164.
- Preços. O Telserv retornava
pricing.staticPricingnas leituras detalhadas de um número e de um produto. Na Bird, cada resultado de pesquisa traz o preço para a sua organização empricing:setup_priceno lugar denrc, erecurring_priceporrecurring_periodno lugar demrc, comintervals_per_chargeindicando quantos períodos uma cobrança abrange. Pesquisar e comprar um número com sua referência descreve os campos de preço. - Compra. Envie
numbere umreferenceopcional. O pedido é pago com a sua carteira. A maioria dos pedidos responde201; um pedido que aguarda uma operadora responde202, e você consulta o pedido periodicamente. - Reservar. Fazer o pedido do número o reserva. Verifique um candidato primeiro e depois faça o pedido.
Números
| Tarefa | Telserv | Bird |
|---|---|---|
| Listar seus números | GET /numbers | GET /v1/numbers |
| Ler um número | GET /numbers/{dnisId} | GET /v1/numbers/{number_id} com o id nda_ ou nal_ da alocação, e GET /v1/voice/numbers/{number_id} com o id vnu_ do registro de voz |
| Alterar um número | PATCH /numbers/{dnisId} | PATCH /v1/numbers/{number_id} com o id nda_ ou nal_ da alocação, e PATCH /v1/voice/numbers/{number_id} com o id vnu_ do registro de voz |
| Liberar um número | DELETE /numbers/{dnisId}?requestedCancelDate= | DELETE /v1/numbers/{number_id} ao final do período pago, ou POST /v1/numbers/{number_id}/release agora, ambos com o id nda_ da alocação |
- Listar. A lista contém os números alocados a você agora. Um número liberado que você comprou via Bird permanece visível pelo seu pedido em
GET /v1/numbers/orders. Reconcilie seus números mapeia os filtros. - Ler. Status, documentação de titularidade e preço estão na alocação, e a rota está no registro de voz. O objeto
pricingda alocação, comrecurring_priceporrecurring_periodeintervals_per_charge, substituipricing.staticPricing.mrc, e a lista também o inclui, ao contrário doGET /numbersdo Telserv. - Alterar.
nameereferenceestão na alocação, e a rota está no registro de voz. Defina um codec forçado e um limite de chamadas simultâneas no seu equipamento SIP.destinationDistributionTypepassa a serprioritydo gateway no trunk SIP:FailOveratribui a cada gateway umprioritydiferente, eRoundRobinatribui o mesmo a todos. - Liberar.
DELETEmantém o número até o fim do período já pago e o libera depois.POST …/releaseo libera imediatamente. Nenhum dos dois aceita uma data. Liberar um número mostra ambas as solicitações.
Destinos e perfis
| Tarefa | Telserv | Bird |
|---|---|---|
| Enviar chamadas para equipamento SIP | POST /numbers/{dnisId}/destinations | POST /v1/voice/trunks/{trunk_id}/gateways, depois roteie trunk |
| Encaminhar chamadas para um telefone | POST /numbers/{dnisId}/destinations | Roteie forward |
| Parar de receber chamadas | DELETE /numbers/{dnisId}/destinations | Roteie reject |
| Ler perfis de destino | GET /destinationprofiles, GET /destinationprofiles/{id} | GET /v1/voice/trunks e GET /v1/voice/trunks/{trunk_id}/gateways |
| Aplicar um perfil a um número | POST /numbers/{dnisId}/destinations/profile | Roteie trunk com trunk_id |
- Equipamento SIP. Um gateway pertence ao trunk e atende cada número roteado para ele, então números que precisam de listas de destino diferentes precisam de trunks diferentes.
sortOrderpassa a serpriority. Aplique tempo de toque e janelas de horário no seu equipamento SIP. - Encaminhar. Defina
forward_toeforward_as.forward_todeve ser um dos seus números verificados; um número não verificado responde412comE21053.forward_asescolhe qual número a chamada encaminhada exibe como identificador de chamadas. Um número tem apenas uma rota por vez, então para fazer fallback do equipamento SIP para um número de telefone, encaminhe a chamada a partir do seu equipamento SIP. - Parar de receber chamadas. O número rejeita chamadas até que você o roteie novamente. Para manter um padrão fixo no lugar de um perfil padrão, roteie o número para um trunk que contenha seus gateways padrão.
- Perfis.
distributionTypepassa a serpriority:FailOveratribui a cada gateway umprioritydiferente, eRoundRobinatribui o mesmo a todos. A distribuição é definida por trunk, então números que precisam de distribuição diferente precisam de trunks diferentes. O placeholder{dnis}passa a ser{number}emdestination_format, e umprefixCLIPpassa a ser o texto antes de{number}emorigination_format. - Aplicar um perfil. Um trunk é endereçado pelo seu identificador
spt_, enquanto no Telserv o perfil era endereçado pelo nome.
Documentos e dados do usuário final
| Tarefa | Telserv | Bird |
|---|---|---|
| Ler os requisitos | GET /products/conditions, GET /masterdata/productconditions | GET /v1/compliance/requirements para o número, ou com program e sem subject_id para o formulário que um país exige antes de você ter um número |
| Enviar um documento | POST /numbers/{dnisId}/documents | POST /v1/compliance/attachments, depois cite o anexo na submissão. Veja Enviar a documentação de titularidade |
| Enviar dados do usuário final | POST /numbers/{dnisId}/enduserdata | POST /v1/compliance/submissions, com os documentos, em uma única solicitação. Veja Enviar a documentação de titularidade |
| Substituir um documento | POST /numbers/{dnisId}/documents novamente | POST /v1/compliance/submissions/{submission_id}/resupply com as respostas rejeitadas ou expiradas |
| Verificar andamento da documentação | GET /numbers/{dnisId}/documents | ownership em GET /v1/numbers/{number_id}, e a submissão para o veredito de cada resposta |
- Requisitos. O catálogo de condições do Telserv cobria todos os produtos de uma vez; o Bird lê um formulário por vez. Solicite os requisitos de um número com
subject_kind=number, seu identificadornda_comosubject_ide seucountry_code, ou leia um formulário antes de comprar comprogramdefinido como o tipo de número e semsubject_id. Cada entrada emfieldssubstitui uma condição ou um rótulo de usuário final do Telserv: seukeyé a chave sob a qual você responde, edata_typedocumentmarca uma entrada que exige um arquivo. - Documentos. Envie o arquivo como
multipart/form-datano lugar de umfileContentem base64; Enviar cada documento lista os arquivos aceitos. Enviar o mesmo arquivo duas vezes retorna o mesmo anexo. O upload sozinho não registra nada: quem registra é a submissão que cita oattachment_iddele. - Dados do usuário final e documentos juntos. O Telserv recebia cada documento em uma chamada própria, e os dados do usuário final como uma lista de rótulos em outra. O Bird recebe todas as respostas, digitadas e de documento, em uma única submissão, e não há rascunhos: a solicitação envia as respostas para revisão. Depois, acompanhe
ownership.next, que indica reenvio para correções e uma nova submissão apenas quando necessária (Enviar todas as respostas). - Substituições. Envie apenas as respostas que você substitui, e as demais mantêm sua revisão. O Telserv aceitava um novo arquivo para uma condição enquanto o número aguardava verificação, e o arquivo reiniciava a revisão dessa condição; o Bird substitui uma resposta rejeitada, expirada ou ainda não fornecida, e recusa uma ainda em revisão ou já aceita, exceto uma resposta marcada como
editable_for_verifier_repairenquanto uma correção solicitada por nós estiver aberta (Corrigir uma resposta rejeitada). - Andamento.
ownership.statuseownership.nextinformam a situação do número. Cada resposta tem seu própriostate, e uma resposta rejeitada traz oreasondo revisor. O Bird também envia cada resultado por e-mail aos proprietários da sua organização e à pessoa que enviou ou corrigiu a submissão por último.ownershipcostuma sernullquando o número não exige documentação.
Enviar a documentação de titularidade mostra as solicitações, e Enviar a documentação de titularidade de um número cobre o fluxo completo, incluindo o envio pelo painel e junto com o pedido.
Produtos e dados mestres
| Tarefa | Telserv | Bird |
|---|---|---|
| Explorar produtos | GET /products, GET /products/{productId} | GET /v1/numbers/available, que exige country_code e retorna os números à venda nesse único país. O Bird não tem um catálogo global de produtos, e nada corresponde a productId. Nenhuma API lista os países e tipos de número à venda; a página de preços de números de telefone lista os preços padrão do Bird por país. |
Cada resultado de pesquisa descreve seu produto com number_type, capabilities e ownership_registration_required, e traz o preço para a sua organização no lugar do pricing.staticPricing do produto (nrc e mrc). Os preços padrão do Bird estão na página de preços de números de telefone. O sessionPricing por minuto do Telserv não tem equivalente nessas leituras; as tarifas de voz estão na página de preços de voz.
Os tipos de número do Telserv correspondem ao number_type do Bird assim:
numberType do Telserv | Bird number_type |
|---|---|
DID | local ou national, dependendo do número |
FreePhone | toll_free |
Mobile | mobile |
O que funciona de forma diferente
Estas tarefas do Telserv são feitas de forma diferente no Bird. Planeje-as antes de migrar uma integração que dependa de alguma delas.
- Documentação. Envie os documentos e os dados do usuário final de um número em uma única submissão, sem rascunhos, e corrija respostas rejeitadas com reenvio.
- Reservas. Faça o pedido do número quando tiver escolhido; o pedido já o reserva.
- Configurações de chamada por número. Aplique um codec forçado, um limite de chamadas simultâneas, tempo de toque e janelas de horário no seu equipamento SIP.
- Data de liberação. Bird libera um número no fim do período já pago ou imediatamente, não em uma data que você escolhe. Mantenha do seu lado as datas de cancelamento que você enviou ao Telserv e execute cada uma quando ela chegar.
- Saldo da carteira. Consulte o saldo e faça recarga no painel.
Pesquisar e comprar um número com sua referência
Pesquise um país. Combine number_type, capabilities e prefix para refinar os resultados:
curl "$BIRD_API_URL/v1/numbers/available?country_code=NL&number_type=mobile&capabilities=voice&limit=10" \
--header "Authorization: Bearer $BIRD_API_KEY"Cada resultado traz um objeto pricing com o preço que sua organização paga pelo número, líquido de impostos e na sua moeda de cobrança, com quaisquer preços que você combinou com Bird aplicados:
setup_priceé cobrado uma vez quando você faz o pedido do número. Uma taxa publicada de zero tem umamountde"0". O próprio campo énullquando não há taxa de ativação e também sempre querecurring_priceénull, porque esse número não pode ser pedido.recurring_priceé a tarifa porrecurring_period.intervals_per_chargeindica quantosrecurring_periods uma cobrança abrange. A cobrança recorrente antes de impostos érecurring_pricemultiplicado porintervals_per_charge, cobrada quando o número é atribuído ao seu espaço de trabalho e a cada renovação; a taxa de ativação é separada. Para um pedido que aguarda uma operadora, a atribuição acontece quando o pedido é concluído.
A referência do API mostra um exemplo de resultado. Um resultado com pricing.recurring_price: null não informa um preço recorrente. Fale com vendas para obter um preço para esse país e tipo de número antes de fazer o pedido.
O painel e API usam o mesmo preço da organização, incluindo a conversão para a sua moeda de cobrança. Uma leitura de preço não trava uma cotação: mudanças de tarifa ou de câmbio antes de uma cobrança posterior podem alterar o valor dela. Se a consulta falhar, a pesquisa retorna 503 com E14009. Tente novamente a leitura com backoff exponencial; uma falha na consulta nunca significa que o número não custa nada.
Para confirmar um candidato e seu preço antes de comprá-lo, leia-o com GET /v1/numbers/available/{number}. Um 404 significa que ele não está mais à venda.
Faça o pedido do número com a referência que você usava no Telserv e escolha uma chave de idempotência que você guarda para qualquer nova tentativa desta compra:
curl --request POST "$BIRD_API_URL/v1/numbers/orders" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: order-CUST-778812" \
--data '{"number": "+31612345678", "reference": "CUST-778812"}'Uma resposta 201 tem status: completed e um number_id, o identificador nda_ do número. Guarde-o como NUMBER_ID. Uma resposta 202 significa que o pedido aguarda uma operadora: consulte o pedido até que seu status seja completed ou failed. Uma taxa de ativação já cobrada não é reembolsada se o pedido falhar depois. A referência é definida no número quando o pedido é concluído. Ela comporta até 100 caracteres e não precisa ser única.
Tentar novamente um pedido de um número que seu espaço de trabalho tem alocado retorna o pedido existente, então uma nova tentativa não cobra duas vezes. Comprar e liberar um número explica as recusas.
Para definir ou alterar uma referência depois, envie reference (e opcionalmente name) para PATCH /v1/numbers/{number_id}. Envie null para limpar um campo.
Verificar se um número pode realizar chamadas
Um número cujo status é pending_ownership_registration está alocado e é cobrado, mas não envia SMS e rejeita chamadas de voz de entrada e saída até que a documentação de titularidade seja aprovada. Antes de rotear um número ou fazer uma chamada de teste para ele, leia-o com GET /v1/numbers/{number_id} e verifique se status é active. Se estiver pendente, envie a documentação de titularidade. O status de um número alocado explica cada valor.
Os exemplos abaixo usam um número móvel holandês. Verifique o status do seu próprio número da mesma forma, independentemente do país.
Enviar a documentação de titularidade
O Telserv recebia a documentação de um número com um POST /numbers/{dnisId}/documents por documento e um POST /numbers/{dnisId}/enduserdata para todos os rótulos. O Bird recebe ambos em uma única submissão, depois que você faz o upload dos documentos.
-
Leia o
country_codedo número e guarde-o comoCOUNTRY_CODE. O comando o extrai comjq; se você não usajq, leia-o manualmente:Exemplo de códigoCOUNTRY_CODE=$(curl -s "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \ --header "Authorization: Bearer $BIRD_API_KEY" | jq -r .country_code) -
Leia o que o país do número exige. Cada entrada em
fieldstem okeysob o qual você responde, umdata_typeerequired, que indica se a resposta é obrigatória. Guarde oprogramindicado na resposta comoPROGRAM:Exemplo de códigocurl "$BIRD_API_URL/v1/compliance/requirements?subject_kind=number&subject_id=$NUMBER_ID&country_code=$COUNTRY_CODE" \ --header "Authorization: Bearer $BIRD_API_KEY"Um
422comE19001significa que não há formulário de titularidade para esse país. -
Faça o upload de cada documento que um campo
documentexige, como arquivo em vez defileContentem base64. Guarde oidda resposta, o identificadortca_do anexo, comoATTACHMENT_ID:Exemplo de códigocurl --request POST "$BIRD_API_URL/v1/compliance/attachments" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --form "file=@registration-certificate.pdf" -
Envie todas as respostas de uma vez: uma entrada para cada campo cujo
requiredétruee para cada campo opcional para o qual você tem uma resposta real, com os dados do usuário final comovaluee cada documento comoattachment_id. Omita um campo opcional em vez de inventar um valor para ele. O exemplo mostra duas respostas; adicione as demais obrigatórias antes de enviar. Esta solicitação envia as respostas para análise. Guarde oidda resposta, o identificadorcsb_da submissão, comoSUBMISSION_ID:Exemplo de códigocurl --request POST "$BIRD_API_URL/v1/compliance/submissions" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: ownership-CUST-778812" \ --data '{"subject_kind": "number", "subject_id": "'"$NUMBER_ID"'", "program": "'"$PROGRAM"'", "country_code": "'"$COUNTRY_CODE"'", "answers": [{"key": "business_registration_number", "value": "90012768"}, {"key": "business_registration_certificate", "attachment_id": "'"$ATTACHMENT_ID"'"}]}'Uma resposta
201retorna a submissão. Um422não envia nada: corrija o corpo e envie-o com uma nova chave de idempotência, porque a chave reproduz a recusa. Enviar todas as respostas explica cada recusa. -
Quando um analista rejeitar uma resposta, substitua apenas essa resposta, como descreve Corrigir uma resposta rejeitada:
Exemplo de códigocurl --request POST "$BIRD_API_URL/v1/compliance/submissions/$SUBMISSION_ID/resupply" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: ownership-fix-1-CUST-778812" \ --data '{"answers": [{"key": "business_registration_number", "value": "90012769"}]}'
Para enviar a documentação durante a compra, envie o mesmo answers no bloco compliance de POST /v1/numbers/orders. Esse pedido usa o escopo numbers existente em nível de escrita, inclusive quando inclui documentação.
Acompanhe a análise com ownership.status em GET /v1/numbers/{number_id}. As respostas são uma declaração legal feita em nome da sua empresa, então envie apenas respostas que alguém responsável por elas tenha confirmado. Enviar a documentação de titularidade de um número explica cada solicitação, a análise e o envio junto com o pedido.
Rotear um número para o seu trunk SIP
Um número novo não tem rota própria, então segue a rota padrão do seu espaço de trabalho. Essa rota padrão começa como reject, mas em um espaço de trabalho que já definiu uma, o número novo atende as chamadas por ela assim que é alocado. Para entregar as chamadas dele ao seu equipamento, crie um trunk SIP com chamadas de entrada ativadas, adicione um gateway e aponte o número para o trunk. Trunks SIP explica como conectar seu equipamento ao trunk.
-
Crie o trunk com chamadas de entrada ativadas. Guarde o
idda resposta, o identificadorspt_do trunk, comoTRUNK_ID:Exemplo de códigocurl --request POST "$BIRD_API_URL/v1/voice/trunks" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: trunk-production-pbx" \ --data '{"name": "Production PBX", "inbound_enabled": true}' -
Adicione um gateway. Por padrão, o gateway recebe os números discado e chamador em E.164 com o
+. Se o seu equipamento espera números sem o+, como o placeholder{dnis}do Telserv fazia, definadestination_formatpara o número discado eorigination_formatpara o número chamador como{number}:Exemplo de códigocurl --request POST "$BIRD_API_URL/v1/voice/trunks/$TRUNK_ID/gateways" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --header "Content-Type: application/json" \ --header "Idempotency-Key: gateway-pbx-primary" \ --data '{"sip_uri": "sip:pbx.example.com:5060", "priority": 0, "destination_format": "{number}", "origination_format": "{number}"}'Para failover, adicione um segundo gateway; O que um gateway precisa explica
prioritye os formatos de número. Criar o mesmo gateway novamente sem uma chave de idempotência responde409comE21047. -
Encontre o registro de voz do número. Pesquise com os dígitos do número e pegue o
idda entrada cujoprovider.number_idé oidda alocação. Guarde-o comoVOICE_NUMBER_ID:Exemplo de códigocurl "$BIRD_API_URL/v1/voice/numbers?search=31612345678" \ --header "Authorization: Bearer $BIRD_API_KEY" -
Aponte o número para o trunk:
Exemplo de códigocurl --request PATCH "$BIRD_API_URL/v1/voice/numbers/$VOICE_NUMBER_ID" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --header "Content-Type: application/json" \ --data '{"inbound_configuration": {"route": {"type": "trunk", "trunk_id": "'"$TRUNK_ID"'"}}}'Uma resposta
200mostra a nova rota. Um trunk com chamadas de entrada desativadas responde412comE21052.
Desativar chamadas de entrada em um trunk, ou excluir o trunk, devolve cada número roteado para ele à rota padrão do seu espaço de trabalho, e reativar não restaura essas rotas. Entregar chamadas a um trunk SIP explica isso e as rotas trunk, forward e reject.
Reconciliar seus números
Percorra a lista com o maior tamanho de página. Passe o next_cursor de cada página como NEXT_CURSOR para ler a próxima página, até que next_cursor seja null. A lista não retorna uma contagem total.
curl "$BIRD_API_URL/v1/numbers?limit=100" \
--header "Authorization: Bearer $BIRD_API_KEY"
curl "$BIRD_API_URL/v1/numbers?limit=100&starting_after=$NEXT_CURSOR" \
--header "Authorization: Bearer $BIRD_API_KEY"Os filtros de lista do Telserv mapeiam para os de Bird assim:
Filtro do Telserv em GET /numbers | Filtro de Bird em GET /v1/numbers |
|---|---|
number, que corresponde ao início do número | prefix sem country_code, que corresponde aos dígitos a partir do início do número completo |
prefix, que equivale ao código de acesso e de área, como 3170 | country_code com prefix definido como os dígitos nacionais: country_code=NL&prefix=70 |
reference com um valor parcial | search, que corresponde a parte do número, nome ou referência, ignorando maiúsculas e minúsculas |
reference com um valor exato entre aspas | reference, que retorna os números com essa referência exata. A correspondência diferencia maiúsculas de minúsculas |
| Novo em Bird | number retorna um número completo informado com seu código de país, com ou sem + ou 00: +31612345678, 31612345678 e 0031612345678 encontram o mesmo número |
Encontre um número na sua lista cobre cada filtro em detalhe.
Cada entrada traz pricing, com recurring_price por recurring_period e intervals_per_charge. A menos que um preço esteja fixo para o número, recurring_price é a tarifa atual da sua organização, e cada renovação cobra a tarifa vigente no momento da renovação, de modo que uma cobrança já faturada pode diferir dela. Liste todos os números que você possui explica em qual moeda cada número é cobrado, quando pricing ou seus preços são null e o que fazer quando pricing.error está definido.
Um número liberado sai dessa lista, e lê-lo pelo number_id responde 404. Se você o comprou em Bird, o pedido concluído permanece em GET /v1/numbers/orders.
Liberar um número
As duas solicitações se aplicam a um número dedicado, pelo seu identificador nda_; um número compartilhado é recusado com E14002. Para manter o número até o fim do período que você já pagou, cancele-o:
curl --request DELETE "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: cancel-CUST-778812"Uma resposta 202 retorna o número com releases_at, o fim do período pago. O número mantém seu status atual até lá, sua assinatura não é renovada e ele é liberado nesse momento. Solicitar novamente retorna o mesmo releases_at, e um cancelamento não pode ser desfeito. Um número sem assinatura por trás é liberado imediatamente, e a resposta é 200 com o status do número definido como released.
Para liberar o número agora, incluindo um já agendado para cancelamento:
curl --request POST "$BIRD_API_URL/v1/numbers/$NUMBER_ID/release" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: release-CUST-778812"Uma resposta 204 significa que o número foi liberado, com efeito imediato. O restante do período atual não é reembolsado.
Enquanto um pagamento de renovação do número estiver em atraso, as duas solicitações respondem 409 com E03015 até que ele seja pago.
Nenhuma das solicitações aceita uma data, então mantenha o cronograma que você enviou ao Telserv como requestedCancelDate do seu lado. Para manter um número até a data dele, cancele-o quando a data estiver dentro do período de cobrança atual: ele é liberado quando esse período termina, na data ou depois dela. Para liberá-lo exatamente na data, libere-o nesse dia. Liberar um número explica o que cada solicitação faz com o número, suas cobranças e uma nova tentativa.
Fazer uma chamada de teste para o seu número
Para verificar uma rota de ponta a ponta, faça uma chamada para o número a partir de outro número que seu espaço de trabalho possa apresentar como identificador de chamadas. O país do número precisa estar habilitado nos seus destinos de voz, ou a chamada não é completada. A solicitação abaixo executa uma sequência inline que desliga assim que a chamada é atendida, então nenhuma sequência salva é necessária. Ela faz uma chamada real, e as tarifas normais de chamada se aplicam.
Salve a solicitação como test-call.json. Coloque o identificador de chamadas que você apresenta em from, um número verificado ou de propriedade do seu espaço de trabalho, e o número em teste em to:
{
"from": "+31612345679",
"to": "+31612345678",
"sequence": {
"definition": {
"schema_version": 1,
"expression_environment": "bird.cel.v1",
"nodes": [
{
"id": "entry",
"type": "trigger.start_call",
"type_version": 1,
"config": {},
"input": {},
"connections": { "event": { "node_id": "end", "port": "input" } }
},
{ "id": "end", "type": "voice.hangup", "type_version": 1, "config": {}, "input": {} }
]
},
"entry_node_id": "entry",
"trigger_data": {}
}
}Envie:
curl --request POST "$BIRD_API_URL/v1/voice/calls" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: ${TEST_CALL_KEY:?Set TEST_CALL_KEY once for this test call}" \
--data-binary @test-call.jsonDefina TEST_CALL_KEY com um valor novo para cada teste e reutilize-o ao tentar novamente o mesmo teste após um timeout ou resultado inconclusivo: a mesma chave e solicitação dentro de três horas reproduzem a primeira aceitação em vez de realizar uma segunda chamada. Uma resposta 202 aceita a chamada e retorna seu initial_leg_id. A aceitação não prova que a chamada foi conectada: leia o leg com GET /v1/voice/legs/{leg_id}, ou liste os legs realizados para o número com GET /v1/voice/legs e seu filtro to, e verifique se seu equipamento recebeu a chamada. Criar uma chamada de voz cobre os requisitos de identificador de chamadas e destino e as regras de nova tentativa.
Próximos passos
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico.