FalaAI API — Manual de uso, campos e fluxos

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

CodigoHTTPCausa
invalid_api_key401Bearer ausente ou invalido.
key_expired401Chave expirada.
invalid_token401JWT ausente/invalido/expirado.
insufficient_scope403A 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:

EndpointObrigatoriosObservacao
POST /v1/audio/transcriptionsfilemp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · ate 1 GB e 3 horas
POST /v1/analyze/diagnosticlanguage + (text ou dialog)um dos dois: text (simples) ou dialog (com falantes/tempos)
POST /v1/analyze/riskAuditdialog, duration_seconds, language, response_languageauditoria so aceita diarizado; duracao max 3h (10800s)
POST /v1/whatsapp/extractConversationsfile, 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

CampoTipoDescricao
statusstringEstado geral da API
versionstringVersao atual da API
uptime_secondsintegerTempo no ar, em segundos
databasebooleanEstado da conexao com o banco
phasestringFase de desenvolvimento
launch_datestringData 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

CampoTipoDescricao
servicestringNome do servico
versionstringVersao atual do contrato
deployDatestringCarimbo 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

CampoTipoObrigatorioO que e / valores
filearquivosimAudio: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · ate 1 GB e 3 horas
modelstringnaofalaai-transcribe-1 (default)
languagestringnaoForca o idioma do audio (ex.: pt); se omitido, e detectado
client_reference_idstringnaoID livre devolvido na resposta (correlacao; nao e idempotencia)

Requisição (exemplo cURL)

carregando...

Resposta — campos

CampoTipoDescricao
idstringtr- + UUID
objectstringsempre transcription
modelstringModelo usado
filenamestringNome do arquivo enviado
processed_atstringISO UTC do processamento
languagestringIdioma detectado (ISO 639-3, ex. por)
language_confidencenumberConfianca da deteccao do idioma
duration_secondsnumberDuracao do audio
textstringTexto corrido
dialogstringTurnos Speaker N: [HH:MM:SS.mmm - HH:MM:SS.mmm] texto
audio_events[]arrayEventos: event, start_s, end_s, duration_s, formatted_timestamp
event_types[]arrayTipos de evento detectados
word_countintegerNumero de palavras
inputobjectduration_s, original_format, codec, sample_rate, channels
usageobjectaudio_seconds, credits_consumed, processing_ms
client_reference_idstringEco 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

CampoTipoObrigatorioO que e / valores
languagestringsimIdioma da transcricao: pt-BR, en-US, es-ES, es-MX, fr-FR, de-DE, it-IT, pt-PT...
dialogstringum dos doisFonte primaria: falas com falante e tempos (Speaker 1: [00:00:00.100 - ...] ...)
textstringum dos doisTranscricao simples (usada se dialog estiver vazio)
duration_secondsnumbercom dialogDuracao total do audio (ignorada quando so ha text)
audio_eventsarraycom dialogEventos de audio: {"event":"[sigh]","start_s":3.1,"end_s":4.7} (campos: event obrigatorio; start_s, end_s, duration_s, formatted_timestamp opcionais)
participantsarraynaoPapeis explicitos (se omitido, a IA infere): interlocutor (obrig.) + role = agent | client | bot; name opcional
response_languagestringnaoIdioma das saidas (pode diferir do idioma de entrada)
call_directionstringnaoinbound (cliente ligou) ou outbound (empresa ligou); se omitido, a IA infere
modelstringnaofalaai-diagnostic-1 (default)
client_reference_idstringnaoID livre devolvido na resposta

Requisição (exemplo cURL)

carregando...

Resposta — campos

CampoTipoDescricao
idstringdi- + UUID
objectstringsempre analysis
response_languagestringIdioma usado na resposta
analysis.dialogue_summaryobject{ explanation } — resumo do diálogo
analysis.contact_reasonobject{ explanation } — motivo do contato
analysis.identified_actionobject{ list_choice, justification, evidence_phrases[] }
analysis.identified_labelobject{ list_choice, justification, evidence_phrases[] }
analysis.sentimentobject{ list_choice, justification, evidence_phrases[] }
analysis.participants_identified[]array{ interlocutor, role, name, confidence, evidence }
usageobject{ characters, credits_consumed, processing_ms }
client_reference_idstringEco verbatim (se enviado)
html_reportstringbase64+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

CampoTipoObrigatorioO que e / valores
dialogstringsimFalas com falante e tempos (mesmo formato do diagnostico)
duration_secondsnumbersimDuracao total; deve ser >= fim do ultimo turno; max 3h (10800s)
languagestringsimIdioma do dialog (deve casar com o texto)
response_languagestringsimIdioma das saidas e do relatorio HTML (pt/en/es)
response_formatstringnaov2 (default) — unico disponivel hoje
audio_eventsarraynaoEventos de audio (mesmo formato do diagnostico)
participantsarraynaoPapeis explicitos; sem eles a IA infere
call_directionstringnaoinbound | outbound
modelstringnaofalaai-risk-audit-1 (default)
client_reference_idstringnaoID livre devolvido na resposta

