Migrer de Telserv vers Bird
Ce guide s'adresse aux intégrations qui appellent l'API partenaire Telserv, V1 ou V2, pour acheter, router et libérer des numéros, et qui migrent maintenant vers Bird API.
Bird API dessert chaque produit Bird, donc ses opérations sur les numéros et la voix suivent les conventions propres à Bird au lieu de celles de Telserv. La plupart des fonctionnalités utilisées par votre intégration ont un appel Bird correspondant. Les endpoints, les payloads, les identifiants et l'authentification diffèrent : prévoyez de réécrire l'intégration. Lorsque Bird fait une tâche différemment, ce guide montre comment.
Ce guide est un travail en cours. Il couvre ce que fait Bird et s'enrichit au fil de la migration. Si une opération Telserv que vous utilisez n'est pas répertoriée ici, elle nécessite encore un cadrage et du travail avant de pouvoir être ajoutée ; contactez votre référent migration à ce sujet.
Avant de commencer
- Une organisation Bird dont la vérification d'identité est terminée, condition requise pour le premier achat de numéro.
- Une clé API avec les scopes utilisés par les recettes :
numbersen écriture pour les numéros et les commandes,complianceen écriture pour les opérations autonomes sur les documents de propriété, etvoice_managementen écriture pour les trunks SIP, les numéros voix et les numéros vérifiés. L'appel de test nécessite aussivoice:write, et la lecture des segments d'appel nécessitevoice:read. - Solde du portefeuille. Les commandes sont payées depuis le portefeuille. Quand une commande est refusée explique les refus
402et412.
Les numéros que votre intégration gère dans Telserv n'ont pas besoin d'être rachetés. Une fois vos numéros déplacés vers votre espace de travail Bird, ils apparaissent dans GET /v1/numbers. Votre référent migration confirme quand cela se produit. Pour obtenir l'identifiant nda_ d'un numéro migré, recherchez-le avec GET /v1/numbers?number=<digits> en indiquant les chiffres avec leur indicatif pays, et conservez le id comme NUMBER_ID.
Les exemples lisent votre clé depuis BIRD_API_KEY et son hôte régional depuis BIRD_API_URL : https://eu1.platform.bird.com pour une clé bk_eu1_, ou https://us1.platform.bird.com pour une clé bk_us1_. Les autres variables, comme TRUNK_ID et NUMBER_ID, contiennent un identifiant issu d'une réponse précédente ; chaque étape nomme celui qu'elle définit.
Ce qui change dans le contrat
| Domaine | API partenaire Telserv | Bird API |
|---|---|---|
| Authentification | En-tête X-ApiKey (V2) ou paramètre apiKey (V1), vérifié par rapport à votre liste d'adresses IP autorisées | Authorization: Bearer avec une clé API dont les scopes désignent les domaines produit auxquels elle a accès. Une liste d'adresses IP autorisées est facultative : configurez-la sous IP restrictions sur la clé dans Clés API |
| Identifiants | Entiers. L'achat d'un numéro lui attribue un nouveau id | TypeID préfixés tels que nda_, nor_, vnu_ et spt_. Un numéro conserve son identifiant nda_ tant qu'il vous est attribué |
| Numéros de téléphone | Chiffres sans + initial | E.164 avec le + initial |
| Pagination | Décalages start et limit, jusqu'à 1000 par page | Curseurs : limit jusqu'à 100 (25 par défaut), puis starting_after défini sur le next_cursor de la page précédente. Voir Pagination |
| Erreurs | errorCode nomme une classe d'exception, et 403 couvre une ressource manquante et de nombreuses erreurs de validation | error.code est un code E stable avec une page de documentation et, lorsqu'une résolution est connue, un remediation. Une ressource manquante répond 404, une précondition non remplie 412, et une entrée invalide 422 avec le détail des champs. Voir Erreurs |
| Environnements | LIVE et SANDBOX, chacun avec ses propres clés | Un seul environnement. Chaque commande achète et facture un vrai numéro, et chaque appel de test est un appel réel |
| Nouvelles tentatives | Pas de clé d'idempotence | Un en-tête Idempotency-Key sur les écritures. La même clé et le même corps rejouent la première réponse avec Idempotency-Replay: true ; la même clé avec un corps différent répond 409. Voir Idempotence |
L'Bird API refuse un paramètre de requête qu'elle ne reconnaît pas avec 422 et E01029. Supprimez de vos requêtes les filtres propres à Telserv, comme city, au lieu de les transmettre tels quels.
Deux identifiants pour un même numéro
Un numéro compatible voix attribué à votre espace de travail possède deux enregistrements, chacun avec son propre identifiant :
- L'allocation, renvoyée par
GET /v1/numbers. Sonidcommence parnda_pour un numéro dédié et parnal_pour un numéro partagé, et lenumber_idd'une commande est l'identifiantnda_du numéro acheté. Utilisez-la pour lire, nommer et référencer le numéro, et pour libérer un numéro dédié. - L'enregistrement vocal,
vnu_, renvoyé parGET /v1/voice/numbers. Utilisez-le pour lire et modifier la destination des appels entrants du numéro. Un numéro sans capacité vocale, par exemple un numéro SMS uniquement, n'a pas d'enregistrement vocal.
Les opérations vocales refusent un identifiant nda_ ou nal_ avec 422. Pour trouver l'enregistrement vocal d'un numéro, listez les numéros vocaux avec search défini sur les chiffres du numéro et prenez l'entrée dont le provider.number_id correspond au id de l'allocation. Acheminer un numéro vers votre trunk SIP montre la requête, et Gérer vos numéros de téléphone couvre la recherche.
Le GET /numbers/{dnisId} de Telserv devient deux lectures dans Bird : l'allocation pour le statut et les documents de propriété, et l'enregistrement vocal pour la route.
Correspondance des opérations Telserv avec Bird
Chaque tableau liste une tâche, l'appel Telserv qui l'effectuait et l'appel Bird qui l'effectue maintenant. Les notes sous chaque tableau indiquent ce qui change dans la requête ou la réponse.
Boutique
| Tâche | Telserv | Bird |
|---|---|---|
| Rechercher des numéros en vente | GET /shop | GET /v1/numbers/available |
| Vérifier un numéro | GET /shop/{stockDnisId} | GET /v1/numbers/available/{number} |
| Acheter un numéro | POST /shop/{stockDnisId} | POST /v1/numbers/orders |
| Réserver un numéro | POST /shop/{stockDnisId}/reserve, GET /shop/reserved | POST /v1/numbers/orders |
- Recherche.
country_codeest obligatoire, donc une recherche couvre un seul pays.prefixprend les chiffres nationaux après l'indicatif pays : Telservprefix=3170devientcountry_code=NL&prefix=70. Affinez par indicatif régional avecprefixà la place decity, et parnumber_typeetcapabilitiesà la place deproductId. - Documents dans les résultats de recherche. Chaque résultat contient
ownership_registration_requiredà la place du filtreexcludeNumbersRequireVerification. Une valeurtruesignifie que le numéro est facturé dès l'achat, mais qu'il n'envoie aucun SMS et n'achemine aucun appel vocal entrant ou sortant tant que ses documents ne sont pas approuvés. - Vérifier un numéro. Il est adressé par son numéro E.164.
- Prix. Telserv renvoyait
pricing.staticPricingdans les lectures détaillées d'un numéro et d'un produit. Dans Bird, chaque résultat de recherche contient son prix pour votre organisation danspricing:setup_priceà la place denrc, etrecurring_priceparrecurring_periodà la place demrc, avecintervals_per_chargepour le nombre de périodes couvertes par une facturation. Rechercher et acheter un numéro avec votre référence décrit les champs de prix. - Achat. Envoyez
numberet unreferencefacultatif. La commande est payée depuis votre portefeuille. La plupart des commandes répondent201; une commande en attente chez un opérateur répond202, et vous interrogez son état. - Réservation. Commander le numéro le réserve. Vérifiez d'abord un candidat, puis commandez-le.
Numéros
| Tâche | Telserv | Bird |
|---|---|---|
| Lister vos numéros | GET /numbers | GET /v1/numbers |
| Lire un numéro | GET /numbers/{dnisId} | GET /v1/numbers/{number_id} avec l'id nda_ ou nal_ de l'allocation, et GET /v1/voice/numbers/{number_id} avec l'id vnu_ de l'enregistrement vocal |
| Modifier un numéro | PATCH /numbers/{dnisId} | PATCH /v1/numbers/{number_id} avec l'id nda_ ou nal_ de l'allocation, et PATCH /v1/voice/numbers/{number_id} avec l'id vnu_ de l'enregistrement vocal |
| Libérer un numéro | DELETE /numbers/{dnisId}?requestedCancelDate= | DELETE /v1/numbers/{number_id} à la fin de la période payée, ou POST /v1/numbers/{number_id}/release immédiatement, tous deux avec l'id nda_ de l'allocation |
- Liste. La liste contient les numéros qui vous sont actuellement attribués. Un numéro libéré que vous avez commandé dans Bird reste visible via sa commande dans
GET /v1/numbers/orders. Réconcilier vos numéros décrit la correspondance des filtres. - Lecture. Le statut, les documents de propriété et le prix se trouvent sur l'allocation, et la route sur l'enregistrement vocal. L'objet
pricingde l'allocation, avecrecurring_priceparrecurring_periodetintervals_per_charge, remplacepricing.staticPricing.mrc, et la liste le porte aussi, contrairement auGET /numbersde Telserv. - Modification.
nameetreferencese trouvent sur l'allocation, et la route sur l'enregistrement vocal. Définissez un codec forcé et un plafond d'appels simultanés sur votre équipement SIP.destinationDistributionTypedevient lepriorityde la passerelle sur le trunk SIP :FailOverattribue à chaque passerelle unprioritydifférent, etRoundRobinleur attribue le même. - Libération.
DELETEconserve le numéro jusqu'à la fin de la période déjà payée, puis le libère.POST …/releasele libère immédiatement. Aucune des deux options n'accepte de date. Libérer un numéro montre les deux requêtes.
Destinations et profils
| Tâche | Telserv | Bird |
|---|---|---|
| Envoyer les appels vers un équipement SIP | POST /numbers/{dnisId}/destinations | POST /v1/voice/trunks/{trunk_id}/gateways, puis router trunk |
| Transférer les appels vers un téléphone | POST /numbers/{dnisId}/destinations | Router forward |
| Cesser de recevoir des appels | DELETE /numbers/{dnisId}/destinations | Router reject |
| Lire les profils de destination | GET /destinationprofiles, GET /destinationprofiles/{id} | GET /v1/voice/trunks et GET /v1/voice/trunks/{trunk_id}/gateways |
| Appliquer un profil à un numéro | POST /numbers/{dnisId}/destinations/profile | Router trunk avec trunk_id |
- Équipement SIP. Une passerelle appartient au trunk et dessert chaque numéro routé vers elle, de sorte que les numéros nécessitant des listes de destinations différentes ont besoin de trunks différents.
sortOrderdevientpriority. Appliquez la durée de sonnerie et les plages horaires sur votre équipement SIP. - Renvoi. Définissez
forward_toetforward_as.forward_todoit être l'un de vos numéros vérifiés ; un numéro non vérifié répond412avecE21053.forward_asdétermine quel numéro l'appel renvoyé affiche comme appelant. Un numéro n'a qu'une seule route à la fois : pour basculer d'un équipement SIP vers un numéro de téléphone, renvoyez l'appel depuis votre équipement SIP. - Cesser de recevoir des appels. Le numéro rejette les appels jusqu'à ce que vous le routiez à nouveau. Pour conserver un réglage par défaut permanent à la place d'un profil par défaut, routez le numéro vers un trunk qui contient vos passerelles par défaut.
- Profils.
distributionTypedevientpriority:FailOverattribue à chaque passerelle unprioritydifférent, etRoundRobinleur attribue le même. La distribution est définie par trunk, donc les numéros nécessitant une distribution différente ont besoin de trunks différents. L'espace réservé{dnis}devient{number}dansdestination_format, et unprefixCLIPdevient le texte avant{number}dansorigination_format. - Appliquer un profil. Un trunk est adressé par son identifiant
spt_, alors que Telserv adressait un profil par son nom.
Documents et données d'utilisateur final
| Tâche | Telserv | Bird |
|---|---|---|
| Lire les exigences | GET /products/conditions, GET /masterdata/productconditions | GET /v1/compliance/requirements pour le numéro, ou avec program et sans subject_id pour le formulaire qu'un pays exige avant que vous déteniez un numéro |
| Téléverser un document | POST /numbers/{dnisId}/documents | POST /v1/compliance/attachments, puis citez la pièce jointe dans la soumission. Voir Déposer les documents de propriété |
| Envoyer les données d'utilisateur final | POST /numbers/{dnisId}/enduserdata | POST /v1/compliance/submissions, avec les documents, en une seule requête. Voir Déposer les documents de propriété |
| Remplacer un document | POST /numbers/{dnisId}/documents à nouveau | POST /v1/compliance/submissions/{submission_id}/resupply avec les réponses rejetées ou expirées |
| Suivre l'avancement des documents | GET /numbers/{dnisId}/documents | ownership sur GET /v1/numbers/{number_id}, et la soumission pour le verdict de chaque réponse |
- Exigences. Le catalogue de conditions de Telserv couvrait tous les produits à la fois ; Bird lit un formulaire à la fois. Demandez les exigences d'un numéro avec
subject_kind=number, son identifiantnda_commesubject_idet soncountry_code, ou lisez un formulaire avant l'achat avecprogramdéfini sur le type de numéro et sanssubject_id. Chaque entrée defieldsremplace une condition ou un libellé d'utilisateur final Telserv : sonkeyest la clé sous laquelle vous répondez, etdata_typedocumentsignale une entrée qui attend un fichier. - Documents. Téléversez le fichier sous forme de
multipart/form-dataau lieu d'unfileContenten base64 ; Téléverser chaque document liste les fichiers acceptés. Téléverser deux fois le même fichier renvoie la même pièce jointe. Un téléversement seul ne dépose rien : c'est la soumission qui cite sonattachment_idqui le dépose. - Données d'utilisateur final et documents ensemble. Telserv recevait chaque document dans un appel distinct, et les données d'utilisateur final sous forme d'une liste de libellés dans un autre. Bird reçoit toutes les réponses, saisies et documents, en une seule soumission, sans brouillon : la requête dépose les réponses pour examen. Suivez ensuite
ownership.next, qui indique un complément pour les corrections, et une nouvelle soumission seulement lorsqu'elle est nécessaire (Soumettre toutes les réponses). - Remplacements. Envoyez uniquement les réponses que vous remplacez ; les autres conservent leur examen. Telserv acceptait un nouveau fichier pour une condition tant que le numéro était en attente de vérification, et ce fichier relançait l'examen de cette condition. Bird remplace une réponse rejetée, expirée ou pas encore fournie, et refuse une réponse encore en cours d'examen ou déjà acceptée, sauf une réponse marquée
editable_for_verifier_repairpendant qu'une correction que nous avons demandée est ouverte (Corriger une réponse rejetée). - Avancement.
ownership.statusetownership.nextindiquent où en est le numéro. Chaque réponse a son proprestate, et une réponse rejetée porte lereasonde l'examinateur. Bird envoie aussi chaque résultat par e-mail aux propriétaires de votre organisation et à la personne qui a déposé ou corrigé la soumission en dernier.ownershipvaut généralementnulllorsque le numéro ne nécessite aucun document.
Déposer les documents de propriété montre les requêtes, et Déposer les documents de propriété d'un numéro couvre l'ensemble du processus, y compris le dépôt depuis le tableau de bord et avec la commande.
Produits et données de référence
| Tâche | Telserv | Bird |
|---|---|---|
| Parcourir les produits | GET /products, GET /products/{productId} | GET /v1/numbers/available, qui exige country_code et renvoie les numéros en vente dans ce seul pays. Bird n'a pas de catalogue global de produits, et rien ne correspond à productId. Aucune API ne liste les pays et types de numéros en vente ; la page de tarification des numéros de téléphone liste les prix standard de Bird par pays. |
Chaque résultat de recherche décrit son produit avec number_type, capabilities et ownership_registration_required, et porte le prix pour votre organisation à la place du pricing.staticPricing du produit (nrc et mrc). Les prix standard de Bird figurent sur la page tarification des numéros de téléphone. Le sessionPricing à la minute de Telserv n'a pas d'équivalent dans ces lectures ; les tarifs voix figurent sur la page tarification voix.
Les types de numéros Telserv correspondent au number_type de Bird comme suit :
numberType Telserv | Bird number_type |
|---|---|
DID | local ou national, selon le numéro |
FreePhone | toll_free |
Mobile | mobile |
Ce qui fonctionne différemment
Ces tâches Telserv fonctionnent différemment dans Bird. Prévoyez-les avant de migrer une intégration qui dépend de l'une d'elles.
- Documents. Déposez les documents et les données d'utilisateur final d'un numéro en une seule soumission, sans brouillon, et corrigez les réponses rejetées par un nouvel envoi.
- Réservations. Commandez le numéro une fois votre choix fait ; la commande le réserve.
- Paramètres d'appel par numéro. Appliquez un codec forcé, un plafond d'appels simultanés, un temps de sonnerie et des plages horaires sur votre équipement SIP.
- Date de libération. Bird libère un numéro à la fin de sa période payée ou immédiatement, pas à une date de votre choix. Conservez de votre côté les dates d'annulation que vous avez envoyées à Telserv, et agissez sur chacune à son échéance.
- Solde du portefeuille. Vérifiez le solde et rechargez depuis le tableau de bord.
Rechercher et acheter un numéro avec votre référence
Recherchez dans un seul pays. Combinez number_type, capabilities et prefix pour affiner les résultats :
curl "$BIRD_API_URL/v1/numbers/available?country_code=NL&number_type=mobile&capabilities=voice&limit=10" \
--header "Authorization: Bearer $BIRD_API_KEY"Chaque résultat porte un objet pricing avec le prix que votre organisation paie pour le numéro, hors taxes et dans votre devise de facturation, avec les prix convenus avec Bird appliqués :
setup_priceest facturé une seule fois à la commande du numéro. Des frais publiés de zéro ont unamountde"0". Le champ lui-même vautnulllorsqu'aucuns frais de mise en service ne s'appliquent, et aussi chaque fois querecurring_pricevautnull, car ce numéro ne peut pas être commandé.recurring_priceest le tarif parrecurring_period.intervals_per_chargeest le nombre derecurring_periodcouverts par une facturation. Le montant récurrent hors taxes estrecurring_pricemultiplié parintervals_per_charge, prélevé lorsque le numéro est attribué à votre espace de travail et à chaque renouvellement ; les frais de mise en service sont séparés. Pour une commande en attente chez un opérateur, l'attribution a lieu lorsque la commande aboutit.
La référence API présente un exemple de résultat. Un résultat avec pricing.recurring_price: null ne fournit pas de tarif récurrent. Contactez l'équipe commerciale pour obtenir un tarif pour ce pays et ce type de numéro avant de commander.
Le tableau de bord et API utilisent le même prix organisation, y compris la conversion dans votre devise de facturation. Une lecture de prix ne verrouille pas un devis : des changements de tarif ou de taux de change avant une facturation ultérieure peuvent en modifier le montant. Si la recherche de prix échoue, la recherche renvoie 503 avec E14009. Réessayez la lecture avec un backoff exponentiel ; un échec de recherche de prix ne signifie jamais que le numéro ne coûte rien.
Pour confirmer un candidat et son prix avant de le commander, lisez-le avec GET /v1/numbers/available/{number}. Un 404 signifie qu'il n'est plus en vente.
Commandez le numéro avec la référence que vous utilisiez dans Telserv, et choisissez une clé d'idempotence que vous conservez pour toute nouvelle tentative de cet achat :
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"}'Une réponse 201 contient status: completed et un number_id, l'identifiant nda_ du numéro. Conservez-le dans NUMBER_ID. Une réponse 202 signifie que la commande attend un opérateur : interrogez la commande jusqu'à ce que son status soit completed ou failed. Des frais de mise en service déjà facturés ne sont pas remboursés si la commande échoue ensuite. La référence est inscrite sur le numéro lorsque la commande aboutit. Elle peut contenir jusqu'à 100 caractères et n'a pas besoin d'être unique.
Réessayer une commande pour un numéro déjà alloué à votre espace de travail renvoie la commande existante ; une nouvelle tentative ne facture donc pas deux fois. Acheter et libérer un numéro explique les refus.
Pour définir ou modifier une référence ultérieurement, envoyez reference (et éventuellement name) à PATCH /v1/numbers/{number_id}. Envoyez null pour effacer un champ.
Vérifier qu'un numéro peut acheminer des appels
Un numéro dont le status est pending_ownership_registration est alloué et facturé, mais il n'envoie aucun SMS et refuse les appels vocaux entrants et sortants tant que ses documents de propriété ne sont pas approuvés. Avant de router un numéro ou de passer un appel de test vers celui-ci, lisez-le avec GET /v1/numbers/{number_id} et vérifiez que status est active. S'il est en attente, déposez les documents de propriété. Le statut d'un numéro alloué explique chaque valeur.
Les exemples ci-dessous utilisent un numéro mobile néerlandais. Vérifiez le status de votre propre numéro de la même façon, quel que soit son pays.
Déposer les documents de propriété
Telserv recevait les documents d'un numéro avec un POST /numbers/{dnisId}/documents par document et un POST /numbers/{dnisId}/enduserdata pour l'ensemble des libellés. Bird reçoit les deux en une seule soumission, après le téléversement des documents.
-
Lisez le
country_codedu numéro et conservez-le dansCOUNTRY_CODE. La commande l'extrait avecjq; lisez-le manuellement si vous n'utilisez pasjq:Exemple de codeCOUNTRY_CODE=$(curl -s "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \ --header "Authorization: Bearer $BIRD_API_KEY" | jq -r .country_code) -
Lisez ce que demande le pays du numéro. Chaque entrée de
fieldscontient lekeysous lequel vous répondez, undata_typeetrequired, qui indique si la réponse est obligatoire. Conservez leprogramindiqué dans la réponse dansPROGRAM:Exemple de codecurl "$BIRD_API_URL/v1/compliance/requirements?subject_kind=number&subject_id=$NUMBER_ID&country_code=$COUNTRY_CODE" \ --header "Authorization: Bearer $BIRD_API_KEY"Un
422avecE19001signifie qu'il n'existe aucun formulaire de propriété pour ce pays. -
Téléversez chaque document demandé par un champ
document, sous forme de fichier au lieu defileContenten base64. Conservez leidde la réponse, l'identifianttca_de la pièce jointe, dansATTACHMENT_ID:Exemple de codecurl --request POST "$BIRD_API_URL/v1/compliance/attachments" \ --header "Authorization: Bearer $BIRD_API_KEY" \ --form "file=@registration-certificate.pdf" -
Soumettez toutes les réponses en une fois : une entrée pour chaque champ dont le
requiredesttrue, et pour chaque champ facultatif auquel vous avez une vraie réponse, avec les données d'utilisateur final envalueet chaque document enattachment_id. Omettez un champ facultatif plutôt que d'inventer une valeur. L'exemple montre deux réponses ; ajoutez les autres réponses obligatoires avant l'envoi. Cette requête dépose les réponses pour examen. Conservez leidde la réponse, l'identifiantcsb_de la soumission, dansSUBMISSION_ID:Exemple de codecurl --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"'"}]}'Une réponse
201renvoie la soumission. Un422ne dépose rien : corrigez le corps et renvoyez-le avec une nouvelle clé d'idempotence, car la clé rejoue le refus. Soumettre toutes les réponses explique chaque refus. -
Lorsqu'un examinateur rejette une réponse, remplacez uniquement cette réponse, comme le décrit Corriger une réponse rejetée :
Exemple de codecurl --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"}]}'
Pour déposer les documents lors de l'achat, envoyez le même answers dans le bloc compliance de POST /v1/numbers/orders. Cette commande utilise le scope numbers existant en écriture, y compris lorsqu'elle contient des documents.
Suivez l'examen avec ownership.status sur GET /v1/numbers/{number_id}. Les réponses constituent une déclaration juridique faite au nom de votre entreprise : ne déposez que des réponses confirmées par une personne qui en est responsable. Déposer les documents de propriété d'un numéro couvre chaque requête, l'examen et le dépôt avec la commande.
Acheminer un numéro vers votre trunk SIP
Un nouveau numéro n'a pas de route propre : il suit donc la route par défaut de votre espace de travail. Cette route par défaut vaut d'abord reject, mais dans un espace de travail qui en a déjà défini une, le nouveau numéro répond aux appels selon celle-ci dès qu'il est alloué. Pour livrer ses appels à votre équipement, créez un trunk SIP avec les appels entrants activés, ajoutez-lui une passerelle, puis pointez le numéro vers le trunk. Trunks SIP explique comment connecter votre équipement au trunk.
-
Créez le trunk avec les appels entrants activés. Conservez le
idde la réponse, l'identifiantspt_du trunk, dansTRUNK_ID:Exemple de codecurl --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}' -
Ajoutez une passerelle. Par défaut, la passerelle reçoit les numéros composés et appelants en E.164 avec leur
+. Si votre équipement attend les numéros sans le+, comme le faisait le placeholder{dnis}de Telserv, définissezdestination_formatpour le numéro composé etorigination_formatpour le numéro appelant sur{number}:Exemple de codecurl --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}"}'Pour le basculement, ajoutez une seconde passerelle ; Ce dont une passerelle a besoin explique
priorityet les formats de numéro. Créer la même passerelle une seconde fois sans clé d'idempotence renvoie409avecE21047. -
Trouvez l'enregistrement vocal du numéro. Recherchez avec les chiffres du numéro et prenez le
idde l'entrée dont leprovider.number_idest leidde l'allocation. Conservez-le dansVOICE_NUMBER_ID:Exemple de codecurl "$BIRD_API_URL/v1/voice/numbers?search=31612345678" \ --header "Authorization: Bearer $BIRD_API_KEY" -
Pointez le numéro vers le trunk :
Exemple de codecurl --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"'"}}}'Une réponse
200affiche la nouvelle route. Un trunk avec les appels entrants désactivés renvoie412avecE21052.
Désactiver les appels entrants sur un trunk, ou supprimer le trunk, renvoie chaque numéro acheminé vers lui à la route par défaut de votre espace de travail, et les réactiver ne restaure pas ces routes. Livrer les appels à un trunk SIP explique ce comportement ainsi que les routes trunk, forward et reject.
Réconcilier vos numéros
Parcourez la liste avec la taille de page maximale. Transmettez le next_cursor de chaque page comme NEXT_CURSOR pour lire la page suivante, jusqu'à ce que next_cursor soit null. La liste ne renvoie pas de nombre 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"Les filtres de la liste Telserv correspondent à ceux de Bird comme suit :
Filtre Telserv sur GET /numbers | Filtre Bird sur GET /v1/numbers |
|---|---|
number, qui correspond au début du numéro | prefix sans country_code, qui correspond aux chiffres depuis le début du numéro complet |
prefix, qui correspond à l'indicatif d'accès et de zone tel que 3170 | country_code avec prefix défini sur les chiffres nationaux : country_code=NL&prefix=70 |
reference avec une valeur partielle | search, qui correspond à une partie du numéro, du nom ou de la référence, sans tenir compte de la casse |
reference avec une valeur exacte entre guillemets | reference, qui renvoie les numéros ayant cette référence exacte. La correspondance est sensible à la casse |
| Nouveau dans Bird | number renvoie un numéro complet donné avec son indicatif pays, avec ou sans + ou 00 : +31612345678, 31612345678 et 0031612345678 trouvent le même numéro |
Trouver un numéro dans votre liste détaille chaque filtre.
Chaque entrée porte pricing, avec recurring_price par recurring_period et intervals_per_charge. Sauf si un prix est fixé pour le numéro, recurring_price est le tarif actuel de votre organisation, et chaque renouvellement facture le tarif en vigueur au moment du renouvellement ; un montant déjà facturé peut donc en différer. Lister tous les numéros que vous détenez explique dans quelle devise chaque numéro est facturé, quand pricing ou ses prix valent null, et que faire lorsque pricing.error est défini.
Un numéro libéré quitte cette liste, et sa lecture par number_id répond 404. Si vous l'avez commandé dans Bird, sa commande terminée reste dans GET /v1/numbers/orders.
Libérer un numéro
Les deux requêtes s'appliquent à un numéro dédié, par son identifiant nda_ ; un numéro partagé est refusé avec E14002. Pour conserver le numéro jusqu'à la fin de la période déjà payée, annulez-le :
curl --request DELETE "$BIRD_API_URL/v1/numbers/$NUMBER_ID" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: cancel-CUST-778812"Une réponse 202 renvoie le numéro avec releases_at, la fin de sa période payée. Le numéro conserve son statut actuel jusque-là, son abonnement ne se renouvelle pas, et il est libéré à ce moment. Une nouvelle demande renvoie le même releases_at, et une annulation ne peut pas être révoquée. Un numéro sans abonnement sous-jacent est libéré immédiatement, et la réponse est 200 avec le status du numéro défini sur released.
Pour libérer le numéro maintenant, y compris un numéro déjà planifié pour annulation :
curl --request POST "$BIRD_API_URL/v1/numbers/$NUMBER_ID/release" \
--header "Authorization: Bearer $BIRD_API_KEY" \
--header "Idempotency-Key: release-CUST-778812"Une réponse 204 signifie que le numéro est libéré, avec effet immédiat. Le reste de la période en cours n'est pas remboursé.
Tant qu'un paiement de renouvellement pour le numéro est en retard, les deux requêtes répondent 409 avec E03015 jusqu'à ce qu'il soit réglé.
Aucune des deux requêtes n'accepte de date : conservez le calendrier que vous avez envoyé à Telserv sous forme de requestedCancelDate de votre côté. Pour conserver un numéro jusqu'à sa date, annulez-le une fois que la date tombe dans sa période de facturation en cours : il est libéré à la fin de cette période, à la date prévue ou après. Pour y renoncer exactement à la date, libérez-le ce jour-là. Libérer un numéro explique ce que chaque requête fait au numéro, à ses frais et à une nouvelle tentative.
Passer un appel de test vers votre numéro
Pour vérifier une route de bout en bout, passez un appel vers le numéro depuis un autre numéro que votre espace de travail peut présenter comme identifiant de l'appelant. Le pays du numéro doit être activé dans vos destinations vocales, sinon l'appel n'aboutit pas. La requête ci-dessous exécute une séquence en ligne qui raccroche dès que l'appel obtient une réponse : aucune séquence enregistrée n'est nécessaire. Elle passe un appel réel, et les frais d'appel normaux s'appliquent.
Enregistrez la requête sous test-call.json. Indiquez l'identifiant de l'appelant que vous présentez dans from, un numéro possédé ou vérifié de votre espace de travail, et le numéro testé dans 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": {}
}
}Envoyez-la :
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.jsonDonnez à TEST_CALL_KEY une nouvelle valeur pour chaque test, et réutilisez-la lorsque vous réessayez le même test après un délai d'attente ou un résultat incertain : la même clé et la même requête dans les trois heures rejouent la première acceptation au lieu de passer un second appel. Une réponse 202 accepte l'appel et renvoie son initial_leg_id. L'acceptation ne prouve pas que l'appel a abouti : lisez le segment d'appel avec GET /v1/voice/legs/{leg_id}, ou listez les segments passés vers le numéro avec GET /v1/voice/legs et son filtre to, et vérifiez que votre équipement a reçu l'appel. Créer un appel vocal couvre les exigences d'identifiant d'appelant et de destination ainsi que les règles de nouvelle tentative.
Étapes suivantes
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet.