Appels
Gestion des appels vidéo. Comprend le listage, les détails, l'attribution, le démarrage, la finalisation et le téléversement de fichiers.
Endpoints
| Méthode | Endpoint | Description | Rôle Minimum |
|---|---|---|---|
GET | /api/v1/calls | Lister les appels | attendant |
GET | /api/v1/calls/:id | Détails de l'appel | attendant |
POST | /api/v1/calls/:id/assign | Attribuer un appel à un agent | attendant |
POST | /api/v1/calls/:id/start | Démarrer l'appel | attendant |
POST | /api/v1/calls/:id/complete | Finaliser l'appel | attendant |
POST | /api/v1/calls/:call_id/upload | Téléverser un fichier dans l'appel | attendant |
GET | /api/v1/calls/:call_id/tags | Tags de l'appel | attendant |
POST | /api/v1/calls/:call_id/tags | Ajouter un tag | attendant |
DELETE | /api/v1/calls/:call_id/tags/:tag_id | Retirer un tag | attendant |
GET | /api/v1/calls/:call_id/transcript | Transcription de l'appel | attendant |
GET | /api/v1/calls/:call_id/summary | Résumé IA de l'appel | attendant |
POST | /api/v1/calls/:id/manager-notes | Ajouter une note de gestion | supervisor |
Lister les Appels
Retourne la liste paginée des appels du tenant.
GET /api/v1/callsQuery Parameters
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
page | integer | 1 | Numéro de page |
page_size | integer | 20 | Éléments par page |
sort_by | string | inserted_at | Champ de tri |
sort_order | string | desc | Direction du tri |
status | string | - | Filtre par statut : queued, active, completed, missed, cancelled |
department_id | uuid | - | Filtre par département |
user_id | uuid | - | Filtre par agent |
date_from | string | - | Date de début (ISO 8601) |
date_to | string | - | Date de fin (ISO 8601) |
search | string | - | Recherche par nom/email du client |
Exemple de Requête
curl -X GET "https://voki.avanter.com.br/api/v1/calls?page=1&page_size=10&status=completed&date_from=2026-02-01" \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Réponse de Succès (200)
{
"data": [
{
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "completed",
"department_id": "e5f6a7b8-c9d0-1234-efgh-567890123456",
"department_name": "Suporte Técnico",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"user_name": "João Silva",
"customer_name": "Carlos Ferreira",
"customer_email": "carlos@email.com",
"customer_phone": "+5511999998888",
"duration": 345,
"wait_time": 12,
"rating": 5,
"notes": "Cliente precisava de ajuda com configuração",
"has_recording": true,
"started_at": "2026-02-15T14:30:00Z",
"completed_at": "2026-02-15T14:35:45Z",
"inserted_at": "2026-02-15T14:29:48Z"
}
],
"meta": {
"current_page": 1,
"page_size": 10,
"total_pages": 15,
"total_count": 142
}
}Détails de l'Appel
GET /api/v1/calls/:idExemple de Requête
curl -X GET https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890 \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Réponse de Succès (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "completed",
"department_id": "e5f6a7b8-c9d0-1234-efgh-567890123456",
"department_name": "Suporte Técnico",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"user_name": "João Silva",
"customer_name": "Carlos Ferreira",
"customer_email": "carlos@email.com",
"customer_phone": "+5511999998888",
"duration": 345,
"wait_time": 12,
"rating": 5,
"notes": "Cliente precisava de ajuda com configuração",
"has_recording": true,
"recording_url": "/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/recording",
"tags": [
{
"id": "t1a2b3c4-d5e6-7890-abcd-ef1234567890",
"name": "Suporte",
"color": "#3b82f6"
}
],
"started_at": "2026-02-15T14:30:00Z",
"completed_at": "2026-02-15T14:35:45Z",
"inserted_at": "2026-02-15T14:29:48Z"
}
}Attribuer un Appel
Attribue un appel de la file d'attente à un agent.
POST /api/v1/calls/:id/assignRequest Body (optionnel)
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
user_id | uuid | Non | ID de l'agent (défaut : utilisateur authentifié) |
Exemple de Requête
curl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/assign \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter" \
-H "Content-Type: application/json"Réponse de Succès (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "assigned",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"user_name": "João Silva"
}
}Démarrer l'Appel
Marque le début effectif de l'appel vidéo.
POST /api/v1/calls/:id/startExemple de Requête
curl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/start \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Réponse de Succès (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "active",
"started_at": "2026-02-18T14:30:00Z"
}
}Finaliser l'Appel
Marque l'appel comme terminé.
POST /api/v1/calls/:id/completeRequest Body (optionnel)
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
notes | string | Non | Notes de l'agent sur l'appel |
Exemple de Requête
curl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/complete \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter" \
-H "Content-Type: application/json" \
-d '{
"notes": "Problème résolu. Client satisfait."
}'Réponse de Succès (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "completed",
"completed_at": "2026-02-18T14:45:00Z"
}
}Téléversement de Fichier
Téléverse un fichier associé à un appel (ex : documents partagés).
POST /api/v1/calls/:call_id/uploadRequête
Envoyez en multipart/form-data.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
file | file | Oui | Fichier à envoyer |
Exemple de Requête
curl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/upload \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter" \
-F "file=@documento.pdf"Réponse de Succès (201)
{
"data": {
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"filename": "documento.pdf",
"content_type": "application/pdf",
"size": 245678,
"url": "/uploads/calls/1a2b3c4d/documento.pdf"
}
}Tags de l'Appel
Lister les Tags
GET /api/v1/calls/:call_id/tagscurl -X GET https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/tags \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Ajouter un Tag
POST /api/v1/calls/:call_id/tagscurl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/tags \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter" \
-H "Content-Type: application/json" \
-d '{
"tag_id": "t1a2b3c4-d5e6-7890-abcd-ef1234567890"
}'Retirer un Tag
DELETE /api/v1/calls/:call_id/tags/:tag_idcurl -X DELETE https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/tags/t1a2b3c4-d5e6-7890-abcd-ef1234567890 \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Statuts de l'Appel
| Statut | Description |
|---|---|
queued | En file d'attente, en attente d'un agent |
assigned | Attribué à un agent |
active | Appel vidéo en cours |
completed | Terminé |
missed | Non pris en charge (timeout) |
cancelled | Annulé par le client |
abandoned | Abandonné (expiré dans la file d'attente) |
Transcription de l'Appel
Retourne la transcription générée automatiquement pendant l'appel (lorsque la fonctionnalité de transcription est activée dans le plan).
GET /api/v1/calls/:call_id/transcriptExemple de Requête
curl -X GET https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/transcript \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Réponse de Succès (200)
{
"data": {
"call_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"transcript": "Agent : Bonjour, comment puis-je vous aider ?\nClient : J'ai besoin d'un support technique...",
"language": "pt-BR",
"generated_at": "2026-02-18T14:46:00Z"
}
}Erreurs
| Statut | Description |
|---|---|
403 | Fonctionnalité transcription non disponible dans le plan |
404 | Appel non trouvé ou pas de transcription |
Résumé IA de l'Appel
Retourne le résumé généré par IA après la finalisation de l'appel (disponible dans les plans avec la fonctionnalité ai_summaries).
GET /api/v1/calls/:call_id/summaryExemple de Requête
curl -X GET https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/summary \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Réponse de Succès (200)
{
"data": {
"call_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"summary": "Le client nous a contactés pour résoudre un problème de configuration...",
"provider": "openai",
"model": "gpt-4o-mini",
"generated_at": "2026-02-18T14:46:30Z"
}
}Erreurs
| Statut | Description |
|---|---|
403 | Fonctionnalité ai_summaries non disponible dans le plan |
404 | Appel non trouvé ou pas de résumé |
Notes de Gestion
Ajoute des notes de gestion à un appel terminé. Les notes sont en mode append-only (ajoutées avec horodatage et auteur), jamais remplacées.
Rôles autorisés : owner, manager, supervisor
POST /api/v1/calls/:id/manager-notesRequest Body
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
notes | string | Oui | Texte de la note de gestion |
Exemple de Requête
curl -X POST https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890/manager-notes \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter" \
-H "Content-Type: application/json" \
-d '{
"notes": "Excellent service. Demander un retour au client."
}'Réponse de Succès (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"manager_notes": "[2026-02-18 14:50 - Ana Superviseure] Excellent service. Demander un retour au client."
}
}Erreurs
| Statut | Description |
|---|---|
403 | Seuls owner, manager ou supervisor peuvent ajouter des notes |
404 | Appel non trouvé |
422 | Champ notes vide |
Reconnexion d'Appels
Lorsqu'un participant se déconnecte pendant un appel actif, le système initie une période de grâce de 60 secondes pour la reconnexion automatique. Le champ end_reason indique comment l'appel a été terminé.
Champs de Reconnexion
| Champ | Type | Description |
|---|---|---|
disconnected_at | datetime | Moment de la déconnexion (null si aucune) |
reconnected_at | datetime | Moment de la reconnexion (null si pas de reconnexion) |
end_reason | string | Raison de la terminaison : normal, timeout, disconnect, abandoned |
Flux de Reconnexion
- Le participant se déconnecte -> événement
peer_disconnectedenvoyé via WebSocket - Un timer de 60 secondes démarre sur le frontend (interface de reconnexion avec compte à rebours)
- Si reconnecté dans les 60s -> événement
peer_reconnected-> renégociation WebRTC - Si pas de reconnexion -> appel terminé avec
end_reason: "disconnect"
