Skip to content

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.

Requiere API key en el header Authorization:

Authorization: Bearer sk-normatia-...

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 usuario

Si 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.

CampoTipoRequeridoDescripción
querystringSíPregunta en lenguaje natural (de 1 a 2000 caracteres)
project_iduuidNoProyecto sobre el que consultar. Si se omite, el proyecto activo del usuario
{
"query": "¿Cuál es el límite de transmitancia para ventanas en mi proyecto?",
"project_id": "3f8c1a90-5b2e-4d77-9d21-0e5f4a6c8b13"
}
CampoTipoDescripción
answerstringRespuesta generada, con marcadores de cita [N]
sourcesarrayFuentes citadas en la respuesta. El index es el N de cada marcador
projectobjectProyecto contra el que se resolvió la consulta
iterationsintegerRondas de razonamiento que consumió el turno
searchesintegerBúsquedas normativas ejecutadas
CampoDescripción
indexNúmero de la fuente: el N de las citas [N]
citation_typearticle, document, collection o user_document
document_titleTítulo del documento normativo
section_titleTítulo de la sección
block_titleTítulo del bloque o artículo concreto
urlEnlace directo a la sección en Normatia
url_validfalse si el enlace no pudo resolverse
block_idUUID del bloque recuperado

citation_type: "user_document" identifica un documento privado subido al proyecto: no lleva URL pública.

CampoDescripción
project_idIdentificador del proyecto resuelto
geo_idIdentificador geográfico del proyecto
locationMunicipio o territorio del proyecto
{
"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
}

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:

PresupuestoValor
Rondas de razonamiento6
Búsquedas normativas6
Timeout del turno120 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.

Los errores llegan dentro de detail, con el código en detail.error (ver Autenticación).

Estadodetail.errorCuándo
400no_active_projectNo se pasó project_id y el usuario no tiene proyecto activo
403insufficient_scopeLa clave no tiene el permiso ask
403not_available_in_sandboxEs una clave de prueba: las consultas no están en el entorno de pruebas
404project_not_foundEl proyecto no existe o el usuario no tiene acceso
422query vacía o de más de 2000 caracteres, project_id que no es un UUID o campos desconocidos en el cuerpo (detail es una lista)
429quota_exceededCréditos del plan agotados
429rate_limit_exceededDemasiadas 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, y 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 de inteligencia. Consulta los límites en Autenticación.

POST /api/v1/ask era el motor 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 que ya lo usan, no recibe cambios y no aparece en el esquema público. No tiene fecha de retirada; si llega a tenerla, se anunciará en Cambios. Su cuerpo solo admite query: los campos geo_id, codes y messages que aceptaba antes 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. La respuesta ya no trae tokens_used, y trae iterations y searches. Los objetos de sources[] mantienen index, citation_type, document_title, section_title, block_title, block_id y url; pierden code_slug, version y similarity_score, y ganan url_valid.