Vision general
La FalaAI API es un conjunto de APIs independientes. No necesitas transcribir con FalaAI para diagnosticar o auditar: si ya tienes el texto, envialo directo al analisis (BYOT).
- Clave: todas las rutas exigen Authorization: Bearer fai_<tu_clave>, excepto GET/HEAD /v1/health y GET /api/version.
- Zero-storage (LGPD): audio/texto/resultado se procesan en memoria y se descartan.
- Idiomas: transcripcion en 31 idiomas; diagnostico en 21 locales; auditoria y reporte HTML en 3 (pt/en/es).
Autenticacion
Para que sirve: como probar quien eres en cada llamada.
- Clave: toda ruta exige el header Authorization: Bearer fai_<tu_clave> — excepto GET/HEAD /v1/health y GET /api/version (publicas, sin clave).
- Como obtenerla: crea la cuenta y genera la API Key en el Dashboard. La clave aparece una unica vez (show-once) — guardala con seguridad.
- Scopes: cada clave tiene scopes —
transcribe, diagnostic, auditoria, whatsapp, alerts, billing, invoices (o * para todos). Ruta sin el scope exigido → 403 insufficient_scope.
- JWT: ademas de la clave
fai_, la API acepta JWT de sesion en las mismas rutas.
Errores de autenticacion
| Codigo | HTTP | Causa |
invalid_api_key | 401 | Bearer ausente o invalido. |
key_expired | 401 | Clave expirada. |
invalid_token | 401 | JWT ausente/invalido/expirado. |
insufficient_scope | 403 | La clave no tiene el scope exigido por la ruta. |
Campos obligatorios — resumen rapido
Si solo quieres hacerlo funcionar, estos son los campos que la API exige en cada endpoint:
| Endpoint | Obligatorios | Observacion |
POST /v1/audio/transcriptions | file | mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · hasta 1 GB y 3 horas |
POST /v1/analyze/diagnostic | language + (text o dialog) | uno de los dos: text (simple) o dialog (con hablantes/tiempos) |
POST /v1/analyze/riskAudit | dialog, duration_seconds, language, response_language | la auditoria solo acepta diarizado; duracion max 3h (10800s) |
POST /v1/whatsapp/extractConversations | file, timezone, date_format (+ start/end fuera del preview) | ver valores aceptados en la seccion del endpoint |
GET/HEAD /v1/health · GET /api/version | — (publicos, sin clave) | ningun campo |
Regla de oro de los analisis: entrada = text (transcripcion simple) o dialog (quien hablo + timestamps). La auditoria de riesgo exige dialog.
GET /v1/health publico
sin clavemonitorizacion
Para que sirve: solo decir si el servidor esta activo y la version/uptime/estado de la base. No analiza nada.
flowchart LR
A[Monitor / uptime / curl] -->|GET /v1/health| B{{FalaAI API}}
B -->|200| C[status, version, uptime, database]
A2[Comprobacion ligera] -->|HEAD /v1/health| B
B -->|200 sin cuerpo| D[solo el 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
Ninguno.
Solicitud (ejemplo cURL)
cargando...
Respuesta — campos
| Campo | Tipo | Descripcion |
status | string | Estado general de la API |
version | string | Version actual de la API |
uptime_seconds | integer | Tiempo activo, en segundos |
database | boolean | Estado de la conexion con la base |
phase | string | Fase de desarrollo |
launch_date | string | Fecha prevista de lanzamiento publico |
HEAD /v1/health = mismo 200 sin cuerpo.
Ejemplo de respuesta (JSON)
cargando...
Flujos posibles
- Uptime/monitor (cada 1 min) con alerta si != 200.
- Health check de deploy (mas barato):
HEAD. - Leer la version de la API para log.
GET /api/version publico
sin clave
Para que sirve: identificar la version del contrato en uso (fijar la compatibilidad de tu cliente).
flowchart LR
A[Tu cliente / CI] -->|GET /api/version| B{{FalaAI API}}
B --> C[version del contrato]
C --> D[Fijar/validar compatibilidad]
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
Ninguno.
Respuesta
| Campo | Tipo | Descripcion |
service | string | Nombre del servicio |
version | string | Version actual del contrato |
deployDate | string | Marca de fecha/hora del deploy |
POST /v1/audio/transcriptions multipart/form-data
requiere fai_text, dialog, audio_events
Para que sirve: convertir audio en texto con separacion de quien hablo (diarizacion), timestamps y eventos de audio.
Campos
| Campo | Tipo | Obligatorio | Que es / valores |
file | archivo | si | Audio: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · hasta 1 GB y 3 horas |
model | string | no | falaai-transcribe-1 (default) |
language | string | no | Fuerza el idioma del audio (ej.: pt); si se omite, se detecta |
client_reference_id | string | no | ID libre devuelto en la respuesta (correlacion; no es idempotencia) |
Solicitud (ejemplo cURL)
cargando...
Respuesta — campos
| Campo | Tipo | Descripcion |
id | string | tr- + UUID |
object | string | sempre transcription |
model | string | Modelo usado |
filename | string | Nombre del archivo enviado |
processed_at | string | ISO UTC del procesamiento |
language | string | Idioma detectado (ISO 639-3, ej. por) |
language_confidence | number | Confianza de la deteccion del idioma |
duration_seconds | number | Duracion del 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 palabras |
input | object | duration_s, original_format, codec, sample_rate, channels |
usage | object | audio_seconds, credits_consumed, processing_ms |
client_reference_id | string | Eco verbatim (si se envio) |
Ejemplo de respuesta (JSON)
cargando...
Flujo
flowchart TD
S([Tienes el audio?]) -->|si| U[Elegir el archivo: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac... hasta 1GB / 3h]
U --> T[POST /v1/audio/transcriptions + file]
T --> R[Respuesta: text, dialog, audio_events, duration_seconds, usage]
R --> D1[Usar en Diagnostic]
R --> A1[Usar en Risk Audit]
R --> DB[(Tu base / CRM / BI)]
S -->|no, ya tengo texto| B[Saltar: ir directo a Diagnostic o 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
Flujos posibles
- Audio → transcripcion → diagnostico (resumen, motivo, accion, topico, sentimiento).
- Audio → transcripcion → auditoria de riesgo (score + violaciones + reporte).
- Audio → transcripcion → (diagnostico + auditoria) en la misma conversacion.
- Lote: repetir por archivo en cola y consolidar por cuenta/equipo.
POST /v1/analyze/diagnostic application/json
requiere fai_resumen, motivo, accion, topico, sentimiento
Para que sirve: diagnosticar la conversacion — 5 analisis en una llamada.
Campos
| Campo | Tipo | Obligatorio | Que es / valores |
language | string | si | Idioma de la transcripcion: pt-BR, en-US, es-ES, es-MX, fr-FR, de-DE, it-IT, pt-PT... |
dialog | string | uno de los dos | Fuente primaria: turnos con hablante y tiempos (Speaker 1: [00:00:00.100 - ...] ...) |
text | string | uno de los dos | Transcripcion simple (usada si dialog esta vacio) |
duration_seconds | number | con dialog | Duracion total del audio (ignorada cuando solo hay text) |
audio_events | array | con dialog | Eventos de audio: {"event":"[sigh]","start_s":3.1,"end_s":4.7} (campos: event obligatorio; start_s, end_s, duration_s, formatted_timestamp opcionales) |
participants | array | no | Roles explicitos (si se omite, la IA infiere): interlocutor (oblig.) + role = agent | client | bot; name opcional |
response_language | string | no | Idioma de las salidas (puede diferir del idioma de entrada) |
call_direction | string | no | inbound (el cliente llamo) u outbound (la empresa llamo); si se omite, la IA infiere |
model | string | no | falaai-diagnostic-1 (default) |
client_reference_id | string | no | ID livre devolvido na resposta |
Solicitud (ejemplo cURL)
cargando...
Respuesta — campos
| Campo | Tipo | Descripcion |
id | string | di- + UUID |
object | string | siempre analysis |
response_language | string | Idioma usado en la respuesta |
analysis.dialogue_summary | object | { explanation } — resumen del dialogo |
analysis.contact_reason | object | { explanation } — motivo del contacto |
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 (si se envio) |
html_report | string | base64+gzip; solo cuando hay dialog |
Ejemplo de respuesta (JSON)
cargando...
Flujo
flowchart TD
I{Como tienes la conversacion?} -->|transcripcion simple| X[text = transcripcion corrida + language]
I -->|con quien hablo| Y[dialog = turnos con hablante y tiempos + language + duration_seconds]
X --> P[POST /v1/analyze/diagnostic]
Y --> P
P --> R[summary, contact_reason, action_taken, topic, sentiment]
R --> O1[Dashboard de calidad / 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
Flujos posibles
- Ya tengo transcripcion (Whisper/Deepgram/propia) → solo diagnosticar (BYOT).
- Audio → transcripcion → diagnostico (pipeline completo).
- Diagnostico + auditoria en la misma conversacion.
- Lote por conversacion y agregacion por periodo/equipo (
client_reference_id para rastrear).
POST /v1/analyze/riskAudit application/json
requiere fai_score + violaciones + reporte
Para que sirve: auditar riesgo/compliance (COPC CX, ISO 18295-1, LGPD): score, detecciones/violaciones, evidencias y reporte HTML auditable.
Obligatorio: solo acepta dialog (diarizado). Con text simple no se ejecuta.
Campos
| Campo | Tipo | Obligatorio | Que es / valores |
dialog | string | si | Turnos con hablante y tiempos (mismo formato del diagnostico) |
duration_seconds | number | si | Duracion total; debe ser >= el fin del ultimo turno; max 3h (10800s) |
language | string | si | Idioma del dialog (debe coincidir con el texto) |
response_language | string | si | Idioma de las salidas y del reporte HTML (pt/en/es) |
response_format | string | no | v2 (default) — unico disponible hoy |
audio_events | array | no | Eventos de audio (mismo formato del diagnostico) |
participants | array | no | Roles explicitos; sin ellos la IA infiere |
call_direction | string | no | inbound | outbound |
model | string | no | falaai-risk-audit-1 (default) |
client_reference_id | string | no | ID livre devolvido na resposta |
Solicitud (ejemplo cURL)
cargando...
Respuesta — campos (dentro de response)
| Campo | Tipo | Descripcion |
response.meta | object | Identificacion (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, densidad, tendencia, severidad) + 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 | Semantica MAC de los eventos + windows_s |
response.categories_summary | object | Catalogo por clave (categoria, critica, scores, terminos) |
response.actions_i18n | object | Acciones por clave (label/descripcion/prioridad) |
response.indexer | object | suggested_terms_for_bank[] |
response.summary | object | Conteos (turnos, activos, tolerados, eventos, participantes) |
response.audit_decisions | object | Origen del riesgo + zero-tolerance |
response.scoring_explanation | object | Composicion del score paso a paso |
response.html_report | string | HTML en base64+gzip |
Ejemplo de respuesta (JSON)
cargando...
Flujo
flowchart TD
A{Ya tengo el dialog?} -->|si| P[POST /v1/analyze/riskAudit + dialog + duration_seconds + language + response_language]
A -->|solo audio| T[POST /v1/audio/transcriptions] --> P
P --> R[risk score, detections, verdict, summary, usage]
R --> V1[Reporte HTML auditable]
R --> V2[Auditoria 100% de las conversaciones]
R --> V3[Evidencia para juridico / disputa]
R --> V4[Plan de accion por equipo]
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
Flujos posibles
- Auditoria puntual: una conversacion → score + violaciones + reporte.
- Auditoria en lote (100%): todas las conversaciones del dia/semana → ranking por riesgo.
- Auditoria + diagnostico para contexto (motivo/accion) junto al riesgo.
- Reverificacion despues de entrenamiento (compara score antes/despues).
POST /v1/whatsapp/extractConversations multipart/form-data
requiere fai_conversaciones extraidas
Para que sirve: extraer y segmentar conversaciones de un export de WhatsApp (.zip/.txt) para luego diagnosticar o auditar.
Campos
| Campo | Tipo | Obligatorio | Que es / valores |
file | archivo | si | Export: .zip (con multimedia) o .txt (sin multimedia). Requiere chat.txt en UTF-8 |
timezone | string | si | Offset de UTC. Ej.: -3 = America/Sao_Paulo (Brasil), +0 = Africa/Abidjan, +5:30 = Asia/Calcutta. Acepta de -11 a +14 (pasos de 15 min) |
date_format | string | si | Orden de la fecha en el export: day_first (DD/MM/AAAA — Brasil), month_first (MM/DD/AAAA — EE.UU.) o year_first (AAAA/MM/DD). Otro valor → 400 invalid_date_format |
start / end | string | fora do preview | Ventana de extraccion, en el formato del date_format (acepta tambien ISO YYYY-MM-DD HH:MM). Centinela 00/00/0000 00:00 (o vacio) = archivo completo |
windows | string | alternativa | Varias ventanas: JSON [{"start":"...","end":"..."}] — no combinar con start/end |
dry_run | boolean | nao (default false) | true = PREVIEW gratis: valida, segmenta y ESTIMA los creditos sin llamar a la IA y sin debitar |
gap_minutes | number | nao (default 720) | Intervalo sin mensajes que separa una conversacion de otra (720 = 12 h) |
min_messages | integer | nao (default 2) | Minimo de mensajes para que el tramo se convierta en conversacion |
voice_note | boolean | nao (default true) | Transcribir los mensajes de voz/video grabados en el momento |
expression | boolean | nao (default true) | Describir expresiones visuales (sticker/GIF/imagen) |
client_reference_id | string | no | ID livre devolvido na resposta |
Solicitud (ejemplo cURL, por variante)
Preview (gratis)
cargando...
Ventana unica (extraccion)
cargando...
Varias ventanas (extraccion)
cargando...
Respuesta — campos
| Campo | Tipo | Descripcion |
object | string | Preview: whatsapp_preview; extraccion: conversations |
dry_run | boolean | true en el preview |
credits_charged | number | 0 en el preview |
credits_total | number | Estimacion de creditos |
params | object | Preview: start, end, timezone, date_format, gap_minutes, min_messages, voice_note, expression |
windows[] | array | Preview: ventanas detectadas |
items[] | array | Preview: conversation_id, first_at, last_at, duration_minutes, messages, characters, speakers[] |
warnings[] | array | Avisos (preview) |
id | string | Extraccion: wc- + UUID |
usage | object | Extraccion: conversations, characters, expressions, expressions_figurinha, expressions_gif, expressions_emoji, voice_notes, conversation_credits, expression_credits, audio_credits, credits_consumed, processing_ms |
conversations[] | array | Extraccion: conversation_id, first_at, last_at, duration_seconds, speakers[], dialog, message_count, characters |
meta | object | Extraccion: 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 (si se envio) |
Ejemplo de respuesta (JSON, por variante)
Preview (gratis)
cargando...
Ventana unica (extraccion)
cargando...
Varias ventanas (extraccion)
cargando...
Flujo (con las 3 variantes)
flowchart TD
U[Export de WhatsApp: .zip o .txt] --> V{Elegir la variante}
V -->|preview gratis| P1[dry_run=true: devuelve ROTULOS y previas - no extrae la conversacion]
V -->|ventana unica| P2[start + end definen 1 ventana]
V -->|varias ventanas| P3[windows = JSON con varias ventanas]
P2 --> C[conversations: dialog, participantes, mensajes, duracion]
P3 --> C
C --> J[Usar como transcripcion JSON en el Playground]
C --> D[POST /v1/analyze/diagnostic]
C --> A[POST /v1/analyze/riskAudit]
P1 --> L[Conferir volumen/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
Flujos posibles
- Conferir antes (gratis): ejecutar
dry_run=true para ver cuantas conversaciones/rotulos existen y la estimacion de creditos.
- Extraer la conversacion completa (
start+end) → diagnosticar/auditar.
- Extraer varias ventanas (
windows) → diagnosticar/auditar en lote.
- Atencion por WhatsApp → conversa extraida → auditoria de risco (compliance).
En el Playground, el boton Usar como transcripcion JSON solo se habilita cuando la respuesta trae una conversacion con dialog (variantes ventana unica/varias ventanas). En la variante preview ni aparece.
Flujos combinados (arbol de decision)
flowchart TD
S([Que tienes en mano?]) --> A{Audio?}
A -->|si| T[Transcripcion] --> Q{Que quieres saber?}
A -->|no, tengo texto| Q
A -->|no, tengo el export de WhatsApp| W[Extract WhatsApp] --> Q
Q -->|resumen/motivo/accion/sentimiento| D[Diagnostic]
Q -->|riesgo/compliance/reporte| R[Risk Audit]
Q -->|los dos| D2[Diagnostic + Risk Audit]
D --> FIM([JSON tipado para tu 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
Recetas listas
| Escenario | Secuencia |
| Contact center con grabaciones | transcriptions → riskAudit (100% de las conversaciones) |
| Ya tengo transcripcion (Whisper etc.) | diagnostic y/o riskAudit (BYOT) |
| Atencion por WhatsApp | extractConversations → diagnostic/riskAudit |
| Calidad + contexto | diagnostic (motivo/accion) + riskAudit (riesgo) |
| Monitorizacion | GET/HEAD /v1/health cada minuto |
Webhooks de alertas
Para que sirve: recibir avisos de suscripcion/cobro/creditos en un endpoint HTTPS tuyo, sin consultar la API.
Alcance: son alertas de cobro/creditos/suscripcion (10 eventos). No existe evento de "analisis concluido".
Endpoints
| Metodo | Path | Alcance | Descripcion |
GET | /v1/webhooks?page&limit | alerts ou * | Lista las suscripciones (paginado: page≥1, limit 1..100, default 20). Incluye el secret. |
POST | /v1/webhooks | alerts ou * | Crea la suscripcion. Devuelve el secret (hex 64). |
PUT | /v1/webhooks/{webhook_id} | alerts ou * | Actualiza name/url/events/retry_enabled/active. |
DELETE | /v1/webhooks/{webhook_id} | alerts ou * | Elimina la suscripcion. |
Eventos (10)
subscription.created · avulso.completed · subscription.upgraded · subscription.downgraded · subscription.canceled
credits.low · credits.exhausted · subscription.renewed · subscription.expired · payment.failed
Payload (ejemplo)
{
"event": "credits.low",
"data": { "balance_monthly": 12, "balance_avulso": 0, "total": 12, "plan": "starter_api", "plan_name": "Starter API - 90K" },
"timestamp": 1725470000.123
}
Entrega y seguridad
- Firma: todo disparo trae el header FalaAI-Signature: t=<unix>,v0=<hmac_sha256(secret, "<t>.<cuerpo crudo>")>. Valida recalculando el HMAC con tu
secret y comparalo con v0; rechaza si t esta fuera de la ventana de tolerancia (anti-replay).
- Retry:
retry_enabled=false = 1 intento; true = hasta 5 (backoff 2^attempt: 1s, 2s, 4s, 8s). Timeout HTTP de 10s por disparo; respuesta < 500 cuenta como entregada; tras 5 fallos consecutivos la suscripcion se auto-desactiva (active=false).
Errores
| Codigo | HTTP | Causa |
invalid_api_key / key_expired / invalid_token | 401 | Bearer ausente/invalido/expirado. |
insufficient_scope | 403 | Sin el scope alerts/*. |
no_fields | 400 | PUT sin ningun campo para actualizar. |
| (conflito) | 409 | Ya existe un webhook para ese destino (URL duplicada). |
| (Pydantic) | 422 | Payload invalido (evento fuera del enum, URL invalida...). |
Ejemplo de creacion:
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 y errores comunes
- 401: clave ausente/invalida (
Authorization: Bearer fai_...).
- 402 / creditos: saldo insuficiente para la operacion.
- 413 / limite: archivo por encima de 1 GB (o audio por encima de 3 h).
- 422: campo obligatorio ausente o formato invalido (ej.: auditoria sin
dialog; WhatsApp sin timezone/date_format).
- Publico sin clave: solo
GET/HEAD /v1/health y GET /api/version.
Contrato completo: Swagger · openapi.json · Quickstart · Playground