Chamadas
Gerenciamento de chamadas de vídeo. Inclui listagem, detalhes, atribuição, início, conclusão e upload de arquivos.
Endpoints
| Método | Endpoint | Descrição | Role Mínimo |
|---|---|---|---|
GET | /api/v1/calls | Listar chamadas | attendant |
GET | /api/v1/calls/:id | Detalhes da chamada | attendant |
POST | /api/v1/calls/:id/assign | Atribuir chamada a atendente | attendant |
POST | /api/v1/calls/:id/start | Iniciar chamada | attendant |
POST | /api/v1/calls/:id/complete | Finalizar chamada | attendant |
POST | /api/v1/calls/:call_id/upload | Upload de arquivo na chamada | attendant |
GET | /api/v1/calls/:call_id/tags | Tags da chamada | attendant |
POST | /api/v1/calls/:call_id/tags | Adicionar tag | attendant |
DELETE | /api/v1/calls/:call_id/tags/:tag_id | Remover tag | attendant |
GET | /api/v1/calls/:call_id/transcript | Transcrição da chamada | attendant |
GET | /api/v1/calls/:call_id/summary | Resumo IA da chamada | attendant |
POST | /api/v1/calls/:id/manager-notes | Adicionar nota gerencial | supervisor |
Listar Chamadas
Retorna a lista paginada de chamadas do tenant.
GET /api/v1/callsQuery Parameters
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
page | integer | 1 | Número da página |
page_size | integer | 20 | Itens por página |
sort_by | string | inserted_at | Campo para ordenação |
sort_order | string | desc | Direção da ordenação |
status | string | - | Filtro por status: queued, active, completed, missed, cancelled |
department_id | uuid | - | Filtro por departamento |
user_id | uuid | - | Filtro por atendente |
date_from | string | - | Data início (ISO 8601) |
date_to | string | - | Data fim (ISO 8601) |
search | string | - | Busca por nome/email do cliente |
Exemplo de Request
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"Resposta de Sucesso (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
}
}Detalhes da Chamada
GET /api/v1/calls/:idExemplo de Request
curl -X GET https://voki.avanter.com.br/api/v1/calls/1a2b3c4d-5e6f-7890-abcd-ef1234567890 \
-H "Authorization: Bearer eyJhbGci..." \
-H "X-Tenant: avanter"Resposta de Sucesso (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"
}
}Atribuir Chamada
Atribui uma chamada da fila a um atendente.
POST /api/v1/calls/:id/assignRequest Body (opcional)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
user_id | uuid | Não | ID do atendente (padrão: usuário autenticado) |
Exemplo de Request
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"Resposta de Sucesso (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "assigned",
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"user_name": "João Silva"
}
}Iniciar Chamada
Marca o início efetivo da chamada de vídeo.
POST /api/v1/calls/:id/startExemplo de Request
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"Resposta de Sucesso (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "active",
"started_at": "2026-02-18T14:30:00Z"
}
}Finalizar Chamada
Marca a chamada como concluída.
POST /api/v1/calls/:id/completeRequest Body (opcional)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
notes | string | Não | Notas do atendente sobre a chamada |
Exemplo de Request
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": "Problema resolvido. Cliente satisfeito."
}'Resposta de Sucesso (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"status": "completed",
"completed_at": "2026-02-18T14:45:00Z"
}
}Upload de Arquivo
Faz upload de um arquivo associado a uma chamada (ex: documentos compartilhados).
POST /api/v1/calls/:call_id/uploadRequest
Envie como multipart/form-data.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
file | file | Sim | Arquivo a ser enviado |
Exemplo de Request
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"Resposta de Sucesso (201)
{
"data": {
"id": "f1a2b3c4-d5e6-7890-abcd-ef1234567890",
"filename": "documento.pdf",
"content_type": "application/pdf",
"size": 245678,
"url": "/uploads/calls/1a2b3c4d/documento.pdf"
}
}Tags da Chamada
Listar 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"Adicionar 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"
}'Remover 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"Status da Chamada
| Status | Descrição |
|---|---|
queued | Na fila aguardando atendente |
assigned | Atribuída a um atendente |
active | Chamada de vídeo em andamento |
completed | Finalizada |
missed | Não atendida (timeout) |
cancelled | Cancelada pelo cliente |
abandoned | Abandonada (expirou na fila) |
Transcrição da Chamada
Retorna a transcrição gerada automaticamente durante a chamada (quando a feature de transcrição está habilitada no plano).
GET /api/v1/calls/:call_id/transcriptExemplo de Request
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"Resposta de Sucesso (200)
{
"data": {
"call_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"transcript": "Atendente: Bom dia, como posso ajudar?\nCliente: Preciso de suporte técnico...",
"language": "pt-BR",
"generated_at": "2026-02-18T14:46:00Z"
}
}Erros
| Status | Descrição |
|---|---|
403 | Feature transcription não disponível no plano |
404 | Chamada não encontrada ou sem transcrição |
Resumo IA da Chamada
Retorna o resumo gerado por IA após a conclusão da chamada (disponível em planos com feature ai_summaries).
GET /api/v1/calls/:call_id/summaryExemplo de Request
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"Resposta de Sucesso (200)
{
"data": {
"call_id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"summary": "O cliente entrou em contato para resolver um problema de configuração...",
"provider": "openai",
"model": "gpt-4o-mini",
"generated_at": "2026-02-18T14:46:30Z"
}
}Erros
| Status | Descrição |
|---|---|
403 | Feature ai_summaries não disponível no plano |
404 | Chamada não encontrada ou sem resumo |
Notas Gerenciais
Adiciona notas gerenciais a uma chamada concluída. As notas são append-only (adicionadas com timestamp e autor), não substituídas.
Roles permitidos: owner, manager, supervisor
POST /api/v1/calls/:id/manager-notesRequest Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
notes | string | Sim | Texto da nota gerencial |
Exemplo de Request
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": "Excelente atendimento. Solicitar feedback do cliente."
}'Resposta de Sucesso (200)
{
"data": {
"id": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
"manager_notes": "[2026-02-18 14:50 - Ana Supervisora] Excelente atendimento. Solicitar feedback do cliente."
}
}Erros
| Status | Descrição |
|---|---|
403 | Apenas owner, manager ou supervisor podem adicionar notas |
404 | Chamada não encontrada |
422 | Campo notes vazio |
Reconexão de Chamadas
Quando um participante se desconecta durante uma chamada ativa, o sistema inicia um período de graça de 60 segundos para reconexão automática. O campo end_reason indica como a chamada foi encerrada.
Campos de Reconexão
| Campo | Tipo | Descrição |
|---|---|---|
disconnected_at | datetime | Momento da desconexão (null se não houve) |
reconnected_at | datetime | Momento da reconexão (null se não reconectou) |
end_reason | string | Razão do encerramento: normal, timeout, disconnect, abandoned |
Fluxo de Reconexão
- Participante se desconecta → evento
peer_disconnectedenviado via WebSocket - Timer de 60 segundos inicia no frontend (UI de reconexão com countdown)
- Se reconectar dentro de 60s → evento
peer_reconnected→ renegociação WebRTC - Se não reconectar → chamada encerrada com
end_reason: "disconnect"
