Validaciones por endpoint
La API implementa validación exhaustiva en todos los endpoints de escritura. Los datos se validan antes de procesarse. Si hay errores, la petición se rechaza con 400 Bad Request y un mensaje detallado.
Principio general
Validar todo, escribir nada
En operaciones bulk (PA, cuestionarios), se validan TODOS los ítems antes de escribir cualquiera. Si un solo ítem tiene error, no se modifica nada y se devuelve el listado de errores (hasta los 10 primeros).
Publicidad activa
| Validación |
Límite |
Error si falla |
obligacionId existe en la declaración |
Verificado contra el árbol PA real |
404 "obligación X no existe en esta declaración" |
opcionPublicacion en rango |
0-3 |
400 "opcionPublicacion debe ser 0-3" |
| Cada enlace tiene URL |
No vacía |
400 "Cada enlace debe tener una URL" |
| URL bien formada |
Empieza por http:// o https:// |
400 con detalle |
| Longitud URL |
Max 2.048 caracteres |
400 "URL demasiado larga" |
| Orden de enlace |
0-99 |
400 "Orden debe ser 0-99" |
| Cantidad de enlaces |
Max 10 por obligación |
400 "Máximo 10 enlaces" |
| Aclaraciones |
Max 5.000 caracteres |
400 "no puede superar 5000 caracteres" |
| Autoevaluación valor |
0-100 |
400 "debe ser 0-100" |
| Autoevaluación ID |
> 0 |
400 "ID inválido" |
| Autoevaluación cantidad |
Max 10 criterios |
400 "Máximo 10 criterios" |
| Bulk: ítems |
1-500 |
400 si vacío o excede |
| Bulk: validación previa |
Se validan TODOS antes de escribir |
Si 1 falla, no se escribe ninguno |
Cuestionarios
| Validación |
Límite |
Error si falla |
id de pregunta pertenece al cuestionario |
Verificado contra la estructura real |
400 "no pertenece al cuestionario X" |
Cada componente tiene campo id |
Obligatorio |
400 "componente sin campo id" |
| Tipo checkbox |
Valor debe ser boolean |
400 "checkbox espera boolean" |
| Tipo entero |
Valor debe ser integer |
400 "entero espera integer" |
| Tipo decimal |
Valor debe ser número |
400 "decimal espera número" |
| Tipo texto/memo |
Valor debe ser string, max 10.000 chars |
400 con detalle |
| Tipo fecha |
Valor debe ser string ISO parseable |
400 "fecha inválida" |
| Tipo selector |
Valor debe ser integer |
400 "selector espera integer" |
| Grupos |
Max 100 |
400 "Máximo 100 grupos" |
| Preguntas totales |
Max 500 |
400 "Máximo 500 preguntas" |
| Respuesta no vacía |
Al menos 1 componente |
400 "respuesta no puede estar vacía" |
Derecho de acceso
| Validación |
Límite |
Error si falla |
| ID de ítem |
> 0 |
400 "ID inválido" |
| Valor no negativo |
>= 0 |
400 "no puede ser negativo" |
| Valor no absurdo |
<= 999.999 |
400 "excede el máximo razonable" |
| Cantidad de ítems |
Max 2.000 |
400 "Máximo 2000 ítems" |
| Ítems de otra remisión |
Se ignoran silenciosamente |
Sin efecto |
| URL formulario |
Obligatoria si existeFormulario=true |
400 "URL es obligatoria" |
| URL formulario formato |
http:// o https://, max 750 chars |
400 con detalle |
| Plazo medio |
0-9.999 días |
400 "debe ser entre 0 y 9999" |
| Aclaraciones |
Max 5.000 caracteres |
400 "no puede superar 5000" |
Incidencias
| Validación |
Límite |
Error si falla |
| Título |
Obligatorio, max 500 chars |
400 con detalle |
| Descripción |
Obligatoria, max 10.000 chars |
400 con detalle |
| Tipo |
0-3 (Otros, Técnico, Funcional, Datos) |
400 "debe ser 0-3" |
declaracionId |
Si proporcionado, verifica pertenencia a la entidad |
400 "no pertenece a esta entidad" |
usuarioId |
Si proporcionado, verifica pertenencia a la entidad |
400 "no pertenece a esta entidad" |
| Comentario |
Obligatorio, max 10.000 chars |
400 con detalle |
| Sanitización HTML |
Tags HTML eliminados de título, descripción y comentarios |
Prevención XSS almacenado |
Webhooks
| Validación |
Límite |
Error si falla |
| URL |
Obligatoria, HTTPS, max 2.000 chars |
400 con detalle |
| URL no privada |
No localhost, 10.x, 172.16-31.x, 192.168.x |
400 "URL no permitida" |
| Eventos |
Al menos 1, solo eventos válidos |
400 "Eventos no válidos: ..." |
| Secreto |
Max 512 chars |
400 "Secreto demasiado largo" |
| Cantidad |
Max 5 webhooks por entidad |
400 "Máximo 5 webhooks" |
Autenticación
| Validación |
Error si falla |
| API Key ausente o vacía |
400 "Campo apiKey vacío o ausente" |
| API Key inválida |
401 "API Key inválida" |
| Entidad desactivada |
401 "Entidad desactivada" |
| Token JWT ausente |
401 "Token requerido" |
| Token JWT expirado |
401 "Token expirado" |
| Token JWT inválido (firma incorrecta) |
401 "Token inválido" |