Requisição (exemplo cURL)

carregando...

Resposta — campos (dentro de response)

CampoTipoDescricao
response.metaobjectIdentificacao (id, object, call_duration_s, analyzed_at, client_reference_id) + usage
response.participantsobjectidentified[], call_direction, role_inference_reliable, identification_status, unidentified_items_count
response.verdictobjectlabel, level_code, risk_matrix, applied_actions[]
response.scoresobjectconversation (score consolidado, densidade, tendência, severidade) + per_participant
response.detectionsobjectviolations[], positives[], client_risk_alerts[], client_behavior_alerts[], client_negatives[]
response.analysisobjectglobal_metrics, final_analysis, frameworks (COPC/ISO/Kirkpatrick/CSAT)
response.timelineobjectturns_sentiment[] (VAD por turno), audio_events[], audio_groups_found[]
response.audio_event_modelobjectSemântica MAC dos eventos + windows_s
response.categories_summaryobjectCatálogo por chave (categoria, crítica, scores, termos)
response.actions_i18nobjectAções por chave (label/descrição/prioridade)
response.indexerobjectsuggested_terms_for_bank[]
response.summaryobjectContagens (turnos, ativos, tolerados, eventos, participantes)
response.audit_decisionsobjectOrigem do risco + zero-tolerance
response.scoring_explanationobjectComposição do score passo a passo
response.html_reportstringHTML 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

CampoTipoObrigatorioO que e / valores
filearquivosimExport: .zip (com midia) ou .txt (sem midia). Precisa de chat.txt em UTF-8
timezonestringsimOffset 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_formatstringsimOrdem 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 / endstringfora do previewJanela 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
windowsstringalternativaVarias janelas: JSON [{"start":"...","end":"..."}] — nao combinar com start/end
dry_runbooleannao (default false)true = PREVIEW gratis: valida, segmenta e ESTIMA os creditos sem chamar a IA e sem debitar
gap_minutesnumbernao (default 720)Intervalo sem mensagens que separa uma conversa da outra (720 = 12 h)
min_messagesintegernao (default 2)Minimo de mensagens para o trecho virar conversa
voice_notebooleannao (default true)Transcrever as mensagens de voz/video gravadas na hora
expressionbooleannao (default true)Descrever expressoes visuais (figurinha/GIF/imagem)
client_reference_idstringnaoID livre devolvido na resposta

Requisição (exemplo cURL, por variante)

Preview (gratis)

carregando...

Janela unica (extracao)

carregando...

Varias janelas (extracao)

carregando...

Resposta — campos

CampoTipoDescricao
objectstringPreview: whatsapp_preview; extração: conversations
dry_runbooleantrue no preview
credits_chargednumber0 no preview
credits_totalnumberEstimativa de créditos
paramsobjectPreview: start, end, timezone, date_format, gap_minutes, min_messages, voice_note, expression
windows[]arrayPreview: janelas detectadas
items[]arrayPreview: conversation_id, first_at, last_at, duration_minutes, messages, characters, speakers[]
warnings[]arrayAvisos (preview)
idstringExtração: wc- + UUID
usageobjectExtração: conversations, characters, expressions, expressions_figurinha, expressions_gif, expressions_emoji, voice_notes, conversation_credits, expression_credits, audio_credits, credits_consumed, processing_ms
conversations[]arrayExtração: conversation_id, first_at, last_at, duration_seconds, speakers[], dialog, message_count, characters
metaobjectExtraçã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_idstringEco 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

CenarioSequencia
Contact center com gravacoestranscriptions → riskAudit (100% das conversas)
Ja tenho transcricao (Whisper etc.)diagnostic e/ou riskAudit (BYOT)
Atendimento por WhatsAppextractConversations → diagnostic/riskAudit
Qualidade + contextodiagnostic (motivo/acao) + riskAudit (risco)
MonitoracaoGET/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

MetodoPathEscopoDescricao
GET/v1/webhooks?page&limitalerts ou *Lista as inscricoes (paginado: page≥1, limit 1..100, default 20). Inclui o secret.
POST/v1/webhooksalerts 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

CodigoHTTPCausa
invalid_api_key / key_expired / invalid_token401Bearer ausente/invalido/expirado.
insufficient_scope403Sem o escopo alerts/*.
no_fields400PUT sem nenhum campo para atualizar.
(conflito)409Ja existe webhook para esse destino (URL duplicada).
(Pydantic)422Payload 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

Manual da API: endpoints, campos e fluxos | FalaAI API