ThunderPhone 2.0 est disponible.En libre-service, à partir de 2 ¢/min.Découvrir l’annonce

Developer cookbook

Passer des appels sortants (API)

Déclenchez un appel sortant piloté par l’IA depuis votre propre code — pour des flux d’enquête, de suivi ou de confirmation.

Les appels sortants vous permettent de fournir un numéro de destination et une configuration d’agent à ThunderPhone afin que l’IA passe l’appel en votre nom. Cas d’usage courants :

  • Confirmations de rendez-vous
  • Rappels d’enquêtes
  • Relances de « deuxième tentative » après un appel manqué
  • Notifications de type répartition

Prérequis

  1. Choisir un numéro autorisé pour les appels sortants

    Utilisez un numéro que vous possédez via une connexion VoIP, ou demandez l'autorisation d'utiliser vos numéros ThunderPhone pour les appels sortants depuis la page Phone Numbers. Les numéros ThunderPhone sont initialement réservés aux appels entrants. ThunderPhone examine chaque demande manuellement ; une fois approuvés, ces numéros peuvent passer des appels jusqu'à la limite quotidienne approuvée (réinitialisée à 00:00 UTC) et lancer des campagnes, et vous pouvez demander une limite plus élevée. Les numéros VoIP des clients n'ont pas de limite quotidienne ; nous les recommandons donc pour les appels sortants. Consultez Utiliser vos propres numéros.

  2. Créer un agent

    Un prompt orienté appels sortants commence généralement par l'agent qui s'identifie et précise son objectif — « Bonjour, Acme vous appelle pour confirmer votre rendez-vous de demain à 15 h… » Définissez outbound_speak_order sur agent_first (valeur par défaut).

  3. Maintenir un solde positif

    Les appels sortants renvoient 402 Payment Required si le solde est ≤ $0.00. Rechargez votre compte ou activez le rechargement automatique dans Organisation → Paramètres de facturation du tableau de bord. Votre clé sk_live_ peut vérifier le solde avec GET /v1/billing, mais ne peut pas recharger le compte ni modifier le rechargement automatique.

Passer un appel avec un agent enregistré

La méthode la plus simple — référencer un agent par son identifiant :

curl -X POST https://api.thunderphone.com/v1/call \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from_number": "+15551234567",
    "to_number":   "+14155552671",
    "agent_id":    12
  }'

Réponse :

{ "call_id": 987654321, "status": "initiated" }

Passer un appel avec une configuration intégrée

Si vous souhaitez utiliser un prompt ponctuel qui ne mérite pas d’être enregistré comme agent, transmettez plutôt config. Sa structure correspond au schéma de réponse du webhook call.incoming :

curl -X POST https://api.thunderphone.com/v1/call \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from_number": "+15551234567",
    "to_number":   "+14155552671",
    "config": {
      "prompt":  "You are confirming Jane Doe appointment for 3pm tomorrow…",
      "voice":   "john",
      "product": "spark"
    }
  }'

Suivre l'appel

En parallèle, abonnez-vous au webhook telephony.complete — le moyen le plus rapide de savoir qu'un appel est terminé. Si vous ne pouvez pas accepter les webhooks entrants, interrogez GET /v1/calls/{call_id} toutes les quelques secondes ; l'enregistrement inclut end_reason, duration_seconds et l'URL de l'enregistrement une fois l'appel terminé.

Si votre agent est configuré pour extraire des données structurées après l'appel, ces données sont livrées séparément une fois la finalisation terminée.

Transmettre des variables par appel à un agent enregistré

Les agents enregistrés peuvent utiliser des espaces réservés tels que {{name}} ou {{name|there}} dans le texte du prompt. Lorsque vous passez un appel sortant avec agent_id, transmettez variables avec les valeurs de cet appel :

{
  "from_number": "+[REDACTED_PHONE]",
  "to_number": "+[REDACTED_PHONE]",
  "agent_id": 12,
  "variables": {
    "name": "Jordan"
  }
}

Utilisez des valeurs de chaîne associées au nom de l'espace réservé. Ces variables s'appliquent aux agents enregistrés ; l'exemple config en ligne de ce guide ne les utilise pas.

Modes d'échec à gérer

ErreurCorrectif
402 Payment RequiredRechargez le solde ou activez le rechargement automatique
400 avec code: destination_not_allowedThunderPhone n'appelle pas ce numéro : numéros non valides, numéros d'urgence, numéros surtaxés, codes courts ou pays sous sanctions. Depuis des numéros ThunderPhone, seuls les numéros ordinaires des États-Unis et du Canada sont autorisés (sans numéros surtaxés). reason indique lequel ; consultez les destinations bloquées
409 avec retryable: false pour un numéro ThunderPhoneSuivez le code : demandez l'autorisation d'appels sortants sur la page Numéros de téléphone, attendez l'examen en cours ou utilisez un autre numéro éligible
429 avec code: platform_outbound_daily_limit_reachedL'organisation a utilisé les appels sortants du jour depuis des numéros ThunderPhone. Attendez resets_at (00:00 UTC), demandez une limite plus élevée sur la page Numéros de téléphone ou appelez depuis un numéro sur votre propre connexion VoIP
429 avec code: concurrent_call_limit_reachedL'organisation a autant d'appels en cours que sa limite d'appels simultanés (20 par défaut, en comptant les appels entrants, sortants, web et de test). Réessayez après le nombre de secondes indiqué par l'en-tête Retry-After ou lorsqu'un appel se termine ; envoyez un e-mail à support@thunderphone.com pour augmenter la limite
429 avec code: same_number_too_soonVous avez appelé le même to_number il y a moins de 10 secondes. Réessayez après le nombre de secondes indiqué par l'en-tête Retry-After
409 avec retryable: false pour un numéro VoIP clientCorrigez l'état indiqué par code ; en cas d'échec de vérification, exécutez POST /v1/phone-numbers/{id}/verify-voip
Conflit d'idempotence 409Réutilisez la clé uniquement avec la requête normalisée d'origine, ou envoyez une nouvelle clé
404 from_number is not registered to this organizationVérifiez que from_number correspond à un numéro de téléphone actif dans votre organisation. Un numéro déjà en cours de provisionnement, en échec, en cours de libération ou libéré renvoie également cette réponse
500 avec uniquement un champ detailAucun trunk sortant n'est configuré. Contactez le support ; il ne s'agit pas d'un problème d'état du numéro que vous pouvez corriger
502 Bad GatewayÉchec SIP / LiveKit temporaire ; vous pouvez réessayer

Consultez la référence des appels sortants pour obtenir la liste complète et stable des codes d'éligibilité ainsi que les deux formats de réponse 409. Si un numéro actif devient non éligible après l'acceptation de la requête mais avant le passage de l'appel, la vérification finale renvoie la charge utile 409 non réessayable.

Contrôler le temps d'attente

Les appels sortants qui durent longtemps parce que l'appelé répond lentement (arborescences IVR, files d'attente) peuvent être plafonnés avec max_hold_seconds :

{
  "from_number": "+15551234567",
  "to_number":   "+14155552671",
  "agent_id":    12,
  "max_hold_seconds": 120
}

L’agent raccroche si aucun audio humain n’a été reçu au cours des N dernières secondes. La valeur par défaut est de 900 secondes (15 minutes).


Étapes suivantes