Verify
POST /api/v1/verify
Section titled “POST /api/v1/verify”POST Verificar un parámetro técnico
Recibe un elemento constructivo con su parámetro y su valor, busca en la normativa vigente que aplica al municipio y devuelve un resultado estructurado: si cumple, el valor límite encontrado, las condiciones y las fuentes.
La evaluación la hace un modelo de lenguaje a partir de los fragmentos normativos recuperados. No es un cálculo determinista: trata el resultado como una primera comprobación con sus fuentes, no como una certificación.
Requisito: el municipio de tu proyecto activo
Section titled “Requisito: el municipio de tu proyecto activo”verify solo verifica en el municipio de tu proyecto activo en normatia.com:
- Si no tienes proyecto activo, responde
400 no_active_project. - Si el proyecto activo no tiene municipio, responde
400 no_project_location. - Si el
geo_idde la petición no es el del proyecto activo, responde422 geo_id_mismatch.
El proyecto activo se cambia en la web. Para saber cuál es y su geo_id, usa GET /api/v1/projects: es el que tiene is_active: true.
Cabeceras
Section titled “Cabeceras”| Cabecera | Requerida | Descripción |
|---|---|---|
Authorization | Sí | Bearer sk-normatia-... |
Content-Type | Sí | application/json |
Cuerpo de la petición
Section titled “Cuerpo de la petición”| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
element | string | Sí | Elemento constructivo o instalación (texto libre, de 1 a 500 caracteres) |
parameter | string | Sí | Parámetro o requisito que se comprueba (texto libre, de 1 a 200 caracteres) |
value | number | Sí | Valor del proyecto. Debe ser mayor o igual que 0 |
unit | string | Sí | Unidad del valor (por ejemplo, W/m²K, m, dB), de 1 a 50 caracteres |
geo_id | string | Sí | geo_id del municipio del proyecto activo (por ejemplo, ES-41091) |
codes | array | null | No | Normativas en las que buscar. Si se omite, se usan todas las que aplican al municipio |
codes[].slug | string | Sí (en cada elemento) | Identificador de la normativa |
codes[].version | string | null | No | Se acepta, pero hoy no se tiene en cuenta: la búsqueda se hace siempre sobre las versiones vigentes |
context | string | null | No | Se acepta, pero hoy no interviene en la evaluación |
Los campos que no están en esta tabla se ignoran sin error.
Ejemplos de petición
Section titled “Ejemplos de petición”Transmitancia térmica de una fachada, acotada al CTE DB-HE:
POST /api/v1/verifyAuthorization: Bearer sk-normatia-...Content-Type: application/json{ "element": "Fachada de ladrillo cara vista", "parameter": "transmitancia térmica", "value": 0.35, "unit": "W/m²K", "geo_id": "ES-41091", "codes": [ { "slug": "cte-db-he" } ]}Sin acotar normativas, con todas las que aplican al municipio:
{ "element": "Cubierta plana no transitable", "parameter": "transmitancia térmica", "value": 0.30, "unit": "W/m²K", "geo_id": "ES-41091"}Respuesta 200
Section titled “Respuesta 200”Ejemplo con valores ilustrativos:
{ "is_compliant": true, "result_status": "compliant", "element": "Fachada de ladrillo cara vista", "parameter": "transmitancia térmica", "provided_value": 0.35, "limit_value": 0.56, "unit": "W/m²K", "conditions": [], "sources": [ { "index": 1, "code_slug": "cte-db-he", "version": "2022", "document_title": "CTE DB-HE (modificación del RD 450/2022)", "section_title": "Tabla 3.1.1.a-HE1 Valores límite de transmitancia térmica", "url": "https://normatia.com/es/normativa/cte-db-he/2022" } ], "warnings": [], "geo_context": { "geo_id": "ES-41091", "name": "Sevilla", "climate_zone": "B4" }}Campos de respuesta
Section titled “Campos de respuesta”| Campo | Tipo | Descripción |
|---|---|---|
is_compliant | boolean | true si el valor cumple |
result_status | string | Resultado (ver la tabla siguiente) |
element | string | El element de la petición |
parameter | string | El parameter de la petición |
provided_value | number | El value de la petición |
limit_value | number | null | Límite normativo encontrado. null si no es cuantificable o no se encontró |
unit | string | La unit de la petición |
conditions | string[] | Condiciones adicionales que aplican aunque el resultado sea favorable |
sources | object[] | Fuentes normativas en las que se basa el resultado |
sources[].index | integer | Número de la fuente, desde 1 |
sources[].code_slug | string | Identificador de la normativa |
sources[].version | string | null | Versión del documento usado |
sources[].document_title | string | null | Título del documento |
sources[].section_title | string | null | Sección, artículo o tabla |
sources[].url | string | null | Enlace a la fuente en normatia.com |
warnings | string[] | Avisos sobre limitaciones del resultado |
geo_context | object | Municipio usado: geo_id, name y climate_zone (puede ser null) |
La respuesta no incluye el texto de las fuentes: para leerlo, sigue sources[].url.
Valores de result_status
Section titled “Valores de result_status”| Valor | Significado |
|---|---|
compliant | Cumple el límite normativo |
conditional | Cumple, pero hay condiciones adicionales que también deben cumplirse (están en conditions) |
non_compliant | No cumple el límite normativo |
undetermined | No se encontró un límite aplicable en las fuentes recuperadas |
Si el modelo de lenguaje no responde o no da una respuesta válida, la respuesta es 502 llm_unavailable y no se gasta crédito: se puede reintentar. Un undetermined es siempre una respuesta del modelo, que no encontró el límite.
Errores
Section titled “Errores”| Estado | detail.error | Cuándo |
|---|---|---|
| 400 | no_active_project | El usuario no tiene proyecto activo |
| 400 | no_project_location | El proyecto activo no tiene municipio |
| 403 | insufficient_scope | La clave no tiene el permiso ask |
| 403 | not_available_in_sandbox | Es una clave de prueba: verify no está en el entorno de pruebas |
| 404 | location_not_found | El geo_id no existe |
| 422 | geo_id_mismatch | El geo_id no es el del proyecto activo |
| 422 | no_applicable_codes | Ninguna normativa (o ninguna de las de codes) aplica al municipio |
| 422 | Error de validación del cuerpo (detail es una lista) | |
| 429 | rate_limit_exceeded | Límite por minuto del grupo de inteligencia |
| 429 | quota_exceeded | Créditos agotados |
| 502 | llm_unavailable | El modelo de lenguaje no respondió o no dio una respuesta válida. No gasta crédito: reintenta |
Más los errores de autenticación comunes (401, 403), descritos en Autenticación.