FalaAI API — Manual de uso, campos y flujos

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

CodigoHTTPCausa
invalid_api_key401Bearer ausente o invalido.
key_expired401Clave expirada.
invalid_token401JWT ausente/invalido/expirado.
insufficient_scope403La 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:

EndpointObligatoriosObservacion
POST /v1/audio/transcriptionsfilemp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · hasta 1 GB y 3 horas
POST /v1/analyze/diagnosticlanguage + (text o dialog)uno de los dos: text (simple) o dialog (con hablantes/tiempos)
POST /v1/analyze/riskAuditdialog, duration_seconds, language, response_languagela auditoria solo acepta diarizado; duracion max 3h (10800s)
POST /v1/whatsapp/extractConversationsfile, 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

CampoTipoDescripcion
statusstringEstado general de la API
versionstringVersion actual de la API
uptime_secondsintegerTiempo activo, en segundos
databasebooleanEstado de la conexion con la base
phasestringFase de desarrollo
launch_datestringFecha 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

CampoTipoDescripcion
servicestringNombre del servicio
versionstringVersion actual del contrato
deployDatestringMarca 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

CampoTipoObligatorioQue es / valores
filearchivosiAudio: mp3, mp4, m4a, wav, flac, ogg, opus, webm, aac · hasta 1 GB y 3 horas
modelstringnofalaai-transcribe-1 (default)
languagestringnoFuerza el idioma del audio (ej.: pt); si se omite, se detecta
client_reference_idstringnoID libre devuelto en la respuesta (correlacion; no es idempotencia)

Solicitud (ejemplo cURL)

cargando...

Respuesta — campos

CampoTipoDescripcion
idstringtr- + UUID
objectstringsempre transcription
modelstringModelo usado
filenamestringNombre del archivo enviado
processed_atstringISO UTC del procesamiento
languagestringIdioma detectado (ISO 639-3, ej. por)
language_confidencenumberConfianza de la deteccion del idioma
duration_secondsnumberDuracion del 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 palabras
inputobjectduration_s, original_format, codec, sample_rate, channels
usageobjectaudio_seconds, credits_consumed, processing_ms
client_reference_idstringEco 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

CampoTipoObligatorioQue es / valores
languagestringsiIdioma de la transcripcion: pt-BR, en-US, es-ES, es-MX, fr-FR, de-DE, it-IT, pt-PT...
dialogstringuno de los dosFuente primaria: turnos con hablante y tiempos (Speaker 1: [00:00:00.100 - ...] ...)
textstringuno de los dosTranscripcion simple (usada si dialog esta vacio)
duration_secondsnumbercon dialogDuracion total del audio (ignorada cuando solo hay text)
audio_eventsarraycon dialogEventos de audio: {"event":"[sigh]","start_s":3.1,"end_s":4.7} (campos: event obligatorio; start_s, end_s, duration_s, formatted_timestamp opcionales)
participantsarraynoRoles explicitos (si se omite, la IA infiere): interlocutor (oblig.) + role = agent | client | bot; name opcional
response_languagestringnoIdioma de las salidas (puede diferir del idioma de entrada)
call_directionstringnoinbound (el cliente llamo) u outbound (la empresa llamo); si se omite, la IA infiere
modelstringnofalaai-diagnostic-1 (default)
client_reference_idstringnoID livre devolvido na resposta

Solicitud (ejemplo cURL)

cargando...

Respuesta — campos

CampoTipoDescripcion
idstringdi- + UUID
objectstringsiempre analysis
response_languagestringIdioma usado en la respuesta
analysis.dialogue_summaryobject{ explanation } — resumen del dialogo
analysis.contact_reasonobject{ explanation } — motivo del contacto
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 (si se envio)
html_reportstringbase64+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

CampoTipoObligatorioQue es / valores
dialogstringsiTurnos con hablante y tiempos (mismo formato del diagnostico)
duration_secondsnumbersiDuracion total; debe ser >= el fin del ultimo turno; max 3h (10800s)
languagestringsiIdioma del dialog (debe coincidir con el texto)
response_languagestringsiIdioma de las salidas y del reporte HTML (pt/en/es)
response_formatstringnov2 (default) — unico disponible hoy
audio_eventsarraynoEventos de audio (mismo formato del diagnostico)
participantsarraynoRoles explicitos; sin ellos la IA infiere
call_directionstringnoinbound | outbound
modelstringnofalaai-risk-audit-1 (default)
client_reference_idstringnoID livre devolvido na resposta

