Ask — Consulta agéntica
POST /api/v2/ask
Responde preguntas en lenguaje natural sobre normativa de construcción española en el contexto de un proyecto de Normatia.
No es un RAG de un solo disparo: ejecuta el mismo bucle agéntico que el chat de normatia.com. El modelo encadena varias búsquedas con enfoques distintos, lee la memoria y los cálculos guardados del proyecto, consulta los documentos subidos y redacta la respuesta citando cada fuente con marcadores [N] validados contra los bloques realmente recuperados.
Autenticación
Section titled “Autenticación”Requiere API key en el header Authorization:
Authorization: Bearer sk-normatia-...El proyecto define el alcance
Section titled “El proyecto define el alcance”La consulta se resuelve siempre sobre un proyecto, que ya tiene configurados el municipio, las normativas aplicables y los documentos. No hay que pasar geo_id ni filtros de normativa: el alcance sale del proyecto.
project_id explícito → proyecto activo del usuarioSi se omite project_id se usa el proyecto activo. Para consultar otro, obtén su identificador en GET /api/v1/projects y pásalo aquí — no hace falta cambiar el proyecto activo, y dos llamadas en paralelo a proyectos distintos no se pisan.
Request
Section titled “Request”| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
query | string | ✅ | Pregunta en lenguaje natural (1–2000 caracteres) |
project_id | uuid | — | Proyecto sobre el que consultar. Si se omite, el proyecto activo del usuario |
Ejemplo
Section titled “Ejemplo”{ "query": "¿Cuál es el límite de transmitancia para ventanas en mi proyecto?", "project_id": "3f8c1a90-5b2e-4d77-9d21-0e5f4a6c8b13"}Response
Section titled “Response”| Campo | Tipo | Descripción |
|---|---|---|
answer | string | Respuesta generada, con marcadores de cita [N] |
sources | array | Fuentes citadas en la respuesta. El index es el N de cada marcador |
project | object | Proyecto contra el que se resolvió la consulta |
iterations | integer | Rondas de razonamiento que consumió el turno |
searches | integer | Búsquedas normativas ejecutadas |
Fuentes (sources[])
Section titled “Fuentes (sources[])”| Campo | Descripción |
|---|---|
index | Número de la fuente — el N de las citas [N] |
citation_type | article, document, collection o user_document |
document_title | Título del documento normativo |
section_title | Título de la sección |
block_title | Título del bloque o artículo concreto |
url | Enlace directo a la sección en Normatia |
url_valid | false si el enlace no pudo resolverse |
block_id | UUID del bloque recuperado |
citation_type: "user_document" identifica un documento privado subido al proyecto: no lleva URL pública.
Proyecto (project)
Section titled “Proyecto (project)”| Campo | Descripción |
|---|---|
project_id | Identificador del proyecto resuelto |
geo_id | Identificador geográfico del proyecto |
location | Municipio o territorio del proyecto |
Ejemplo de respuesta
Section titled “Ejemplo de respuesta”{ "answer": "Para tu proyecto en Madrid (zona climática D3), el CTE DB-HE 1 establece un límite de transmitancia de 1,4 W/m²K para huecos [1]. Ese valor es el aplicable a la orientación norte sin corrección adicional [2].", "sources": [ { "index": 1, "citation_type": "article", "document_title": "CTE DB-HE Ahorro de Energía", "section_title": "3.1.1 Transmitancia térmica", "block_title": "Tabla 3.1.1.b-HE1", "url": "https://normatia.com/es/normativa/cte-db-he/...", "url_valid": true, "block_id": "6b1f8c22-...-a41d" } ], "project": { "project_id": "3f8c1a90-5b2e-4d77-9d21-0e5f4a6c8b13", "geo_id": "ES-28079", "location": "Madrid" }, "iterations": 3, "searches": 2}Latencia y presupuestos
Section titled “Latencia y presupuestos”Un turno agéntico encadena varias llamadas al modelo, así que la respuesta tarda bastante más que una búsqueda simple. El servidor acota el turno para que no se dispare:
| Presupuesto | Valor |
|---|---|
| Rondas de razonamiento | 6 |
| Búsquedas normativas | 6 |
| Timeout del turno | 120 s |
Configura el timeout de tu cliente HTTP en 150 segundos o más. Si cortas antes, el turno sigue ejecutándose en el servidor, consume su crédito y nadie recibe la respuesta.
Errores
Section titled “Errores”| Status | Código | Condición |
|---|---|---|
| 400 | no_active_project | No se pasó project_id y el usuario no tiene proyecto activo |
| 404 | project_not_found | El proyecto no existe o el usuario no tiene acceso |
| 422 | — | query vacía o superior a 2000 caracteres, o campos desconocidos en el body |
| 429 | quota_exceeded | Créditos del plan agotados |
| 429 | rate_limit_exceeded | Demasiadas peticiones por minuto |
Si el proyecto no tiene ninguna normativa ni documento seleccionado, la respuesta llega con 200 y un answer que lo explica, sources vacío y iterations: 0 — no se consume crédito.
Cada llamada consume 1 crédito, independientemente de cuántas búsquedas encadene el agente internamente. El endpoint pertenece al grupo intelligence de rate limiting. Consulta los límites en Autenticación.
Legacy: /api/v1/ask
Section titled “Legacy: /api/v1/ask”POST /api/v1/ask era el pipeline RAG anterior: una única búsqueda semántica sobre el proyecto activo, sin herramientas, sin memoria de proyecto y sin cálculos.
Está congelado. Se mantiene para no romper las integraciones B2B que ya lo usan, ya no aparece en el esquema OpenAPI público y se retirará en una versión futura. Su body solo admite query — los campos geo_id, codes y messages que aceptaba antiguamente se eliminaron y ahora devuelven 422.
Migrar es directo: cambia la ruta a /api/v2/ask y sustituye la lectura de geo_context por project. Los objetos de sources[] mantienen index, document_title, section_title y url; pierden code_slug, version y similarity_score, y ganan citation_type, block_title, block_id y url_valid.