Envoyez et recevez l’audio d’un appel depuis votre propre programme, par exemple votre propre système téléphonique ou votre app. Lancez l’appel :
curl https://evasay.com/api/v1/voice/calls/websocket \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "AGENT_ID", "encoding": "pcm_s16le", "sample_rate": 16000 }'
Le websocket_url de la réponse porte un jeton à usage unique et peut être ouvert dans les 15 minutes. encoding vaut pcm_s16le (PCM 16 bits little-endian à une sample_rate de 8000, 16000 ou 24000) ou mulaw (μ-law 8 kHz). L’audio circule dans les deux sens en trames binaires dans ce format, idéalement de 20 ms chacune. Les trames texte sont en JSON :
| Sens | Messages |
|---|---|
| Vous → EvaSay | {"type":"dtmf","digits":"12#"} touches pressées ; {"type":"end"} raccroche ; {"type":"text","text":"…"} mots tapés par l’appelant ("input":"button" pour une réponse touchée) ; {"type":"context","text":"…","key":"cart"} ce que signale votre app (l’agent n’y répond pas) ; {"type":"typing"} le client est en train d’écrire (envoyez-le environ une fois par seconde pendant la saisie ; l’agent ne parle pas pendant 2 s) ; {"type":"tool_result","id":"…","result":{…}} (ou "error") la réponse d’une fonction de page |
| EvaSay → vous | start (avec callId) ; clear (l’appelant a interrompu : abandonner l’audio de l’agent pas encore joué) ; transcript (role, text, final, et input pour les mots tapés) ; user_started_speaking, user_stopped_speaking, agent_started_speaking, agent_stopped_speaking ; cards (cards, quick_replies) ; tool (id, name, arguments : exécuter l’une de vos fonctions de page) ; notice (code : too_fast ou limit pour les mots tapés) ; ended (avec reason, puis le socket se ferme) |
L’agent salue dès que vous êtes connecté. user_id et page_tools (les fonctions de page auxquelles répond votre app, voir plus bas) peuvent être ajoutés à la requête. Les appels sont facturés à la minute comme les autres, avec les mêmes historiques, analyses et webhooks.