Solicitud (ejemplo cURL)

cargando...

Respuesta — campos (dentro de response)

CampoTipoDescripcion
response.metaobjectIdentificacion (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, densidad, tendencia, severidad) + 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_modelobjectSemantica MAC de los eventos + windows_s
response.categories_summaryobjectCatalogo por clave (categoria, critica, scores, terminos)
response.actions_i18nobjectAcciones por clave (label/descripcion/prioridad)
response.indexerobjectsuggested_terms_for_bank[]
response.summaryobjectConteos (turnos, activos, tolerados, eventos, participantes)
response.audit_decisionsobjectOrigen del riesgo + zero-tolerance
response.scoring_explanationobjectComposicion del score paso a paso
response.html_reportstringHTML 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

CampoTipoObligatorioQue es / valores
filearchivosiExport: .zip (con multimedia) o .txt (sin multimedia). Requiere chat.txt en UTF-8
timezonestringsiOffset 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_formatstringsiOrden 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 / endstringfora do previewVentana 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
windowsstringalternativaVarias ventanas: JSON [{"start":"...","end":"..."}] — no combinar con start/end
dry_runbooleannao (default false)true = PREVIEW gratis: valida, segmenta y ESTIMA los creditos sin llamar a la IA y sin debitar
gap_minutesnumbernao (default 720)Intervalo sin mensajes que separa una conversacion de otra (720 = 12 h)
min_messagesintegernao (default 2)Minimo de mensajes para que el tramo se convierta en conversacion
voice_notebooleannao (default true)Transcribir los mensajes de voz/video grabados en el momento
expressionbooleannao (default true)Describir expresiones visuales (sticker/GIF/imagen)
client_reference_idstringnoID livre devolvido na resposta

Solicitud (ejemplo cURL, por variante)

Preview (gratis)

cargando...

Ventana unica (extraccion)

cargando...

Varias ventanas (extraccion)

cargando...

Respuesta — campos

CampoTipoDescripcion
objectstringPreview: whatsapp_preview; extraccion: conversations
dry_runbooleantrue en el preview
credits_chargednumber0 en el preview
credits_totalnumberEstimacion de creditos
paramsobjectPreview: start, end, timezone, date_format, gap_minutes, min_messages, voice_note, expression
windows[]arrayPreview: ventanas detectadas
items[]arrayPreview: conversation_id, first_at, last_at, duration_minutes, messages, characters, speakers[]
warnings[]arrayAvisos (preview)
idstringExtraccion: wc- + UUID
usageobjectExtraccion: conversations, characters, expressions, expressions_figurinha, expressions_gif, expressions_emoji, voice_notes, conversation_credits, expression_credits, audio_credits, credits_consumed, processing_ms
conversations[]arrayExtraccion: conversation_id, first_at, last_at, duration_seconds, speakers[], dialog, message_count, characters
metaobjectExtraccion: 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 (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

EscenarioSecuencia
Contact center con grabacionestranscriptions → riskAudit (100% de las conversaciones)
Ya tengo transcripcion (Whisper etc.)diagnostic y/o riskAudit (BYOT)
Atencion por WhatsAppextractConversations → diagnostic/riskAudit
Calidad + contextodiagnostic (motivo/accion) + riskAudit (riesgo)
MonitorizacionGET/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

MetodoPathAlcanceDescripcion
GET/v1/webhooks?page&limitalerts ou *Lista las suscripciones (paginado: page≥1, limit 1..100, default 20). Incluye el secret.
POST/v1/webhooksalerts 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

CodigoHTTPCausa
invalid_api_key / key_expired / invalid_token401Bearer ausente/invalido/expirado.
insufficient_scope403Sin el scope alerts/*.
no_fields400PUT sin ningun campo para actualizar.
(conflito)409Ya existe un webhook para ese destino (URL duplicada).
(Pydantic)422Payload 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

Manual de la API: endpoints, campos y flujos | FalaAI API