Sign inGet started

Événements vocaux

Bird émet des événements webhook au démarrage, à la prise en charge et à la fin d'un appel. Utilisez-les pour mettre à jour vos systèmes sans interrogation. Consultez Webhooks pour les abonnements, les signatures, les réessais et la rediffusion.
Parcours d'un appel à travers les types d'événements :
  1. voice_call.initiated : Bird a accepté la demande d'établissement d'appel (un SIP INVITE) et a commencé le routage de l'appel
  2. voice_call.answered : le numéro appelé a décroché. Seuls les appels pris en charge reçoivent cet événement
  3. voice_call.ended : l'appel est terminé et l'événement contient le résultat
voice_call.initiated confirme qu'un appel existe, tandis que voice_call.ended rapporte son résultat. Un appel que Bird refuse après avoir accepté le INVITE émet quand même voice_call.ended avec status: "failed" et sip_response_code: 503.
Le type de l'événement est une énumération ouverte : Bird peut ajouter des types au fil du temps, donc gérez ceux que vous traitez et ignorez les autres au lieu de considérer un type inconnu comme une erreur.

L'enveloppe de l'événement

Les événements vocaux arrivent dans la même enveloppe imbriquée que tout autre événement Bird, décrite dans le guide Webhooks : type, timestamp et un objet data spécifique au type. L'identité de l'événement se trouve dans l'en-tête webhook-id HTTP plutôt que dans le corps.
ChampDescription
typeL'un des trois types de cette page, par exemple voice_call.ended
timestampDate de l'événement (RFC 3339). Triez par ce champ, jamais par l'ordre d'arrivée
dataContenu spécifique à l'événement, contenant toujours les mêmes champs d'identité d'appel
Le data de chaque événement vocal contient les mêmes champs d'identité pour la corrélation. Les deux numéros utilisent le format E.164 : un + en tête, l'indicatif pays et le numéro national.
ChampDescription
call_idL'identifiant de l'enregistrement d'appel (vcl_…), le même que celui affiché dans le Journal d'appels
session_idPartagé par chaque segment d'un appel transféré ou multipartite (vcs_…). Null lorsqu'aucune corrélation de session ne s'applique
workspace_idL'espace de travail auquel l'appel appartient
directionoutbound pour les appels passés par votre équipement
fromLe numéro appelant
toLe numéro appelé

voice_call.initiated

Bird a reçu le INVITE et a commencé le routage.
Exemple de code
{
  "type": "voice_call.initiated",
  "timestamp": "2026-06-10T14:30:00Z",
  "data": {
    "call_id": "vcl_01krdgeqcxet5s7t44vh8rt9mg",
    "session_id": "vcs_01krdgeqcxet5s7t44vh8rt9mh",
    "workspace_id": "wsp_01krdgeqcxet5s7t44vh8rt9mj",
    "direction": "outbound",
    "from": "+14155551234",
    "to": "+16505559876"
  }
}

voice_call.answered

Le destinataire a décroché et le temps facturable a commencé. Un appel sans réponse ne génère pas cet événement.
Le contenu est constitué des champs d'identité d'appel présents dans chaque événement vocal, avec timestamp défini à l'instant de la prise en charge.

voice_call.ended

L'appel est terminé. Cet événement ajoute le résultat :
ChampDescription
statusComment l'appel s'est terminé : answered, no_answer, failed, rejected ou unknown (voir Statuts)
sip_response_codeLe code SIP final de l'appel, par exemple 200 ou 486. Un appel Bird refusé contient 503 ; null lorsqu'aucun code final n'a été enregistré
duration_msDurée totale de l'appel en millisecondes, du moment où Bird a reçu l'appel jusqu'au raccroché
billable_msDurée en communication en millisecondes ; un appel sans réponse indique zéro
Exemple de code
{
  "type": "voice_call.ended",
  "timestamp": "2026-06-10T14:31:05Z",
  "data": {
    "call_id": "vcl_01krdgeqcxet5s7t44vh8rt9mg",
    "session_id": "vcs_01krdgeqcxet5s7t44vh8rt9mh",
    "workspace_id": "wsp_01krdgeqcxet5s7t44vh8rt9mj",
    "direction": "outbound",
    "from": "+14155551234",
    "to": "+16505559876",
    "status": "answered",
    "sip_response_code": 200,
    "duration_ms": 65000,
    "billable_ms": 60000
  }
}
L'enregistrement d'appel contient deux détails que cet événement omet : la raison du rejet et le coût. Ouvrez l'appel dans le journal d'appels pour distinguer un refus Bird d'une défaillance opérateur. Le coût apparaît une fois la tarification terminée.

Les consommer en toute sécurité

  • Dédupliquez sur webhook-id. Bird livre au moins une fois, et l'événement initiated d'un appel peut être publié plus d'une fois lorsqu'un réessai de signalisation le rediffuse. Même appel, même étape, même webhook-id : utiliser ce champ comme clé élimine le doublon.
  • Ne vous fiez pas à l'ordre. Les livraisons ne sont pas ordonnées : answered peut vous parvenir après ended. Triez par timestamp et laissez un événement arrivé plus tard mais avec un horodatage antérieur perdre.
  • Traitez ended comme le seul résultat fiable. C'est l'événement qui contient le statut et les durées, et c'est celui sur lequel baser vos propres enregistrements.
  • Réconciliez avec les enregistrements d'appels. Les événements fournissent des mises à jour en temps réel, tandis que le journal d'appels conserve l'enregistrement d'appel. Exportez les appels en CSV pour la réconciliation.

Étapes suivantes

PageCe qu'elle couvre
Webhooks et événementsConfiguration de l'endpoint, vérification de la signature, réessais et rediffusion
Journal d'appelsTous les champs d'un enregistrement d'appel et export CSV

Ressources associées

Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.

Obtenir un guide d'implémentation