Saltar al contenido principal

Generar SQL: POST /v1/ask

Recibe una pregunta en lenguaje natural y devuelve un SELECT validado por el SQL Guard, con los valores en params. Cada llamada hace de 1 a 2 llamadas al LLM de tu tenant (la segunda es una corrección automática cuando el primer SQL es rechazado).

Solicitud​

Headers:

Authorization: Bearer tsk_1a2b3c4d_...
Content-Type: application/json
Accept-Language: es (opcional)

Cuerpo:

{
"question": "¿Cuántos pedidos se hicieron ayer?",
"end_user": "5f0c3a9e7b1d4e2f8a6c0b9d3e7f1a2c4b5d6e7f8091a2b3c4d5e6f708192a3b",
"max_rows": 100,
"locale": "es"
}
CampoTipoObligatorioDescripción
questionstringsíLa pregunta, de hasta 2.000 caracteres.
end_userstringsí*Identificador opaco de la persona que preguntó, de 16 a 128 caracteres (A-Z, a-z, 0-9, _, -). Consulta Identificador del usuario final. *Obligatorio para la mayoría de los clientes.
max_rowsenteronoMáximo de filas, ≥ 1. Por defecto 100, techo 1.000. La API aplica un LIMIT al SQL; las agregaciones que devuelven una sola fila quedan sin LIMIT.
localestringnoIdioma de message y explanation: pt-BR, en o es. Variantes como en-US o es-419 caen en el idioma principal (en, es). Precedencia: este campo → header Accept-Language → idioma por defecto del tenant (configurado en el panel) → pt-BR.

Los campos desconocidos se rechazan con 422 invalid_request. El cuerpo completo puede tener hasta 96 KiB.

Respuesta 200​

{
"sql": "SELECT count(*) AS total FROM public.pedidos WHERE criado_em >= %(start)s AND criado_em < %(end)s",
"params": { "start": "2026-10-22", "end": "2026-10-23" },
"dialect": "postgres",
"tables": ["public.pedidos"],
"explanation": "Cuenta los pedidos creados ayer.",
"locale": "es",
"request_id": "req_0f3c9a7d2b6e4f1a8c5d0e9b7a6f3c21"
}
CampoTipoDescripción
sqlstringUn único SELECT, en el dialecto de tu schema, con placeholders %(nombre)s.
paramsobjetoValores de los placeholders: string, número, booleano o null. Puede ser {}.
dialectstringpostgres, mysql o firebird.
tableslista de stringsTablas usadas por la consulta.
explanationstring o nullExplicación breve de lo que hace la consulta, en el idioma resuelto.
localestringIdioma usado en la respuesta.
request_idstringreq_ + 32 caracteres hexadecimales. Úsalo para enviar feedback y buscar la respuesta en el historial.

El mismo request_id viene en el header X-Request-ID de toda respuesta, incluidas las de error.

Sobre el SQL devuelto​

  • Los nombres de tablas y columnas son los de tu base de datos, exactamente como están en el DDL registrado.
  • El texto del usuario nunca se concatena al SQL: valores como nombres, fechas y términos de búsqueda llegan en params.
  • Todo % que no es placeholder sale escapado como %% (por ejemplo LIKE 'A%%'), al estilo de los drivers de Python. Por eso pasa siempre params al driver, incluso vacío. Consulta Ejecutar el SQL.
  • Las fechas relativas ("ayer", "el mes pasado") se resuelven en el momento de la pregunta, con la fecha de hoy enviada al LLM.

Errores comunes​

HTTPcodeQué hacer
400end_user_requiredEnvía end_user.
401invalid_api_keyCorrige la clave.
409schema_not_configured, llm_not_configuredEl administrador debe terminar la configuración en el panel.
422no_answerEl schema no permite responder; pide al usuario que reformule.
422sql_rejectedEl SQL generado no pasó el Guard, incluso tras la corrección automática.
429rate_limitedEspera el tiempo del header Retry-After.
502llm_errorFallo en el proveedor de LLM; consulta details.reason.

La lista completa está en Errores.

Latencia​

Una pregunta suele tardar unos segundos, y hasta el doble cuando se ejecuta la corrección automática. Configura el timeout de lectura de tu cliente HTTP en al menos 60 segundos y no repitas automáticamente un POST /v1/ask que dio timeout, porque cada intento gasta tokens de tu LLM.

Ejemplo​

curl -sS -X POST "https://app.datafala.com.br/v1/ask" \
-H "Authorization: Bearer $DATAFALA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"question": "Top 5 clientes por facturación en 2026", "end_user": "'"$END_USER"'", "max_rows": 5}'

Más ejemplos en Ejemplos de integración.