Visao geral
A FalaAI API e um conjunto de APIs independentes. Voce nao precisa transcrever com a FalaAI para diagnosticar ou auditar: se voce ja tem o texto, envie direto para a analise (BYOT).
- Chave: todas as rotas exigem Authorization: Bearer fai_<sua_chave>, exceto GET/HEAD /v1/health e GET /api/version.
- Zero-storage (LGPD): audio/texto/resultado sao processados em memoria e descartados.
- Idiomas: transcricao em 31 idiomas; diagnostico em 21 locales; auditoria e relatorio HTML em 3 (pt/en/es).
Autenticacao
Para que serve: como provar quem voce e em cada chamada.
- Chave: toda rota exige o header Authorization: Bearer fai_<sua_chave> — exceto GET/HEAD /v1/health e GET /api/version (publicas, sem chave).
- Como obter: crie a conta e gere a API Key no Dashboard. A chave aparece uma unica vez (show-once) — guarde-a com seguranca.
- Escopos: cada chave tem escopos —
transcribe, diagnostic, auditoria, whatsapp, alerts, billing, invoices (ou * para todos). Rota sem o escopo exigido → 403 insufficient_scope.
- JWT: alem da chave
fai_, a API aceita JWT de sessao nas mesmas rotas.
Erros de autenticacao
| Codigo | HTTP | Causa |
invalid_api_key | 401 | Bearer ausente ou invalido. |
key_expired | 401 | Chave expirada. |
invalid_token | 401 | JWT ausente/invalido/expirado. |
insufficient_scope | 403 | A chave nao tem o escopo exigido pela rota. |
Campos obrigatorios — resumo rapido
Se voce so quer fazer funcionar, estes sao os campos que a API exige em cada endpoint:
| Endpoint | Obrigatorios | Observacao |
POST /v1/audio/transcriptions | file | mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · ate 1 GB e 3 horas |
POST /v1/analyze/diagnostic | language + (text ou dialog) | um dos dois: text (simples) ou dialog (com falantes/tempos) |
POST /v1/analyze/riskAudit | dialog, duration_seconds, language, response_language | auditoria so aceita diarizado; duracao max 3h (10800s) |
POST /v1/whatsapp/extractConversations | file, timezone, date_format (+ start/end fora do preview) | ver valores aceitos na secao do endpoint |
GET/HEAD /v1/health · GET /api/version | — (publicos, sem chave) | nenhum campo |
Regra de ouro das analises: entrada = text (transcricao simples) ou dialog (com quem falou + timestamps). A auditoria de risco exige dialog.
GET /v1/health publico
sem chavemonitoracao
Para que serve: apenas dizer se o servidor esta de pe e qual a versao/uptime/estado do banco. Nao analisa nada.
flowchart LR
A[Monitor / uptime / curl] -->|GET /v1/health| B{{FalaAI API}}
B -->|200| C[status, version, uptime, database]
A2[Checagem leve] -->|HEAD /v1/health| B
B -->|200 sem corpo| D[apenas o codigo HTTP]
classDef pub fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
class A,A2,C,D pub
class B api
Campos
Nenhum.
Requisição (exemplo cURL)
carregando...
Resposta — campos
| Campo | Tipo | Descricao |
status | string | Estado geral da API |
version | string | Versao atual da API |
uptime_seconds | integer | Tempo no ar, em segundos |
database | boolean | Estado da conexao com o banco |
phase | string | Fase de desenvolvimento |
launch_date | string | Data prevista de lancamento publico |
HEAD /v1/health = mesmo 200 sem corpo.
Exemplo de resposta (JSON)
carregando...
Fluxos possiveis
- Uptime/monitor (a cada 1 min) com alerta se != 200.
- Health check de deploy (mais barato):
HEAD. - Ler a versao da API para log.
GET /api/version publico
sem chave
Para que serve: identificar a versao do contrato em uso (fixar compatibilidade do seu cliente).
flowchart LR
A[Seu cliente / CI] -->|GET /api/version| B{{FalaAI API}}
B --> C[versao do contrato]
C --> D[Fixar/validar compatibilidade]
classDef pub fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
class A,C,D pub
class B api
Campos
Nenhum.
Resposta
| Campo | Tipo | Descricao |
service | string | Nome do servico |
version | string | Versao atual do contrato |
deployDate | string | Carimbo de data/hora do deploy |
POST /v1/audio/transcriptions multipart/form-data
requer fai_text, dialog, audio_events
Para que serve: transformar audio em texto com separacao de quem falou (diarizacao), timestamps e eventos de audio.
Campos
| Campo | Tipo | Obrigatorio | O que e / valores |
file | arquivo | sim | Audio: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · ate 1 GB e 3 horas |
model | string | nao | falaai-transcribe-1 (default) |
language | string | nao | Forca o idioma do audio (ex.: pt); se omitido, e detectado |
client_reference_id | string | nao | ID livre devolvido na resposta (correlacao; nao e idempotencia) |
Requisição (exemplo cURL)
carregando...
Resposta — campos
| Campo | Tipo | Descricao |
id | string | tr- + UUID |
object | string | sempre transcription |
model | string | Modelo usado |
filename | string | Nome do arquivo enviado |
processed_at | string | ISO UTC do processamento |
language | string | Idioma detectado (ISO 639-3, ex. por) |
language_confidence | number | Confianca da deteccao do idioma |
duration_seconds | number | Duracao do audio |
text | string | Texto corrido |
dialog | string | Turnos Speaker N: [HH:MM:SS.mmm - HH:MM:SS.mmm] texto |
audio_events[] | array | Eventos: event, start_s, end_s, duration_s, formatted_timestamp |
event_types[] | array | Tipos de evento detectados |
word_count | integer | Numero de palavras |
input | object | duration_s, original_format, codec, sample_rate, channels |
usage | object | audio_seconds, credits_consumed, processing_ms |
client_reference_id | string | Eco verbatim (se enviado) |
Exemplo de resposta (JSON)
carregando...
Fluxo
flowchart TD
S([Voce tem o audio?]) -->|sim| U[Escolher o arquivo: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac... ate 1GB / 3h]
U --> T[POST /v1/audio/transcriptions + file]
T --> R[Resposta: text, dialog, audio_events, duration_seconds, usage]
R --> D1[Usar em Diagnostic]
R --> A1[Usar em Risk Audit]
R --> DB[(Seu banco / CRM / BI)]
S -->|nao, ja tenho texto| B[Pular: ir direto para Diagnostic ou Risk Audit]
classDef in fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef out fill:#f3e8ff,stroke:#7c3aed,color:#4c1d95
class S,U,B in
class T api
class R,D1,A1,DB out
Fluxos possiveis
- Audio → transcricao → diagnostico (resumo, motivo, acao, topico, sentimento).
- Audio → transcricao → auditoria de risco (score + violacoes + relatorio).
- Audio → transcricao → (diagnostico + auditoria) na mesma conversa.
- Lote: repetir por arquivo em fila e consolidar por conta/equipe.
POST /v1/analyze/diagnostic application/json
requer fai_resumo, motivo, acao, topico, sentimento
Para que serve: diagnosticar a conversa — 5 analises em uma chamada.
Campos
| Campo | Tipo | Obrigatorio | O que e / valores |
language | string | sim | Idioma da transcricao: pt-BR, en-US, es-ES, es-MX, fr-FR, de-DE, it-IT, pt-PT... |
dialog | string | um dos dois | Fonte primaria: falas com falante e tempos (Speaker 1: [00:00:00.100 - ...] ...) |
text | string | um dos dois | Transcricao simples (usada se dialog estiver vazio) |
duration_seconds | number | com dialog | Duracao total do audio (ignorada quando so ha text) |
audio_events | array | com dialog | Eventos de audio: {"event":"[sigh]","start_s":3.1,"end_s":4.7} (campos: event obrigatorio; start_s, end_s, duration_s, formatted_timestamp opcionais) |
participants | array | nao | Papeis explicitos (se omitido, a IA infere): interlocutor (obrig.) + role = agent | client | bot; name opcional |
response_language | string | nao | Idioma das saidas (pode diferir do idioma de entrada) |
call_direction | string | nao | inbound (cliente ligou) ou outbound (empresa ligou); se omitido, a IA infere |
model | string | nao | falaai-diagnostic-1 (default) |
client_reference_id | string | nao | ID livre devolvido na resposta |
Requisição (exemplo cURL)
carregando...
Resposta — campos
| Campo | Tipo | Descricao |
id | string | di- + UUID |
object | string | sempre analysis |
response_language | string | Idioma usado na resposta |
analysis.dialogue_summary | object | { explanation } — resumo do diálogo |
analysis.contact_reason | object | { explanation } — motivo do contato |
analysis.identified_action | object | { list_choice, justification, evidence_phrases[] } |
analysis.identified_label | object | { list_choice, justification, evidence_phrases[] } |
analysis.sentiment | object | { list_choice, justification, evidence_phrases[] } |
analysis.participants_identified[] | array | { interlocutor, role, name, confidence, evidence } |
usage | object | { characters, credits_consumed, processing_ms } |
client_reference_id | string | Eco verbatim (se enviado) |
html_report | string | base64+gzip; só quando há dialog |
Exemplo de resposta (JSON)
carregando...
Fluxo
flowchart TD
I{Como voce tem a conversa?} -->|transcricao simples| X[text = transcricao corrida + language]
I -->|com quem falou| Y[dialog = falas com falante e tempos + language + duration_seconds]
X --> P[POST /v1/analyze/diagnostic]
Y --> P
P --> R[summary, contact_reason, action_taken, topic, sentiment]
R --> O1[Dashboard de qualidade / CX]
R --> O2[CRM / ticket / ERP]
R --> O3[BI / warehouse]
classDef in fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef out fill:#f3e8ff,stroke:#7c3aed,color:#4c1d95
class I,X,Y in
class P api
class R,O1,O2,O3 out
Fluxos possiveis
- Ja tenho transcricao (Whisper/Deepgram/proprio) → so diagnosticar (BYOT).
- Audio → transcricao → diagnostico (pipeline completo).
- Diagnostico + auditoria na mesma conversa.
- Lote por conversa e agregacao por periodo/equipe (
client_reference_id para rastrear).
POST /v1/analyze/riskAudit application/json
requer fai_score + violacoes + relatorio
Para que serve: auditar risco/compliance (COPC CX, ISO 18295-1, LGPD): score, deteccoes/violacoes, evidencias e relatorio HTML auditavel.
Obrigatorio: so aceita dialog (diarizado). Com text simples nao roda.
Campos
| Campo | Tipo | Obrigatorio | O que e / valores |
dialog | string | sim | Falas com falante e tempos (mesmo formato do diagnostico) |
duration_seconds | number | sim | Duracao total; deve ser >= fim do ultimo turno; max 3h (10800s) |
language | string | sim | Idioma do dialog (deve casar com o texto) |
response_language | string | sim | Idioma das saidas e do relatorio HTML (pt/en/es) |
response_format | string | nao | v2 (default) — unico disponivel hoje |
audio_events | array | nao | Eventos de audio (mesmo formato do diagnostico) |
participants | array | nao | Papeis explicitos; sem eles a IA infere |
call_direction | string | nao | inbound | outbound |
model | string | nao | falaai-risk-audit-1 (default) |
client_reference_id | string | nao | ID livre devolvido na resposta |
Requisição (exemplo cURL)
carregando...
Resposta — campos (dentro de response)
| Campo | Tipo | Descricao |
response.meta | object | Identificacao (id, object, call_duration_s, analyzed_at, client_reference_id) + usage |
response.participants | object | identified[], call_direction, role_inference_reliable, identification_status, unidentified_items_count |
response.verdict | object | label, level_code, risk_matrix, applied_actions[] |
response.scores | object | conversation (score consolidado, densidade, tendência, severidade) + per_participant |
response.detections | object | violations[], positives[], client_risk_alerts[], client_behavior_alerts[], client_negatives[] |
response.analysis | object | global_metrics, final_analysis, frameworks (COPC/ISO/Kirkpatrick/CSAT) |
response.timeline | object | turns_sentiment[] (VAD por turno), audio_events[], audio_groups_found[] |
response.audio_event_model | object | Semântica MAC dos eventos + windows_s |
response.categories_summary | object | Catálogo por chave (categoria, crítica, scores, termos) |
response.actions_i18n | object | Ações por chave (label/descrição/prioridade) |
response.indexer | object | suggested_terms_for_bank[] |
response.summary | object | Contagens (turnos, ativos, tolerados, eventos, participantes) |
response.audit_decisions | object | Origem do risco + zero-tolerance |
response.scoring_explanation | object | Composição do score passo a passo |
response.html_report | string | HTML em base64+gzip |
Exemplo de resposta (JSON)
carregando...
Fluxo
flowchart TD
A{Ja tenho o dialog?} -->|sim| P[POST /v1/analyze/riskAudit + dialog + duration_seconds + language + response_language]
A -->|so audio| T[POST /v1/audio/transcriptions] --> P
P --> R[risk score, detections, verdict, summary, usage]
R --> V1[Relatorio HTML auditavel]
R --> V2[Auditoria 100% das conversas]
R --> V3[Evidencia para juridico / disputa]
R --> V4[Plano de acao por equipe]
classDef in fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef out fill:#f3e8ff,stroke:#7c3aed,color:#4c1d95
class A,T in
class P api
class R,V1,V2,V3,V4 out
Fluxos possiveis
- Auditoria pontual: uma conversa → score + violacoes + relatorio.
- Auditoria em lote (100%): todas as conversas do dia/semana → ranking por risco.
- Auditoria + diagnostico para contexto (motivo/acao) junto do risco.
- Reverificacao depois de treinamento (compara score antes/depois).
POST /v1/whatsapp/extractConversations multipart/form-data
requer fai_conversas extraidas
Para que serve: extrair e segmentar conversas de um export do WhatsApp (.zip/.txt) para depois diagnosticar ou auditar.
Campos
| Campo | Tipo | Obrigatorio | O que e / valores |
file | arquivo | sim | Export: .zip (com midia) ou .txt (sem midia). Precisa de chat.txt em UTF-8 |
timezone | string | sim | Offset de UTC. Ex.: -3 = America/Sao_Paulo (Brasil), +0 = Africa/Abidjan, +5:30 = Asia/Calcutta. Aceita de -11 a +14 (passos de 15 min) |
date_format | string | sim | Ordem da data no export: day_first (DD/MM/AAAA — Brasil), month_first (MM/DD/AAAA — EUA) ou year_first (AAAA/MM/DD). Outro valor → 400 invalid_date_format |
start / end | string | fora do preview | Janela de extracao, no formato do date_format (aceita tambem ISO YYYY-MM-DD HH:MM). Sentinela 00/00/0000 00:00 (ou vazio) = arquivo inteiro |
windows | string | alternativa | Varias janelas: JSON [{"start":"...","end":"..."}] — nao combinar com start/end |
dry_run | boolean | nao (default false) | true = PREVIEW gratis: valida, segmenta e ESTIMA os creditos sem chamar a IA e sem debitar |
gap_minutes | number | nao (default 720) | Intervalo sem mensagens que separa uma conversa da outra (720 = 12 h) |
min_messages | integer | nao (default 2) | Minimo de mensagens para o trecho virar conversa |
voice_note | boolean | nao (default true) | Transcrever as mensagens de voz/video gravadas na hora |
expression | boolean | nao (default true) | Descrever expressoes visuais (figurinha/GIF/imagem) |
client_reference_id | string | nao | ID livre devolvido na resposta |
Requisição (exemplo cURL, por variante)
Preview (gratis)
carregando...
Janela unica (extracao)
carregando...
Varias janelas (extracao)
carregando...
Resposta — campos
| Campo | Tipo | Descricao |
object | string | Preview: whatsapp_preview; extração: conversations |
dry_run | boolean | true no preview |
credits_charged | number | 0 no preview |
credits_total | number | Estimativa de créditos |
params | object | Preview: start, end, timezone, date_format, gap_minutes, min_messages, voice_note, expression |
windows[] | array | Preview: janelas detectadas |
items[] | array | Preview: conversation_id, first_at, last_at, duration_minutes, messages, characters, speakers[] |
warnings[] | array | Avisos (preview) |
id | string | Extração: wc- + UUID |
usage | object | Extração: conversations, characters, expressions, expressions_figurinha, expressions_gif, expressions_emoji, voice_notes, conversation_credits, expression_credits, audio_credits, credits_consumed, processing_ms |
conversations[] | array | Extração: conversation_id, first_at, last_at, duration_seconds, speakers[], dialog, message_count, characters |
meta | object | Extração: file, chat_txt, format, date_format, timezone, start, end, gap_minutes, min_messages, turns, system_lines, conversations_total, conversations_in_window, monologues_dropped, conversations_selected, voice_note, expression, windows |
client_reference_id | string | Eco verbatim (se enviado) |
Exemplo de resposta (JSON, por variante)
Preview (gratis)
carregando...
Janela unica (extracao)
carregando...
Varias janelas (extracao)
carregando...
Fluxo (com as 3 variantes)
flowchart TD
U[Export do WhatsApp: .zip ou .txt] --> V{Escolher a variante}
V -->|preview gratis| P1[dry_run=true: devolve ROTULOS e previas - nao extrai conversa]
V -->|janela unica| P2[start + end definem 1 janela]
V -->|varias janelas| P3[windows = JSON com varias janelas]
P2 --> C[conversations: dialog, participantes, mensagens, duracao]
P3 --> C
C --> J[Usar como transcricao JSON no Playground]
C --> D[POST /v1/analyze/diagnostic]
C --> A[POST /v1/analyze/riskAudit]
P1 --> L[Conferir volume/rotulos antes de gastar creditos]
L --> V
classDef in fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef prev fill:#fef9c3,stroke:#ca8a04,color:#713f12
classDef out fill:#f3e8ff,stroke:#7c3aed,color:#4c1d95
class U,V in
class P1,P2,P3 api
class L prev
class C,J,D,A out
Fluxos possiveis
- Conferir antes (gratis): rodar
dry_run=true para ver quantas conversas/rotulos existem e a estimativa de creditos.
- Extrair a conversa inteira (
start+end) → diagnosticar/auditar.
- Extrair varias janelas (
windows) → diagnosticar/auditar em lote.
- Atendimento por WhatsApp → conversa extraida → auditoria de risco (compliance).
No Playground, o botao Usar como transcricao JSON so fica habilitado quando a resposta traz conversa com dialog (variantes janela unica/varias janelas). Na variante preview ele nem aparece.
Fluxos combinados (arvore de decisao)
flowchart TD
S([O que voce tem em maos?]) --> A{Audio?}
A -->|sim| T[Transcricao] --> Q{O que quer saber?}
A -->|nao, tenho texto| Q
A -->|nao, tenho export do WhatsApp| W[Extract WhatsApp] --> Q
Q -->|resumo/motivo/acao/sentimento| D[Diagnostic]
Q -->|risco/compliance/relatorio| R[Risk Audit]
Q -->|os dois| D2[Diagnostic + Risk Audit]
D --> FIM([JSON tipado para o seu sistema])
R --> FIM
D2 --> FIM
classDef in fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef out fill:#dcfce7,stroke:#16a34a,color:#14532d
class S,W in
class T,D,R,D2 api
class Q,FIM out
Receitas prontas
| Cenario | Sequencia |
| Contact center com gravacoes | transcriptions → riskAudit (100% das conversas) |
| Ja tenho transcricao (Whisper etc.) | diagnostic e/ou riskAudit (BYOT) |
| Atendimento por WhatsApp | extractConversations → diagnostic/riskAudit |
| Qualidade + contexto | diagnostic (motivo/acao) + riskAudit (risco) |
| Monitoracao | GET/HEAD /v1/health a cada minuto |
Webhooks de alertas
Para que serve: receber avisos de assinatura/cobranca/creditos em um endpoint HTTPS seu, sem precisar consultar a API.
Escopo: sao alertas de cobranca/creditos/assinatura (10 eventos). Nao existe evento de "analise concluida".
Endpoints
| Metodo | Path | Escopo | Descricao |
GET | /v1/webhooks?page&limit | alerts ou * | Lista as inscricoes (paginado: page≥1, limit 1..100, default 20). Inclui o secret. |
POST | /v1/webhooks | alerts ou * | Cria a inscricao. Devolve o secret (hex 64). |
PUT | /v1/webhooks/{webhook_id} | alerts ou * | Atualiza name/url/events/retry_enabled/active. |
DELETE | /v1/webhooks/{webhook_id} | alerts ou * | Remove a inscricao. |
Eventos (10)
subscription.created · avulso.completed · subscription.upgraded · subscription.downgraded · subscription.canceled
credits.low · credits.exhausted · subscription.renewed · subscription.expired · payment.failed
Payload (exemplo)
{
"event": "credits.low",
"data": { "balance_monthly": 12, "balance_avulso": 0, "total": 12, "plan": "starter_api", "plan_name": "Starter API - 90K" },
"timestamp": 1725470000.123
}
Entrega e seguranca
- Assinatura: todo disparo traz o header FalaAI-Signature: t=<unix>,v0=<hmac_sha256(secret, "<t>.<corpo cru>")>. Valide recomputando o HMAC com o seu
secret e compare com v0; rejeite se o t estiver fora da janela de tolerancia (anti-replay).
- Retry:
retry_enabled=false = 1 tentativa; true = ate 5 (backoff 2^attempt: 1s, 2s, 4s, 8s). Timeout HTTP de 10s por disparo; resposta < 500 conta como entregue; apos 5 falhas consecutivas a inscricao e auto-desativada (active=false).
Erros
| Codigo | HTTP | Causa |
invalid_api_key / key_expired / invalid_token | 401 | Bearer ausente/invalido/expirado. |
insufficient_scope | 403 | Sem o escopo alerts/*. |
no_fields | 400 | PUT sem nenhum campo para atualizar. |
| (conflito) | 409 | Ja existe webhook para esse destino (URL duplicada). |
| (Pydantic) | 422 | Payload invalido (evento fora do enum, URL invalida...). |
Exemplo de criacao:
curl -X POST https://api01-falaai.action.tec.br/v1/webhooks -H "Authorization: Bearer fai_<sua_chave>" -H "Content-Type: application/json" -d '{"name":"Alertas","url":"https://seu-endpoint.com/webhook","events":["credits.low","payment.failed"],"retry_enabled":true}'
Limites e erros comuns
- 401: chave ausente/invalida (
Authorization: Bearer fai_...).
- 402 / creditos: saldo insuficiente para a operacao.
- 413 / limite: arquivo acima de 1 GB (ou audio acima de 3 h).
- 422: campo obrigatorio ausente ou formato invalido (ex.: auditoria sem
dialog; WhatsApp sem timezone/date_format).
- Publico sem chave: somente
GET/HEAD /v1/health e GET /api/version.
Contrato completo: Swagger · openapi.json · Quickstart · Playground