Migrar de Telserv a Bird
Esta guía es para integraciones que llaman a la API de socio de Telserv, V1 o V2, para comprar, enrutar y liberar números, y que ahora migran a la Bird API.
La Bird API sirve a todos los productos de Bird, así que sus operaciones de números y voz siguen las convenciones propias de Bird en lugar de las de Telserv. La mayoría de las funciones que usa tu integración tienen una llamada equivalente en Bird. Los endpoints, payloads, identificadores y la autenticación son distintos, así que planifica reescribir la integración. Donde Bird hace una tarea de forma diferente, esta guía muestra cómo.
Esta guía es un trabajo en curso. Cubre lo que Bird hace hoy y crece a medida que avanza la migración. Si una operación de Telserv que usas no aparece aquí, aún necesita alcance y trabajo antes de poder añadirse; consulta con tu contacto de migración.
Antes de empezar
- Una organización de Bird con verificación de identidad completada, que la primera compra de número requiere.
- Una clave de API con los alcances que usan las recetas:
numberscon nivel de escritura para números y pedidos,compliancecon nivel de escritura para las operaciones independientes de documentación de titularidad, yvoice_managementcon nivel de escritura para trunks de SIP, números de voz y números verificados. La llamada de prueba también necesitavoice:write, y la lectura de tramos de llamada necesitavoice:read. - Saldo del monedero. Los pedidos se cobran del monedero. Cuando un pedido es rechazado explica los rechazos
402y412.
Los números que tu integración gestiona en Telserv no necesitan comprarse de nuevo. Una vez que tus números se trasladan a tu espacio de trabajo de Bird, aparecen en GET /v1/numbers. Tu contacto de migración confirma cuándo ocurre. Para obtener el identificador nda_ de un número trasladado, búscalo con GET /v1/numbers?number=<digits> indicando los dígitos con su código de país, y guarda el id como NUMBER_ID.
Los ejemplos leen tu clave de BIRD_API_KEY y su host regional de BIRD_API_URL: https://eu1.platform.bird.com para una clave de bk_eu1_, o https://us1.platform.bird.com para una clave de bk_us1_. Las demás variables, como TRUNK_ID y NUMBER_ID, contienen un identificador de una respuesta anterior; cada paso indica cuál establece.
Qué cambia en el contrato
| Área | API de socio de Telserv | Bird API |
|---|---|---|
| Autenticación | Cabecera X-ApiKey (V2) o parámetro apiKey (V1), verificados contra tu lista de IPs permitidas | Authorization: Bearer con una clave API cuyos alcances nombran las áreas de producto que puede usar. La lista de IPs permitidas es opcional: configúrala en IP restrictions de la clave en Claves API |
| Identificadores | Enteros. Comprar un número le asigna un nuevo id | TypeIDs con prefijo como nda_, nor_, vnu_ y spt_. Un número conserva su id nda_ mientras esté asignado a ti |
| Números de teléfono | Dígitos sin + inicial | E.164 con el + inicial |
| Paginación | Desplazamientos start y limit, hasta 1000 por página | Cursores: limit hasta 100 (por defecto 25), luego starting_after con el valor de next_cursor de la página anterior. Consulta Paginación |
| Errores | errorCode nombra una clase de excepción, y 403 cubre un recurso inexistente y muchos errores de validación | error.code es un código E estable con una página de documentación y, cuando se conoce una recuperación, un remediation. Un recurso inexistente responde 404, una precondición no cumplida 412, y una entrada no válida 422 con detalles de campo. Consulta Errores |
| Entornos | LIVE y SANDBOX, cada uno con sus propias claves | Un solo entorno. Cada pedido compra y cobra un número real, y cada llamada de prueba es una llamada real |
| Reintentos | Sin clave de idempotencia | Un encabezado Idempotency-Key en las escrituras. La misma clave y cuerpo reproducen la primera respuesta con Idempotency-Replay: true; la misma clave con un cuerpo diferente responde 409. Consulta Idempotencia |
La Bird API rechaza un parámetro de consulta que no reconoce con 422 y E01029. Elimina de tus solicitudes los filtros exclusivos de Telserv como city en lugar de enviarlos tal cual.
Dos identificadores para un mismo número
Un número con capacidad de voz asignado a tu espacio de trabajo tiene dos registros, cada uno con su propio identificador:
- La asignación, devuelta por
GET /v1/numbers. Suidempieza pornda_para un número dedicado y pornal_para uno compartido, y elnumber_idde un pedido es el identificadornda_del número que compró. Úsala para leer, nombrar y referenciar el número, y para liberar uno dedicado. - El registro de voz,
vnu_, devuelto porGET /v1/voice/numbers. Úsalo para leer y cambiar adónde van las llamadas entrantes del número. Un número sin capacidad de voz, como un número solo de SMS, no tiene registro de voz.
Las operaciones de voz rechazan un identificador nda_ o nal_ con 422. Para encontrar el registro de voz de un número, lista los números de voz con search configurado con los dígitos del número y toma la entrada cuyo provider.number_id sea igual al id de la asignación. Enrutar un número a tu trunk SIP muestra la solicitud, y Gestión de tus números de teléfono cubre la búsqueda.
El GET /numbers/{dnisId} de Telserv se convierte en dos lecturas en Bird: la asignación para el estado y la documentación de titularidad, y el registro de voz para la ruta.
Correspondencia de operaciones de Telserv con Bird
Cada tabla lista una tarea, la llamada de Telserv que la realizaba y la llamada de Bird que la realiza ahora. Las notas debajo de cada tabla cubren lo que cambia en la solicitud o la respuesta.
Compra
| Tarea | Telserv | Bird |
|---|---|---|
| Buscar números en venta | GET /shop | GET /v1/numbers/available |
| Consultar un número | GET /shop/{stockDnisId} | GET /v1/numbers/available/{number} |
| Comprar un número | POST /shop/{stockDnisId} | POST /v1/numbers/orders |
| Reservar un número | POST /shop/{stockDnisId}/reserve, GET /shop/reserved | POST /v1/numbers/orders |
- Búsqueda.
country_codees obligatorio, así que una búsqueda cubre un solo país.prefixrecibe los dígitos nacionales después del código de país: elprefix=3170de Telserv pasa a sercountry_code=NL&prefix=70. Filtra por código de área conprefixen lugar decity, y pornumber_typeycapabilitiesen lugar deproductId. - Documentación en los resultados de búsqueda. Cada resultado incluye
ownership_registration_requireden lugar del filtroexcludeNumbersRequireVerification. Un valortruesignifica que el número se factura desde la compra, pero no envía SMS ni cursa llamadas de voz entrantes o salientes hasta que se apruebe su documentación. - Consultar un número. Se direcciona por su número E.164.
- Precios. Telserv devolvía
pricing.staticPricingen las lecturas detalladas de un número y de un producto. En Bird, cada resultado de búsqueda incluye el precio para tu organización enpricing:setup_priceen lugar denrc, yrecurring_priceporrecurring_perioden lugar demrc, conintervals_per_chargepara indicar cuántos períodos cubre un cargo. Buscar y comprar un número con tu referencia describe los campos de precio. - Comprar. Envía
numbery unreferenceopcional. El pedido se paga desde tu monedero. La mayoría de los pedidos responden201; un pedido que espera a un operador responde202, y lo consultas periódicamente. - Reservar. Hacer el pedido del número lo reserva. Consulta un candidato primero y luego haz el pedido.
Números
| Tarea | Telserv | Bird |
|---|---|---|
| Listar tus números | GET /numbers | GET /v1/numbers |
| Leer un número | GET /numbers/{dnisId} | GET /v1/numbers/{number_id} con el id nda_ o nal_ de la asignación, y GET /v1/voice/numbers/{number_id} con el id vnu_ del registro de voz |
| Modificar un número | PATCH /numbers/{dnisId} | PATCH /v1/numbers/{number_id} con el id nda_ o nal_ de la asignación, y PATCH /v1/voice/numbers/{number_id} con el id vnu_ del registro de voz |
| Liberar un número | DELETE /numbers/{dnisId}?requestedCancelDate= | DELETE /v1/numbers/{number_id} al final del período pagado, o POST /v1/numbers/{number_id}/release ahora, ambos con el id nda_ de la asignación |
- Listar. La lista contiene los números que tienes asignados ahora. Un número liberado que pediste en Bird sigue visible a través de su pedido en
GET /v1/numbers/orders. Conciliar tus números describe los filtros. - Leer. El estado, la documentación de titularidad y el precio están en la asignación, y la ruta está en el registro de voz. El objeto
pricingde la asignación, conrecurring_priceporrecurring_periodyintervals_per_charge, reemplaza apricing.staticPricing.mrc, y la lista también lo incluye, mientras queGET /numbersde Telserv no lo hacía. - Modificar.
nameyreferenceestán en la asignación, y la ruta está en el registro de voz. Configura un códec forzado y un límite de llamadas simultáneas en tu equipo SIP.destinationDistributionTypepasa a serpriorityde gateway en el trunk SIP:FailOverasigna a cada gateway unprioritydiferente, yRoundRobinles asigna el mismo. - Liberar.
DELETEconserva el número hasta el final del período que ya pagaste y lo libera entonces.POST …/releaselo libera de inmediato. Ninguno acepta una fecha. Liberar un número muestra ambas solicitudes.
Destinos y perfiles
| Tarea | Telserv | Bird |
|---|---|---|
| Enviar llamadas al equipo SIP | POST /numbers/{dnisId}/destinations | POST /v1/voice/trunks/{trunk_id}/gateways, luego enrutar trunk |
| Reenviar llamadas a un teléfono | POST /numbers/{dnisId}/destinations | Enrutar forward |
| Dejar de recibir llamadas | DELETE /numbers/{dnisId}/destinations | Enrutar reject |
| Leer perfiles de destino | GET /destinationprofiles, GET /destinationprofiles/{id} | GET /v1/voice/trunks y GET /v1/voice/trunks/{trunk_id}/gateways |
| Aplicar un perfil a un número | POST /numbers/{dnisId}/destinations/profile | Enrutar trunk con trunk_id |
- Equipo SIP. Un gateway pertenece al trunk y atiende cada número enrutado hacia él, así que los números que necesitan listas de destino distintas necesitan trunks distintos.
sortOrderse convierte enpriority. Aplica el tiempo de timbre y las ventanas horarias en tu equipo SIP. - Reenvío. Establece
forward_toyforward_as.forward_todebe ser uno de tus números verificados; un número no verificado responde412conE21053.forward_aselige qué número muestra la llamada reenviada como identificador de quien llama. Un número tiene una sola ruta a la vez, así que para recurrir desde el equipo SIP a un número de teléfono, reenvía la llamada desde tu equipo SIP. - Dejar de recibir llamadas. El número rechaza llamadas hasta que lo enrutes de nuevo. Para mantener un destino permanente en lugar de un perfil predeterminado, enruta el número a un trunk que contenga tus gateways predeterminados.
- Perfiles.
distributionTypepasa a serpriority:FailOverasigna a cada gateway unprioritydiferente, yRoundRobinles asigna el mismo. La distribución se configura por trunk, así que los números que necesitan distribución diferente necesitan trunks diferentes. El placeholder{dnis}pasa a ser{number}endestination_format, y unprefixCLIPpasa a ser el texto antes de{number}enorigination_format. - Aplicar un perfil. Un trunk se identifica por su identificador
spt_, mientras que Telserv identificaba un perfil por nombre.
Documentos y datos de usuario final
| Tarea | Telserv | Bird |
|---|---|---|
| Consultar los requisitos | GET /products/conditions, GET /masterdata/productconditions | GET /v1/compliance/requirements para el número, o con program y sin subject_id para el formulario que un país exige antes de que tengas un número |
| Subir un documento | POST /numbers/{dnisId}/documents | POST /v1/compliance/attachments y, después, cita el adjunto en el envío. Consulta Presentar la documentación de titularidad |
| Enviar datos de usuario final | POST /numbers/{dnisId}/enduserdata | POST /v1/compliance/submissions, con los documentos, en una sola solicitud. Consulta Presentar la documentación de titularidad |
| Sustituir un documento | POST /numbers/{dnisId}/documents de nuevo | POST /v1/compliance/submissions/{submission_id}/resupply con las respuestas rechazadas o caducadas |
| Consultar el progreso de la documentación | GET /numbers/{dnisId}/documents | ownership en GET /v1/numbers/{number_id}, y el envío para ver el veredicto de cada respuesta |
- Requisitos. El catálogo de condiciones de Telserv cubría todos los productos a la vez; Bird lee un formulario cada vez. Pide los requisitos de un número con
subject_kind=number, su identificadornda_comosubject_idy sucountry_code, o lee un formulario antes de comprar conprogramestablecido en el tipo de número y sinsubject_id. Cada entrada defieldssustituye a una condición o etiqueta de usuario final de Telserv: sukeyes la clave bajo la que respondes, ydata_typedocumentmarca una que requiere un archivo. - Documentos. Sube el archivo como
multipart/form-dataen lugar de unfileContenten base64; Sube cada documento lista los archivos aceptados. Subir el mismo archivo dos veces devuelve el mismo adjunto. Una subida por sí sola no presenta nada: lo presenta el envío que cita suattachment_id. - Datos de usuario final y documentos juntos. Telserv aceptaba cada documento en su propia llamada, y los datos de usuario final como una lista de etiquetas en otra. Bird acepta todas las respuestas, escritas y documentos, en un solo envío, y no hay borradores: la solicitud presenta las respuestas para su revisión. Después sigue
ownership.next, que indica el reenvío de correcciones y un envío nuevo solo cuando hace falta (Envía todas las respuestas). - Sustituciones. Envía solo las respuestas que sustituyes; las demás conservan su revisión. Telserv aceptaba un archivo nuevo para una condición mientras el número estaba pendiente de verificación, y ese archivo reiniciaba la revisión de la condición. Bird sustituye una respuesta rechazada, caducada o aún no aportada, y rechaza una que sigue en revisión o ya está aceptada, salvo una respuesta marcada como
editable_for_verifier_repairmientras haya abierta una corrección que hayamos solicitado (Corregir una respuesta rechazada). - Progreso.
ownership.statusyownership.nextinforman del estado del número. Cada respuesta tiene su propiostate, y una rechazada incluye elreasondel revisor. Bird también envía cada resultado por correo electrónico a los propietarios de tu organización y a la persona que presentó o corrigió el envío por última vez.ownershipsuele sernullcuando el número no requiere documentación.
Presentar la documentación de titularidad muestra las solicitudes, y Presentar la documentación de titularidad de un número cubre todo el flujo, incluida la presentación desde el panel y junto con el pedido.
Productos y datos maestros
| Tarea | Telserv | Bird |
|---|---|---|
| Explorar productos | GET /products, GET /products/{productId} | GET /v1/numbers/available, que requiere country_code y devuelve los números a la venta en ese único país. Bird no tiene un catálogo global de productos, y nada corresponde a productId. Ninguna API lista los países y tipos de número a la venta; la página de precios de números de teléfono lista los precios estándar de Bird por país. |
Cada resultado de búsqueda describe su producto con number_type, capabilities y ownership_registration_required, y lleva el precio para tu organización en lugar del pricing.staticPricing del producto (nrc y mrc). Los precios estándar de Bird están en la página de precios de números de teléfono. El sessionPricing por minuto de Telserv no tiene equivalente en estas lecturas; las tarifas de voz están en la página de precios de voz.
Los tipos de número de Telserv se corresponden con el number_type de Bird de esta forma:
numberType de Telserv | Bird number_type |
|---|---|
DID | local o national, según el número |
FreePhone | toll_free |
Mobile | mobile |
Qué funciona de forma diferente hoy
Estas tareas de Telserv se realizan de forma diferente en Bird. Planifícalas antes de mover una integración que dependa de alguna.
- Documentación. Presenta los documentos y los datos de usuario final de un número en un solo envío, sin borradores, y corrige las respuestas rechazadas con un reenvío de datos.
- Reservas. Pide el número cuando lo hayas elegido; el pedido lo reserva.
- Ajustes de llamada por número. Aplica un códec forzado, un límite de llamadas simultáneas, tiempo de timbre y ventanas horarias en tu equipo SIP.
- Fecha de liberación. Bird libera un número al final de su período pagado o de inmediato, no en una fecha que tú elijas. Conserva en tu lado las fechas de cancelación que enviaste a Telserv y actúa sobre cada una cuando llegue el momento.
- Saldo del monedero. Consulta el saldo y recárgalo en el panel.
Buscar y comprar un número con tu referencia
Busca en un solo país. Combina number_type, capabilities y prefix para acotar los 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 incluye un objeto pricing con el precio que tu organización paga por el número, neto de impuestos y en tu moneda de facturación, con los precios que hayas acordado con Bird ya aplicados:
setup_pricese cobra una vez al pedir el número. Una tarifa publicada de cero tiene unamountde"0". El campo en sí esnullcuando no hay tarifa de alta, y también siempre querecurring_priceseanull, porque ese número no se puede pedir.recurring_pricees la tarifa porrecurring_period.intervals_per_chargeindica cuántosrecurring_periodfactura un solo cargo. El cargo recurrente antes de impuestos esrecurring_pricemultiplicado porintervals_per_charge, y se cobra cuando el número se asigna a tu espacio de trabajo y en cada renovación; la tarifa de alta es aparte. En un pedido que espera a un operador, la asignación se produce cuando el pedido se completa.
La referencia de API muestra un resultado de ejemplo. Un resultado con pricing.recurring_price: null no indica un precio recurrente. Contacta con ventas para obtener un precio para ese país y tipo de número antes de hacer el pedido.
El panel y API usan el mismo precio de la organización, incluida la conversión a tu moneda de facturación. Una lectura de precio no fija una cotización: los cambios de tarifa o de tipo de cambio antes de un cobro posterior pueden modificar su importe. Si la consulta falla, la búsqueda devuelve 503 con E14009. Reintenta la lectura con retroceso exponencial; un fallo de consulta nunca significa que el número no cueste nada.
Para confirmar un candidato y su precio antes de pedirlo, léelo con GET /v1/numbers/available/{number}. Un 404 significa que ya no está a la venta.
Pide el número con la referencia que usabas en Telserv y elige una clave de idempotencia que conserves para cualquier reintento de esta 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"}'Una respuesta 201 tiene status: completed y un number_id, el identificador nda_ del número. Consérvalo como NUMBER_ID. Una respuesta 202 significa que el pedido espera a un operador: consulta el pedido hasta que su status sea completed o failed. Una tarifa de alta ya cobrada no se reembolsa si el pedido falla después. La referencia se asigna al número cuando el pedido se completa. Admite hasta 100 caracteres y no necesita ser única.
Reintentar un pedido de un número que tu espacio de trabajo ya tiene asignado devuelve el pedido existente, así que un reintento no cobra dos veces. Comprar y liberar un número explica los rechazos.
Para establecer o cambiar una referencia más adelante, envía reference (y opcionalmente name) a PATCH /v1/numbers/{number_id}. Envía null para borrar un campo.
Comprobar que un número puede cursar llamadas
Un número cuyo status es pending_ownership_registration está asignado y facturado, pero no envía SMS y rechaza las llamadas de voz entrantes y salientes hasta que se apruebe su documentación de titularidad. Antes de enrutar un número o hacerle una llamada de prueba, léelo con GET /v1/numbers/{number_id} y comprueba que status sea active. Si está pendiente, presenta la documentación de titularidad. El estado de un número asignado explica cada valor.
Los ejemplos siguientes usan un número móvil neerlandés. Comprueba el status de tu propio número del mismo modo, sea cual sea su país.
Presentar la documentación de titularidad
Telserv recibía la documentación de un número con un POST /numbers/{dnisId}/documents por documento y un POST /numbers/{dnisId}/enduserdata para todas las etiquetas. Bird recibe ambos en un solo envío, después de que subas los documentos.
-
Lee el
country_codedel número y guárdalo comoCOUNTRY_CODE. El comando lo extrae conjq; léelo manualmente si no usasjq:Ejemplo de códigoCOUNTRY_CODE=$(curl -s "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \ --header "Authorization: Bearer $BIRD_API_KEY" | jq -r .country_code) -
Lee lo que exige el país del número. Cada entrada de
fieldstiene elkeybajo el que respondes, undata_typeyrequired, que indica si debes responderla. Guarda elprogramque indica la respuesta comoPROGRAM:Ejemplo 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"Un
422conE19001significa que no hay formulario de titularidad para ese país. -
Sube cada documento que pida un campo
document, como archivo en lugar defileContenten base64. Guarda elidde la respuesta, el identificadortca_del adjunto, comoATTACHMENT_ID:Ejemplo de códigocurl --request POST "$BIRD_API_URL/v1/compliance/attachments" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --form "file=@registration-certificate.pdf" -
Envía todas las respuestas a la vez: una entrada por cada campo cuyo
requiredseatrue, y por cada campo opcional para el que tengas una respuesta real, con los datos de usuario final comovaluey cada documento comoattachment_id. Omite un campo opcional en lugar de inventarle un valor. El ejemplo muestra dos respuestas; añade el resto de las obligatorias antes de enviarlo. Esta solicitud presenta las respuestas para su revisión. Guarda elidde la respuesta, el identificadorcsb_del envío, comoSUBMISSION_ID:Ejemplo 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"'"}]}'Una respuesta
201devuelve el envío. Un422no presenta nada: corrige el cuerpo y envíalo con una clave de idempotencia nueva, porque la clave reproduce el rechazo. Enviar todas las respuestas explica cada rechazo. -
Cuando un revisor rechaza una respuesta, reemplaza solo esa respuesta, como describe Corregir una respuesta rechazada:
Ejemplo 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 presentar la documentación al comprar, envía el mismo answers en el bloque compliance de POST /v1/numbers/orders. Ese pedido usa el alcance numbers existente con nivel de escritura, también cuando incluye documentación.
Sigue la revisión con ownership.status en GET /v1/numbers/{number_id}. Las respuestas son una declaración legal hecha en nombre de tu empresa, así que presenta solo respuestas que haya confirmado alguien responsable de ellas. Presentar la documentación de titularidad de un número explica cada solicitud, la revisión y la presentación junto con el pedido.
Enrutar un número a tu trunk SIP
Un número nuevo no tiene ruta propia, así que sigue la ruta predeterminada de tu espacio de trabajo. Esa ruta empieza como reject, pero en un espacio de trabajo que ya configuró una, el número nuevo responde las llamadas según ella en cuanto se asigna. Para entregar sus llamadas a tu equipo, crea un trunk SIP con las llamadas entrantes activadas, añádele un gateway y apunta el número al trunk. Trunks SIP explica cómo conectar tu equipo al trunk.
-
Crea el trunk con las llamadas entrantes activadas. Guarda el
idde la respuesta, el identificadorspt_del trunk, comoTRUNK_ID:Ejemplo 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}' -
Añade un gateway. Por defecto, el gateway recibe los números marcado y llamante en E.164 con su
+. Si tu equipo espera números sin el+, como hacía el placeholder{dnis}de Telserv, establecedestination_formatpara el número marcado yorigination_formatpara el número llamante a{number}:Ejemplo 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 conmutación por error, añade un segundo gateway; Lo que necesita un gateway explica
priorityy los formatos de número. Crear el mismo gateway otra vez sin una clave de idempotencia responde409conE21047. -
Busca el registro de voz del número. Busca con los dígitos del número y toma el
idde la entrada cuyoprovider.number_idsea elidde la asignación. Guárdalo comoVOICE_NUMBER_ID:Ejemplo de códigocurl "$BIRD_API_URL/v1/voice/numbers?search=31612345678" \ --header "Authorization: Bearer $BIRD_API_KEY" -
Apunta el número al trunk:
Ejemplo 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"'"}}}'Una respuesta
200muestra la nueva ruta. Un trunk con las llamadas entrantes desactivadas responde412conE21052.
Desactivar las llamadas entrantes en un trunk, o eliminarlo, devuelve cada número enrutado a él a la ruta predeterminada de tu espacio de trabajo, y volver a activarlas no restaura esas rutas. Entregar llamadas a un trunk SIP explica esto y las rutas trunk, forward y reject.
Conciliar tus números
Recorre la lista con el tamaño de página más grande. Pasa el next_cursor de cada página como NEXT_CURSOR para leer la siguiente, hasta que next_cursor sea null. La lista no devuelve un conteo 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"Los filtros de lista de Telserv se corresponden con los de Bird así:
Filtro de Telserv en GET /numbers | Filtro de Bird en GET /v1/numbers |
|---|---|
number, que coincide con el inicio del número | prefix sin country_code, que coincide con los dígitos desde el inicio del número completo |
prefix, que equivale al código de acceso y de área, como 3170 | country_code con prefix establecido en los dígitos nacionales: country_code=NL&prefix=70 |
reference con un valor parcial | search, que coincide con parte del número, nombre o referencia, sin distinguir mayúsculas |
reference con un valor exacto entrecomillado | reference, que devuelve los números con esa referencia exacta. La coincidencia distingue mayúsculas y minúsculas |
| Novedad en Bird | number devuelve un número completo indicado con su código de país, con o sin + o 00: +31612345678, 31612345678 y 0031612345678 encuentran el mismo número |
Buscar un número en tu lista detalla cada filtro.
Cada entrada incluye pricing, con recurring_price por recurring_period y intervals_per_charge. A menos que el precio esté fijado para el número, recurring_price es la tarifa actual de tu organización, y cada renovación cobra la tarifa vigente en el momento de renovar, por lo que un cargo ya facturado puede diferir de ella. Listar todos los números que tienes explica en qué moneda se cobra cada número, cuándo pricing o sus precios son null y qué hacer cuando pricing.error está definido.
Un número liberado desaparece de esta lista, y leerlo por number_id responde 404. Si lo pediste en Bird, su pedido completado permanece en GET /v1/numbers/orders.
Liberar un número
Ambas solicitudes se aplican a un número dedicado, por su identificador nda_; un número compartido se rechaza con E14002. Para conservar el número hasta el final del período que ya pagaste, cancélalo:
curl --request DELETE "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: cancel-CUST-778812"Una respuesta 202 devuelve el número con releases_at, el final de su período pagado. El número conserva su estado actual hasta entonces, su suscripción no se renueva y se libera en ese momento. Pedirlo de nuevo devuelve el mismo releases_at, y una cancelación no se puede deshacer. Un número sin suscripción asociada se libera de inmediato, y la respuesta es 200 con el status del número establecido en released.
Para liberar el número ahora, incluido uno ya programado para cancelación:
curl --request POST "$BIRD_API_URL/v1/numbers/$NUMBER_ID/release" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: release-CUST-778812"Una respuesta 204 significa que el número está liberado, con efecto inmediato. El resto del período actual no se reembolsa.
Mientras un pago de renovación del número esté vencido, ambas solicitudes responden 409 con E03015 hasta que se pague.
Ninguna solicitud acepta una fecha, así que conserva en tu lado el calendario que enviaste a Telserv como requestedCancelDate. Para conservar un número hasta su fecha, cancélalo cuando la fecha caiga dentro de su período de facturación actual: se libera cuando ese período termina, en la fecha o después. Para liberarlo exactamente en la fecha, libéralo ese día. Liberar un número explica qué hace cada solicitud con el número, sus cargos y un reintento.
Hacer una llamada de prueba a tu número
Para verificar una ruta de extremo a extremo, haz una llamada al número desde otro número que tu espacio de trabajo pueda presentar como identificador de llamante. El país del número debe estar habilitado en tus destinos de voz, o la llamada no se completa. La solicitud de abajo ejecuta una secuencia en línea que cuelga cuando la llamada es respondida, así que no se necesita una secuencia guardada. Realiza una llamada real, y se aplican los cargos normales de llamada.
Guarda la solicitud como test-call.json. Pon en from el identificador de llamante que presentas, un número propio o verificado de tu espacio de trabajo, y en to el número que quieres probar:
{
"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": {}
}
}Envíala:
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.jsonAsigna a TEST_CALL_KEY un valor nuevo en cada prueba, y reutilízalo cuando reintentes la misma prueba tras agotarse el tiempo de espera o tras un resultado ambiguo: la misma clave y solicitud en un plazo de tres horas reproducen la primera aceptación en lugar de realizar una segunda llamada. Una respuesta 202 acepta la llamada y devuelve su initial_leg_id. La aceptación no demuestra que la llamada se conectó: lee el tramo con GET /v1/voice/legs/{leg_id}, o lista los tramos realizados al número con GET /v1/voice/legs y su filtro to, y comprueba que tu equipo recibió la llamada. Crear una llamada de voz cubre los requisitos de identificador de llamante y destino, y las reglas de reintento.
Próximos pasos
Recursos relacionados
Continúa con la documentación, guías y ejemplos de este tema.