{"openapi":"3.0.0","paths":{"/api/v1/health":{"get":{"operationId":"HealthController_health","parameters":[],"responses":{"200":{"description":"El proceso responde (no mira dependencias)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"tags":["sistema"],"x-auth":"none","x-visibility":"public"}},"/api/v1/ready":{"get":{"operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":"Base de datos y Valkey comprobados ahora mismo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadyDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"503":{"description":"La base no responde, o Valkey está configurado y no responde","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unavailable","message":"No disponible ahora mismo","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"tags":["sistema"],"x-auth":"none","x-visibility":"public"}},"/api/v1/exercises":{"get":{"description":"Con su fase y las operaciones del censo que permite.","operationId":"ExercisesController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExerciseDto"}}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["exercise:read"]}],"summary":"Ejercicios, del más reciente al más antiguo","tags":["exercises"],"x-auth":"required","x-scope":"exercise:read","x-visibility":"public"}},"/api/v1/exercises/current":{"get":{"operationId":"ExercisesController_current","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExerciseDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["exercise:read"]}],"summary":"Ejercicio en curso","tags":["exercises"],"x-auth":"required","x-scope":"exercise:read","x-visibility":"public"}},"/api/v1/entities/me":{"get":{"operationId":"EntitiesController_me","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["entity:read"]}],"summary":"La entidad activa de la sesión (Mi Falla)","tags":["entities"],"x-auth":"required","x-scope":"entity:read","x-visibility":"public"}},"/api/v1/entities/{id}":{"get":{"description":"`editableFields` dice qué puede cambiar esta cuenta.","operationId":"EntitiesController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["entity:read"]}],"summary":"Ficha de una entidad","tags":["entities"],"x-auth":"required","x-scope":"entity:read","x-visibility":"public"}},"/api/v1/profiles/{id}":{"get":{"description":"Ficha + entrada del ejercicio + recompensas + historial de la persona en lectura (puede no ser completo). Una ficha de otra comisión es 404.","operationId":"ProfilesController_view","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio de la entrada; por defecto, el en curso","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campoDesconocido":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["profile:read"]}],"summary":"Ficha de una persona en la entidad","tags":["profiles"],"x-auth":"required","x-scope":"profile:read","x-visibility":"public"}},"/api/v1/entities/{id}/census":{"get":{"description":"Filtros de hoy (mayores, infantiles, todos activos, solo bajas, todos), búsqueda por nombre o nº de censo y paginación por cursor, ordenado por nº de censo. Con `fields` (spec 22) cada fila trae además esas columnas (nacimiento, edad, documento enmascarado, contacto, antigüedad, recompensas…); `availableFields` dice cuáles puede pedir esta sesión: una junta local no ve documento ni contacto de las fallas que cubre.","operationId":"CensusController_list","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio («2026-27»); por defecto, el en curso","schema":{"type":"string"}},{"name":"filter","required":false,"in":"query","description":"adults = mayores activos · children = infantiles activos · all = todos activos · left = solo bajas · everyone = todos","schema":{"default":"all","type":"string","enum":["adults","children","all","left","everyone"]}},{"name":"q","required":false,"in":"query","description":"Nombre o apellidos (todas las palabras), o nº de censo en falla","schema":{"type":"string"}},{"name":"fields","required":false,"in":"query","description":"Columnas extra, separadas por coma, de la lista cerrada (spec 22): entity, censusNumber, familyName, givenName, category, office, joinedAt, leftAt, leaveReason, birthDate, age, sex, idKind, nationalId, jcfCensusNumber, phone1, phone2, email, address, city, postalCode, reference, yearsAsMember, yearsAsOfficer, awards, topAward, profileUpdatedAt. Solo las que vengan en `availableFields` (la API decide por permisos); sin `fields`, las 8 de siempre. Desconocida → 422 `fields: unknown`; no permitida → 422 `fields: not_available`","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CensusPageDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["census:read"]}],"summary":"Censo de la entidad en un ejercicio","tags":["census"],"x-auth":"required","x-scope":"census:read","x-visibility":"public"}},"/api/v1/entities/{id}/offices":{"get":{"description":"Todos los cargos menos vocal, en orden de rango, con sus ocupantes activos (vacío = sin cubrir).","operationId":"CensusController_offices","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio de la entrada; por defecto, el en curso","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficesDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campoDesconocido":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["census:read"]}],"summary":"Cargo → ocupante actual","tags":["census"],"x-auth":"required","x-scope":"census:read","x-visibility":"public"}},"/api/v1/procedure-types":{"get":{"description":"Por delegación (en el orden de hoy), con tipo, plazo, audiencia y los botones de la sesión. Búsqueda sin tildes en castellano y valenciano.","operationId":"PublicCatalogController_list","parameters":[{"name":"delegation","required":false,"in":"query","schema":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]}},{"name":"kind","required":false,"in":"query","deprecated":true,"description":"Mejor `channel`","schema":{"type":"string","enum":["online","pdf","document"]}},{"name":"channel","required":false,"in":"query","schema":{"type":"string","enum":["online","upload_signed","in_person","by_email","via_contact","external"]}},{"name":"q","required":false,"in":"query","description":"Busca en el título y la descripción (castellano y valenciano, sin tildes)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcedureTypeListDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"delegation":["isIn"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Catálogo de trámites (impresos e inscripciones)","tags":["public"],"x-auth":"optional","x-auth-note":"Sin sesión: el catálogo entero (menos lo `staff` y lo `hidden`) con su audiencia escrita; `allowed: false` + `reason: anonymous` donde hace falta cuenta. Con sesión (o clave/token de la entidad): `allowed` y `reason` (`not_for_entity`, `closed`) para ESA entidad y el botón `do_online` si puede presentarlo.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/procedure-types/{slug}":{"get":{"description":"Qué es, para quién (audiencia escrita), plazo, documentación, cómo se presenta, normativa, delegación y, si es en línea, el formulario que se presenta hoy.","operationId":"PublicCatalogController_sheet","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcedureTypeSheetDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Ficha de sede de un trámite","tags":["public"],"x-auth":"optional","x-auth-note":"Sin sesión: el catálogo entero (menos lo `staff` y lo `hidden`) con su audiencia escrita; `allowed: false` + `reason: anonymous` donde hace falta cuenta. Con sesión (o clave/token de la entidad): `allowed` y `reason` (`not_for_entity`, `closed`) para ESA entidad y el botón `do_online` si puede presentarlo.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/procedures/anonymous":{"post":{"description":"Como hoy la solicitud de asistencia de FFMM (formulario público con captcha): solo trámites de audiencia `public`, `online` con formulario que declara su presentador (`form.presenter`) y sin campos del censo; en plazo. Exige el ticket de Turnstile (`POST /public-submission/ticket`; sin Turnstile en el servidor, 401) y cuota por IP. Se valida entero y se presenta: número del registro de entrada, justificante y acuse al correo del formulario. Con sesión, 409 `use_session` (se presenta desde la Zona Privada). 409 `not_public` / `not_online` / `closed` / `needs_session`.","operationId":"ProceduresController_anonymous","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousProcedureDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousProcedureSubmittedDto"}}}},"401":{"description":"`unauthorized`: el contenido es de nivel `members` y no hay sesión","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"409":{"description":"`conflict` / `census_closed` / `person_exists`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"conflict","message":"La operación choca con el estado actual","details":{"reason":"<motivo>"},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"type":["isString"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones (`details.retryAfterSeconds`, cabecera Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{},{"sv_session":[]},{"apiKey":[]}],"summary":"Presentar SIN sesión un trámite público","tags":["procedures"],"x-auth":"optional","x-auth-note":"Es SOLO para quien no tiene sesión: con sesión, 409 `use_session` (se presenta desde la Zona Privada, con la entidad).","x-visibility":"public"}},"/api/v1/registry":{"post":{"description":"Los mismos campos de hoy. Los adjuntos (hasta 10, PDF o JPG) se suben antes con `POST /files` (purpose `registry`) o, sin sesión, con `POST /public-submission/files`. Validación con TODA la lista de errores en `details` (422). Número `AAAA/NNNNNN` correlativo por año; justificante PDF (si el servidor tiene Chromium; si no, `receiptStatus: not_configured` y el número vale igual) y acuse por correo con el PDF al correo de la sesión o, sin sesión, al indicado. Sin sesión: cuota por IP (429).","operationId":"RegistryController_submit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRegistryDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCreatedDto"}}}},"401":{"description":"`unauthorized`: el contenido es de nivel `members` y no hay sesión","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"subject":["isString"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones (`details.retryAfterSeconds`, cabecera Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{},{"sv_session":[]},{"apiKey":[]}],"summary":"Presentar en el registro de entrada (solicitud genérica)","tags":["registry"],"x-auth":"optional","x-auth-note":"Con sesión de entidad (`registry:submit`), presenta la entidad: «en representación de» y el correo son los de la sesión. SIN sesión (como hoy, con captcha) presenta cualquiera con un ticket de Turnstile (`publicTicket`); si el servidor no tiene Turnstile, 401.","x-visibility":"public"}},"/api/v1/files/{id}":{"get":{"description":"Comprueba el nivel y el permiso en cada descarga; nunca una URL pública.","operationId":"FilesController_download","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Los bytes","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: el contenido es de nivel `members` y no hay sesión","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{},{"sv_session":[]},{"apiKey":[]}],"summary":"Descargar un fichero","tags":["files"],"x-auth":"optional","x-auth-note":"El fichero de un documento o de una comunicación se sirve por la audiencia del contenido VIVO que lo liga (publicado o enviada, no borrado): público sin sesión; de cuentas o con reglas, 401 sin sesión y 404 si no es para esa entidad; despublicado, borrador o borrado, solo la Junta (404). Los privados (registro, mensajes, expedientes) solo quien los subió, su entidad o la Junta.","x-visibility":"public"}},"/api/v1/menu":{"get":{"description":"Árbol de páginas del menú principal (orden de hoy) y, con sesión, la Zona Privada.","operationId":"PublicContentController_menu","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Menú principal","tags":["public"],"x-auth":"optional","x-auth-note":"El menú es navegación: solo lleva las páginas que la audiencia deja ver a la sesión; con sesión de entidad, el bloque «Zona Privada»; con la Junta, el enlace a Gestión JCF.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/pages":{"get":{"description":"Las publicadas, por madre (`parent=ayuda`: el centro de ayuda) y/o texto. Una página `members` sin sesión llega cerrada y solo casa por el título.","operationId":"PublicContentController_pages","parameters":[{"name":"parent","required":false,"in":"query","description":"Solo las hijas de esta página (p. ej. `ayuda`: el centro de ayuda)","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Busca en título y cuerpo, en castellano y valenciano (sin distinguir mayúsculas)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageListDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campoDesconocido":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Páginas de contenido (lista y búsqueda)","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, lo `public` entero y lo demás cerrado (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, lo que la audiencia deja a SU entidad entero y lo demás con `reason: not_for_entity`. Lo `staff` nunca sale por aquí (solo por /gestion); lo `hidden` no se lista. Cada entrada trae `allowed`, `reason` y sus `actions`.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/pages/{slug}":{"get":{"description":"Markdown en castellano y valenciano. Una página que la sesión no puede ver llega con `locked: true`, su motivo y sin cuerpo.","operationId":"PublicContentController_page","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Página de contenido","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, lo `public` entero y lo demás cerrado (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, lo que la audiencia deja a SU entidad entero y lo demás con `reason: not_for_entity`. Lo `staff` nunca sale por aquí (solo por /gestion); lo `hidden` no se lista. Cada entrada trae `allowed`, `reason` y sus `actions`.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/documents":{"get":{"description":"Impresos, documentación y normativa, por sección, delegación o subpágina; búsqueda por título; paginación por cursor.","operationId":"PublicContentController_documents","parameters":[{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["impresos_jcf","agrupaciones","juntas_locales","ayuntamiento","jornadas","privacidad","rgcre","petardos","normativa","otros"]}},{"name":"delegation","required":false,"in":"query","schema":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]}},{"name":"page","required":false,"in":"query","description":"Solo los de esta subpágina","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Busca en el título (castellano y valenciano)","schema":{"type":"string"}},{"name":"kind","required":false,"in":"query","description":"Formato (PDF, PDF rellenable, Excel…)","schema":{"type":"string","enum":["pdf","pdf_r","excel","word","zip","otro"]}},{"name":"section","required":false,"in":"query","description":"Sección dentro de la subpágina (el rótulo en castellano, p. ej. `Censos`)","schema":{"type":"string"}},{"name":"downloadable","required":false,"in":"query","description":"Solo los que quien mira puede descargar ya (hay fichero y su nivel está abierto)","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentPageDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Biblioteca de documentos","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, lo `public` entero y lo demás cerrado (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, lo que la audiencia deja a SU entidad entero y lo demás con `reason: not_for_entity`. Lo `staff` nunca sale por aquí (solo por /gestion); lo `hidden` no se lista. Cada entrada trae `allowed`, `reason` y sus `actions`.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/documents/facets":{"get":{"description":"Los valores de cada filtro (categoría, delegación, formato, sección) con cuántos casan contando los demás filtros, el total y cuántos se pueden descargar ya. Mismos filtros que `GET /documents`.","operationId":"PublicContentController_documentFacets","parameters":[{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["impresos_jcf","agrupaciones","juntas_locales","ayuntamiento","jornadas","privacidad","rgcre","petardos","normativa","otros"]}},{"name":"delegation","required":false,"in":"query","schema":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]}},{"name":"page","required":false,"in":"query","description":"Solo los de esta subpágina","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Busca en el título (castellano y valenciano)","schema":{"type":"string"}},{"name":"kind","required":false,"in":"query","description":"Formato (PDF, PDF rellenable, Excel…)","schema":{"type":"string","enum":["pdf","pdf_r","excel","word","zip","otro"]}},{"name":"section","required":false,"in":"query","description":"Sección dentro de la subpágina (el rótulo en castellano, p. ej. `Censos`)","schema":{"type":"string"}},{"name":"downloadable","required":false,"in":"query","description":"Solo los que quien mira puede descargar ya (hay fichero y su nivel está abierto)","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFacetsDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Facetas de la biblioteca","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, lo `public` entero y lo demás cerrado (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, lo que la audiencia deja a SU entidad entero y lo demás con `reason: not_for_entity`. Lo `staff` nunca sale por aquí (solo por /gestion); lo `hidden` no se lista. Cada entrada trae `allowed`, `reason` y sus `actions`.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/documents/{id}":{"get":{"description":"Un documento que la sesión no puede abrir NO da 404: llega cerrado (`locked`) con su audiencia y su motivo.","operationId":"PublicContentController_document","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Un documento","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, lo `public` entero y lo demás cerrado (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, lo que la audiencia deja a SU entidad entero y lo demás con `reason: not_for_entity`. Lo `staff` nunca sale por aquí (solo por /gestion); lo `hidden` no se lista. Cada entrada trae `allowed`, `reason` y sus `actions`.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/documents/{id}/file":{"get":{"description":"Comprueba la audiencia en cada descarga; nunca una URL pública.","operationId":"PublicContentController_documentFile","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Los bytes","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: el contenido es de nivel `members` y no hay sesión","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Descargar un documento","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia no pública sin sesión → 401; con sesión y no es para su entidad → 403; si no, los bytes.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/events":{"get":{"description":"Actos de la Junta y de FFMM entre `from` y `to` (por defecto, de hoy a un año).","operationId":"PublicContentController_events","parameters":[{"name":"from","required":false,"in":"query","description":"Desde (ISO); por defecto, hoy","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","description":"Hasta (ISO); por defecto, un año después de `from`","schema":{"type":"string"}},{"name":"kind","required":false,"in":"query","schema":{"type":"string","enum":["junta","ffmm","otro"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"kind":["isIn"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Agenda","tags":["public"],"x-auth":"optional","x-auth-note":"Todo menos lo `staff` y lo `hidden`; lo que la sesión no puede ver sale sin descripción y con su motivo.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/communications":{"get":{"description":"Por categoría y búsqueda en el título; lo más reciente primero; paginación por cursor.","operationId":"CommunicationsController_list","parameters":[{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["actas_asambleas_presidentes","actas_plenos","boletines","carteles_folletos","convocatorias_asambleas_presidentes","convocatorias_plenos","documentacion_asambleas_plenos","hojas_censos","instrucciones_bases","notas_avisos","solicitudes_inscripciones","varios","cursos_cre","otros"]}},{"name":"q","required":false,"in":"query","description":"Busca en el título","schema":{"type":"string"}},{"name":"downloadable","required":false,"in":"query","description":"Solo las que quien mira puede descargar ya (hay fichero y su nivel está abierto)","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunicationPageDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Correos enviados","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, las `public` enteras y las demás cerradas (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, las que su audiencia deja a SU entidad enteras y `read` por cuenta; las demás con `reason: not_for_entity`. Lo `staff` nunca; lo `hidden` no se lista.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/communications/facets":{"get":{"description":"Categorías presentes con cuántas casan contando los demás filtros, el total y cuántas se pueden descargar ya. Mismos filtros que la lista.","operationId":"CommunicationsController_facets","parameters":[{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["actas_asambleas_presidentes","actas_plenos","boletines","carteles_folletos","convocatorias_asambleas_presidentes","convocatorias_plenos","documentacion_asambleas_plenos","hojas_censos","instrucciones_bases","notas_avisos","solicitudes_inscripciones","varios","cursos_cre","otros"]}},{"name":"q","required":false,"in":"query","description":"Busca en el título","schema":{"type":"string"}},{"name":"downloadable","required":false,"in":"query","description":"Solo las que quien mira puede descargar ya (hay fichero y su nivel está abierto)","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunicationFacetsDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Facetas de «Correos enviados»","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, las `public` enteras y las demás cerradas (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, las que su audiencia deja a SU entidad enteras y `read` por cuenta; las demás con `reason: not_for_entity`. Lo `staff` nunca; lo `hidden` no se lista.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/communications/{id}":{"get":{"operationId":"CommunicationsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunicationDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Una comunicación","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia (ADR 0016): sin sesión, las `public` enteras y las demás cerradas (título, frase de audiencia, `reason: anonymous`, `sign_in_to_download`); con sesión, las que su audiencia deja a SU entidad enteras y `read` por cuenta; las demás con `reason: not_for_entity`. Lo `staff` nunca; lo `hidden` no se lista. Abrirla con sesión deja la lectura de la cuenta.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/communications/{id}/file":{"get":{"operationId":"CommunicationsController_file","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Los bytes","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: el contenido es de nivel `members` y no hay sesión","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Descargar el documento de una comunicación","tags":["public"],"x-auth":"optional","x-auth-note":"Audiencia no pública sin sesión → 401; no es para su entidad → 403; si no, los bytes (y la lectura queda apuntada).","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/contact/destinations":{"get":{"description":"Las delegaciones de hoy; `configured` dice si el destino tiene correo propio.","operationId":"ContactController_destinations","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDestinationListDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Destinos de «Contactar»","tags":["public"],"x-auth":"none","x-visibility":"public"}},"/api/v1/contact/destinations/{id}/logo":{"get":{"description":"404 si el destino no tiene logo.","operationId":"ContactController_destinationLogo","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"La imagen","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Logo de un destino de «Contactar»","tags":["public"],"x-auth":"none","x-visibility":"public"}},"/api/v1/contact":{"post":{"description":"Cuota por IP (por defecto 5 por hora → 429). Se guarda siempre; correo a la delegación (o al buzón general) y copia al remitente, con su estado real. La copia solo sale si quien escribe está verificado (sesión o ticket de Turnstile): si no, `copyMail: skipped_unverified`.","operationId":"ContactController_send","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResultDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"delegation":["isString"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones (`details.retryAfterSeconds`, cabecera Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Enviar un mensaje a una delegación","tags":["public"],"x-auth":"optional","x-auth-note":"Con sesión, el mensaje queda ligado a la entidad activa (la delegación lo ve) y no hace falta ticket. SIN sesión y con Turnstile en el servidor, `publicTicket` es obligatorio (422 `required`); sin Turnstile, se acepta pero no se manda la copia al remitente.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/public-submission":{"get":{"description":"ADR 0025: se presenta SIEMPRE. `turnstile` (con su clave de sitio): el ticket del captcha es obligatorio. `quota_only`: sin Turnstile en el servidor, solo la cuota por IP (la mitad) y lo presentado queda marcado `verification: none`; la web lo avisa. Nunca un captcha fingido.","operationId":"PublicSubmissionController_config","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSubmissionConfigDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"¿Cómo se presenta sin sesión?","tags":["public"],"x-auth":"none","x-visibility":"public"}},"/api/v1/public-submission/ticket":{"post":{"description":"Cuota por IP. El ticket vale una hora para UNA presentación (registro de entrada o trámite público) y hasta 10 adjuntos. Con Turnstile (`status: turnstile`): hace falta `turnstileToken` y 422 `turnstileToken: rejected` si Cloudflare no lo da por bueno (o no contesta). Sin Turnstile (`quota_only`): se da sin token, marcado `verification: none`.","operationId":"PublicSubmissionController_ticket","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTicketRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTicketDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"turnstileToken":["isString"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones (`details.retryAfterSeconds`, cabecera Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Obtener un ticket de presentación sin sesión","tags":["public"],"x-auth":"none","x-visibility":"public"}},"/api/v1/public-submission/files":{"post":{"description":"Con el ticket: el fichero queda privado y solo lo reclama la presentación de ese ticket. Tipo por BYTES según el propósito; hasta 10 por ticket; cuota por IP.","operationId":"PublicSubmissionController_upload","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PublicUploadDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"413":{"description":"`payload_too_large`: el fichero pasa del máximo (`details.maxBytes`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"payload_too_large","message":"Fichero demasiado grande","details":{"maxBytes":20971520},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campo":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones (`details.retryAfterSeconds`, cabecera Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Subir un adjunto sin sesión","tags":["public"],"x-auth":"none","x-visibility":"public"}},"/api/v1/org":{"get":{"description":"Nombre oficial, señas, horario, DPD, redes, logo y pie legal. Lo que la Junta aún no ha dado sale `null` (nunca un marcador ni un dato inventado): quien pinta omite la línea.","operationId":"OrgController_get","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Identidad de la Junta","tags":["public"],"x-auth":"optional","x-auth-note":"Igual con o sin sesión: es la identidad de la Junta.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/org/logo":{"get":{"description":"404 si no hay ninguno: entonces se usa el provisional del kit.","operationId":"OrgController_logo","parameters":[],"responses":{"200":{"description":"La imagen","content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Logo subido por la Junta","tags":["public"],"x-auth":"optional","x-auth-note":"El logo es público.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/org/logo-stroke":{"get":{"description":"Un solo color con transparencia, para teñir por CSS (blanco en fondos oscuros). 404 si la Junta no lo ha subido.","operationId":"OrgController_logoStroke","parameters":[],"responses":{"200":{"description":"La imagen","content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Trazo del emblema de la Junta","tags":["public"],"x-auth":"optional","x-auth-note":"El trazo del emblema es público.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/search":{"get":{"description":"Sin tildes ni mayúsculas, en castellano y valenciano a la vez. Primero lo que casa en el título; paginación por cursor (hasta 500 resultados).","operationId":"SearchController_find","parameters":[{"name":"q","required":true,"in":"query","description":"Texto a buscar (sin tildes ni mayúsculas, en castellano y valenciano a la vez)","schema":{"minLength":2,"type":"string"}},{"name":"types","required":false,"in":"query","description":"Tipos (separados por comas); por defecto, todos","schema":{"type":"array","items":{"type":"string","enum":["section","procedure_type","procedure","person","thread","entity","registry_entry","document","page","communication","event"]}}},{"name":"locale","required":false,"in":"query","description":"Idioma de `title` y `snippet` (los dos idiomas van siempre en `titleEs`/`titleVa`)","schema":{"default":"va","type":"string","enum":["es","va"]}},{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"perGroup","required":false,"in":"query","description":"Resultados por grupo en `groups` (la vista agrupada con «ver todos»)","schema":{"minimum":1,"maximum":20,"default":5,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPageDto"}}}},"401":{"description":"`unauthorized`: se mandó `Authorization: Bearer` con una clave o un token que no vale (cabecera `WWW-Authenticate`). Sin cabecera no se pide nada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"summary":"Buscar en la sede","tags":["public"],"x-auth":"optional","x-auth-note":"Sin sesión: todo lo que no es `staff` ni `hidden`, con `allowed: false` + `reason: anonymous` donde hace falta cuenta (sin fragmento del cuerpo). Con sesión o credencial de una entidad: `allowed`/`reason` para ESA entidad.","x-visibility":"public","security":[{},{"sv_session":[]},{"apiKey":[]}]}},"/api/v1/awards/proposal":{"get":{"description":"Cabecera («elaborada el / actualizada el / estado»), plazo, si se puede editar y por qué no, contadores por filtro (Aprobadas JCF / Denegadas JCF / Pendientes revisar / Todas) y las solicitudes del filtro. Sin propuesta todavía: `id: null` y lista vacía.","operationId":"AwardsController_proposal","parameters":[{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio («2026-27»); por defecto, el en curso","schema":{"type":"string"}},{"name":"filter","required":false,"in":"query","description":"Aprobadas JCF / Denegadas JCF / Pendientes revisar / Rechazadas por la falla / Todas","schema":{"default":"all","type":"string","enum":["approved","denied","to_review","rejected","all"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AwardProposalDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"filter":["isIn"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["award:read"]}],"summary":"Propuesta de recompensas del ejercicio","tags":["awards"],"x-auth":"required","x-scope":"award:read","x-visibility":"public"}},"/api/v1/entities/{id}/fallas":{"get":{"description":"Por falla: número, nombre, sector, municipio, censo activo (mayores, infantiles), bajas del ejercicio y cargos clave (presidencia, secretaría, tesorería, delegación de infantiles) con sus ocupantes; y los totales. `:id` que no es junta local ni agrupación → 422 `details.entity = [\"not_a_board\"]`.","operationId":"BoardsController_fallas","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio («2026-27»); por defecto, el en curso","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardFallasDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campoDesconocido":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["entity:read"]}],"summary":"Les meues falles: las fallas de una junta local o agrupación","tags":["boards"],"x-auth":"required","x-scope":"entity:read","x-visibility":"public"}},"/api/v1/entities/{id}/board-census":{"get":{"description":"El censo de todas sus fallas con los filtros de «Mi Censo», o de una sola (`fallaId`, que tiene que ser suya: si no, 422). Ordenado por falla y nº de censo; paginación por cursor.","operationId":"BoardsController_census","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"cursor","required":false,"in":"query","description":"El `nextCursor` de la página anterior","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio («2026-27»); por defecto, el en curso","schema":{"type":"string"}},{"name":"filter","required":false,"in":"query","description":"adults = mayores activos · children = infantiles activos · all = todos activos · left = solo bajas · everyone = todos","schema":{"default":"all","type":"string","enum":["adults","children","all","left","everyone"]}},{"name":"q","required":false,"in":"query","description":"Nombre o apellidos (todas las palabras), o nº de censo en falla","schema":{"type":"string"}},{"name":"fields","required":false,"in":"query","description":"Columnas extra, separadas por coma, de la lista cerrada (spec 22): entity, censusNumber, familyName, givenName, category, office, joinedAt, leftAt, leaveReason, birthDate, age, sex, idKind, nationalId, jcfCensusNumber, phone1, phone2, email, address, city, postalCode, reference, yearsAsMember, yearsAsOfficer, awards, topAward, profileUpdatedAt. Solo las que vengan en `availableFields` (la API decide por permisos); sin `fields`, las 8 de siempre. Desconocida → 422 `fields: unknown`; no permitida → 422 `fields: not_available`","schema":{"type":"string"}},{"name":"fallaId","required":false,"in":"query","description":"Solo una de SUS fallas (otra → 422)","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardCensusPageDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"limit":["max"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["census:read"]}],"summary":"Censo agregado de una junta local o agrupación","tags":["boards"],"x-auth":"required","x-scope":"census:read","x-visibility":"public"}},"/api/v1/entities/{id}/board-census/export":{"get":{"description":"Mismos filtros que la lista. CSV con las columnas de `fields` en ese orden (sin él, falla + las 8 de siempre), `sep` y `encoding` (spec 22; Excel en español = `;` + BOM), fechas dd/mm/aaaa y celdas sin fórmulas; PDF con la cabecera institucional (sin generador de PDF en el servidor → 503 `details.reason = \"not_configured\"`). Queda en auditoría.","operationId":"BoardsController_export","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"format","required":true,"in":"query","schema":{"type":"string","enum":["csv","pdf"]}},{"name":"filter","required":false,"in":"query","schema":{"default":"all","type":"string","enum":["adults","children","all","left","everyone"]}},{"name":"fallaId","required":false,"in":"query","description":"Solo una de SUS fallas","schema":{"format":"uuid","type":"string"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio; por defecto, el en curso","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Idioma de la cabecera (CSV) o del documento (PDF)","schema":{"default":"va","type":"string","enum":["va","es"]}},{"name":"q","required":false,"in":"query","description":"Nombre o apellidos, o nº de censo (el `q` de la lista)","schema":{"type":"string"}},{"name":"fields","required":false,"in":"query","description":"Solo CSV (spec 22): las columnas del fichero en ese orden (`availableFields` de la lista; `entity` es la falla); sin `fields`, las de siempre","schema":{"type":"string"}},{"name":"sep","required":false,"in":"query","description":"Solo CSV","schema":{"default":";","type":"string","enum":[";",","]}},{"name":"encoding","required":false,"in":"query","description":"Solo CSV","schema":{"default":"utf8-bom","type":"string","enum":["utf8-bom","utf8"]}}],"responses":{"200":{"description":"El fichero","content":{"text/csv":{"schema":{"type":"string"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"format":["isIn"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"503":{"description":"`unavailable`: sin generador de PDF (`not_configured`) o fallo al generarlo","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unavailable","message":"No disponible ahora mismo","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["census:read"]}],"summary":"Descargar el censo agregado (CSV o PDF)","tags":["boards"],"x-auth":"required","x-scope":"census:read","x-visibility":"public"}},"/api/v1/entities/{id}/board-members":{"get":{"description":"Personas censadas activas en SUS fallas con el cargo `miembro_junta_local` (junta local) o `directiva_agrupacion` (agrupación), con su falla.","operationId":"BoardsController_members","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"exercise","required":false,"in":"query","description":"Id o etiqueta del ejercicio («2026-27»); por defecto, el en curso","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardMembersDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"422":{"description":"`validation`: `details` lleva campo → problemas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"validation","message":"Datos no válidos","details":{"campoDesconocido":["whitelistValidation"]},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["census:read"]}],"summary":"Miembros de la junta local o directiva de la agrupación","tags":["boards"],"x-auth":"required","x-scope":"census:read","x-visibility":"public"}},"/api/v1/profiles/{id}/history":{"get":{"description":"Año a año con su origen: `census` (asiento en cualquier entidad del sistema), `history` (solicitud de modificación aceptada: años fuera del sistema) y `migration` (antigüedad documental heredada sin ejercicio). Con los años de fallero y de directivo que cuentan para las recompensas, si esta sesión puede pedir una modificación y las solicitudes de ESTA entidad. Ficha de otra comisión → 404.","operationId":"HistoryController_profileHistory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonHistoryDto"}}}},"401":{"description":"`unauthorized`: sin sesión, o con una clave o un token que no vale (cabecera `WWW-Authenticate`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"unauthorized","message":"Hace falta iniciar sesión","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"403":{"description":"`forbidden`: la cuenta ve el recurso pero no tiene la acción","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"forbidden","message":"No tienes permiso para esta acción","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"404":{"description":"`not_found`: no existe o es de otra entidad (no se revela cuál)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"not_found","message":"No encontrado","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"429":{"description":"`rate_limited`: demasiadas peticiones con esta credencial (600/min); `details.retryAfterSeconds` y cabecera `Retry-After`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"rate_limited","message":"Demasiados intentos; espera un poco","details":{"retryAfterSeconds":42},"requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}},"500":{"description":"`internal`: error no controlado; da el `requestId` si nos escribes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBodyDto"},"example":{"code":"internal","message":"Error interno","requestId":"0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"}}}}},"security":[{"sv_session":[]},{"apiKey":[]},{"oauth2":["profile:read"]}],"summary":"Historial conjunto de la persona de una ficha","tags":["history"],"x-auth":"required","x-scope":"profile:read","x-visibility":"public"}}},"info":{"title":"Secretaría Virtual · API","description":"API de la nueva Secretaría Virtual de la Junta Central Fallera. Errores: `{ code, message, details?, requestId }`; 422 con `details` por campo.\n\nDocumento PÚBLICO: solo las operaciones abiertas a terceros con credencial de su entidad y a asistentes (MCP).","version":"0.1.0","contact":{}},"tags":[],"servers":[{"url":"https://test-jcf.alejandrofan2.dev","description":"Esta Secretaría Virtual (origen de la petición)"}],"components":{"securitySchemes":{"sv_session":{"type":"apiKey","in":"cookie","name":"sv_session"},"apiKey":{"scheme":"bearer","bearerFormat":"sv_<prefijo>_<secreto>","type":"http","description":"Clave de API de una entidad o de la Junta (spec 11). Alcance necesario: `x-scope` de cada operación."},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"/oauth/authorize","tokenUrl":"/oauth/token","refreshUrl":"/oauth/token","scopes":{"exercise:read":"exercise:read","entity:read":"entity:read","census:read":"census:read","profile:read":"profile:read","award:read":"award:read","procedure:read":"procedure:read"}}},"description":"Para asistentes de IA (MCP): código de autorización con PKCE S256, registro dinámico de clientes. Los alcances son las acciones (`census:read`…)."}},"schemas":{"AnonymousProcedureDto":{"type":"object","properties":{"type":{"type":"string","description":"Slug (o id) del tipo de trámite: audiencia pública, en línea, con formulario que declara su presentador"},"data":{"type":"object","additionalProperties":true,"description":"Las respuestas del formulario (se validan enteras; los campos `file`, con ids subidos con el ticket)"},"publicTicket":{"type":"string","description":"El ticket de `POST /public-submission/ticket`. Obligatorio con Turnstile (`GET /public-submission` → `turnstile`); con `quota_only` es opcional, pero sin él no se adjunta nada"},"locale":{"type":"string","enum":["es","va"],"description":"Idioma del acuse (por defecto valenciano)"}},"required":["type","data"]},"AnonymousProcedureSubmittedDto":{"type":"object","properties":{"id":{"type":"string"},"registryNumber":{"type":"string","description":"Número del registro de entrada (AAAA/NNNNNN)"},"submittedAt":{"type":"string"},"titleEs":{"type":"string","description":"Título del trámite (castellano)"},"titleVa":{"type":"string"},"email":{"type":"string","description":"Correo al que se mandó el acuse"},"receiptStatus":{"type":"string","description":"`ok`, `not_configured` (sin Chromium) o `failed`"},"ackMail":{"type":"string","enum":["sent","logged","failed","pending"],"description":"Estado del correo de acuse (con el justificante); `pending` = el justificante y el acuse siguen en segundo plano"},"authenticated":{"type":"boolean","description":"Siempre falso aquí (ADR 0025): presentado sin cuenta, la Junta comprueba quién es"},"verification":{"type":"string","enum":["turnstile","none"],"description":"Cómo se comprobó que hay una persona: el captcha o solo la cuota por IP"}},"required":["id","registryNumber","submittedAt","titleEs","titleVa","email","receiptStatus","ackMail","authenticated","verification"]},"AttachmentsPolicyDto":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"types":{"type":"array","items":{"type":"string","enum":["pdf","jpg","png","docx","xlsx","zip","mp3"]}},"maxSizeMb":{"type":"number"}},"required":["min","max","types","maxSizeMb"]},"AudienceDto":{"type":"object","properties":{"mode":{"type":"string","enum":["public","authenticated","rules","staff"]},"rules":{"description":"Solo con `mode: rules`","type":"array","items":{"$ref":"#/components/schemas/AudienceRuleDto"}}},"required":["mode"]},"AudienceRuleDto":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string","enum":["comision","junta_local","falla_municipio","agrupacion"]}},"sectors":{"description":"Sectores de València (los de las entidades)","type":"array","items":{"type":"string"}},"localBoards":{"description":"Ids de juntas locales: casa la junta local y sus fallas de municipio","type":"array","items":{"type":"string"}},"groupings":{"description":"Ids de agrupaciones: casa la agrupación y sus comisiones","type":"array","items":{"type":"string"}},"entities":{"description":"Ids de entidades concretas","type":"array","items":{"type":"string"}},"cities":{"description":"Municipios","type":"array","items":{"type":"string"}},"categories":{"description":"Reservado (categoría/sección de la falla): hoy no casa con ninguna entidad","type":"array","items":{"type":"string"}}}},"AwardProposalCountsDto":{"type":"object","properties":{"approved":{"type":"number"},"denied":{"type":"number"},"to_review":{"type":"number","description":"Pendientes de revisar"},"rejected":{"type":"number","description":"Rechazadas por la falla"},"all":{"type":"number"}},"required":["approved","denied","to_review","rejected","all"]},"AwardProposalDto":{"type":"object","properties":{"id":{"type":"string","nullable":true,"description":"Nulo = aún no hay propuesta (nace con la primera solicitud)"},"exercise":{"type":"string","example":"2026-27"},"awardsYear":{"type":"number","example":2027,"description":"Año de las recompensas («Recompensas 2027»)"},"entity":{"$ref":"#/components/schemas/EntityRefDto"},"status":{"type":"string","enum":["draft","sent","received","completed","returned"],"nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true,"description":"«Elaborada el»"},"updatedAt":{"type":"string","format":"date-time","nullable":true,"description":"«Actualizada el»"},"sentAt":{"type":"string","format":"date-time","nullable":true},"returnedAt":{"type":"string","format":"date-time","nullable":true},"returnNote":{"type":"string","nullable":true},"receivedAt":{"type":"string","format":"date-time","nullable":true,"description":"RECIBIDA: la Junta empezó a revisarla"},"completedAt":{"type":"string","format":"date-time","nullable":true,"description":"COMPLETADA: todo resuelto"},"contactPhone":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"copperBunyols":{"type":"number","nullable":true},"copperDistintius":{"type":"number","nullable":true},"canCancelSend":{"type":"boolean","description":"La comisión puede ANULAR el envío (enviada y aún no recibida)"},"canRecalculate":{"type":"boolean","description":"La comisión puede RECALCULAR la propuesta ahora"},"window":{"$ref":"#/components/schemas/AwardWindowDto"},"editable":{"type":"boolean","description":"La comisión puede cambiarla ahora"},"lockedReason":{"type":"string","enum":["window_none","window_not_yet","window_closed","sent","received","completed","no_permission"],"nullable":true},"canSend":{"type":"boolean","description":"Se puede enviar a JCF (hay solicitudes y ninguna pendiente)"},"counts":{"$ref":"#/components/schemas/AwardProposalCountsDto"},"filter":{"type":"string","enum":["approved","denied","to_review","rejected","all"]},"requests":{"type":"array","items":{"$ref":"#/components/schemas/AwardRequestDto"}}},"required":["exercise","awardsYear","entity","canCancelSend","canRecalculate","window","editable","canSend","counts","filter","requests"]},"AwardRequestDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"exercise":{"type":"string","example":"2026-27"},"entity":{"$ref":"#/components/schemas/EntityRefDto"},"collective":{"type":"boolean","description":"Col·lectiva de la entidad (sin persona)"},"profileId":{"type":"string","nullable":true},"personId":{"type":"string","nullable":true,"description":"Solo para la Junta"},"name":{"type":"string","nullable":true,"description":"Nombre y apellidos (de la ficha) o nombre de la entidad"},"nationalIdMasked":{"type":"string","nullable":true,"description":"Documento enmascarado (••••1234)"},"award":{"type":"string","enum":["distintiu_argent","distintiu_or","bunyol_argent","bunyol_or","bunyol_fulles","bunyol_brillants","bunyol_collectiu","distintiu_collectiu"]},"grade":{"type":"string","enum":["argent","or","fulles","brillants"],"nullable":true},"yearsAsMember":{"type":"number","nullable":true},"yearsAsOfficer":{"type":"number","nullable":true},"outsideRule":{"type":"boolean","description":"Se pide sin cumplir la regla"},"status":{"type":"string","enum":["pending","accepted","rejected","approved","denied"]},"manual":{"type":"boolean","description":"MANUAL = añadida por la falla (no la ofreció JCF); se justifica en persona. Automática = la ofrece JCF."},"suggested":{"type":"boolean","description":"La ofrece JCF (candidatos o recálculo)"},"notes":{"type":"string","nullable":true},"decisionNote":{"type":"string","nullable":true},"decidedAt":{"type":"string","format":"date-time","nullable":true},"grantedYear":{"type":"number","nullable":true},"idDocumentSentAt":{"type":"string","format":"date-time","nullable":true,"description":"Cuándo envió la comisión la copia del DNI (o similar)"},"scrollSentAt":{"type":"string","format":"date-time","nullable":true,"description":"Cuándo envió la imagen del pergamino (solo manuales)"},"proposalStatus":{"type":"string","enum":["draft","sent","received","completed","returned"],"description":"Estado de la propuesta a la que pertenece"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"actions":{"type":"array","description":"Lo que ESTA sesión puede hacer ahora con ella","items":{"type":"string","enum":["accept","reject","pending","remove","id_document","scroll","approve","deny","manage"]}}},"required":["id","exercise","entity","collective","award","outsideRule","status","manual","suggested","proposalStatus","createdAt","updatedAt","actions"]},"AwardsDto":{"type":"object","properties":{"distintiuArgent":{"type":"number","nullable":true},"distintiuOr":{"type":"number","nullable":true},"bunyolArgent":{"type":"number","nullable":true},"bunyolOr":{"type":"number","nullable":true},"bunyolFulles":{"type":"number","nullable":true},"bunyolBrillants":{"type":"number","nullable":true}}},"AwardWindowDto":{"type":"object","properties":{"exercise":{"type":"string","example":"2026-27"},"window":{"type":"string","enum":["none","not_yet","open","closed"]},"opensAt":{"type":"string","format":"date-time","nullable":true},"closesAt":{"type":"string","format":"date-time","nullable":true}},"required":["exercise","window"]},"BoardAwardsDto":{"type":"object","properties":{"status":{"type":"string","enum":["draft","sent","received","completed","returned"],"nullable":true,"description":"Estado de la propuesta de recompensas del ejercicio (spec 17); null = la falla no ha empezado ninguna"},"requests":{"type":"number","description":"Solicitudes en la propuesta"},"sentAt":{"type":"string","format":"date-time","nullable":true,"description":"Enviada a la Junta"},"updatedAt":{"type":"string","format":"date-time","nullable":true,"description":"Última actualización"}},"required":["requests"]},"BoardCensusCountsDto":{"type":"object","properties":{"adults":{"type":"number","description":"Mayores activos en el ejercicio"},"children":{"type":"number","description":"Infantiles activos en el ejercicio"},"left":{"type":"number","description":"Bajas del ejercicio"},"empty":{"type":"boolean","description":"Ninguna ficha (ni baja) en el ejercicio: la falla pide la carga inicial como trámite (ADR 0026)"}},"required":["adults","children","left","empty"]},"BoardCensusPageDto":{"type":"object","properties":{"exercise":{"type":"string","example":"2026-27"},"items":{"type":"array","items":{"$ref":"#/components/schemas/BoardCensusRowDto"}},"nextCursor":{"type":"string","nullable":true},"availableFields":{"type":"array","description":"Las columnas que esta sesión puede pedir con `fields` (spec 22): una junta local no ve documento, nacimiento ni contacto de las fallas que cubre","items":{"type":"string","enum":["entity","censusNumber","familyName","givenName","category","office","joinedAt","leftAt","leaveReason","birthDate","age","sex","idKind","nationalId","jcfCensusNumber","phone1","phone2","email","address","city","postalCode","reference","yearsAsMember","yearsAsOfficer","awards","topAward","profileUpdatedAt"]}}},"required":["exercise","items","availableFields"]},"BoardCensusRowDto":{"type":"object","properties":{"entryId":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"censusNumber":{"type":"number","nullable":true,"description":"Nº de censo en falla"},"givenName":{"type":"string"},"familyName":{"type":"string"},"category":{"type":"string","enum":["infantil","mayor"]},"office":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"],"nullable":true},"joinedAt":{"type":"string","format":"date-time"},"leftAt":{"type":"string","format":"date-time","nullable":true},"leaveReason":{"type":"string","enum":["voluntaria","traslado","fallecimiento","expulsion","otro"],"nullable":true},"leaveNote":{"type":"string","nullable":true},"birthDate":{"type":"string","format":"date","nullable":true,"description":"Con `fields=birthDate`"},"age":{"type":"number","nullable":true,"description":"Años cumplidos a la fecha de corte del ejercicio (19-03); con `fields=age`"},"sex":{"type":"string","enum":["hombre","mujer"],"nullable":true},"idKind":{"type":"string","enum":["dni","menor","extranjero"]},"nationalId":{"type":"string","nullable":true,"description":"Enmascarado (`****678Z`) salvo con `census:write`"},"jcfCensusNumber":{"type":"string","nullable":true,"description":"Nº de censo en JCF de la ficha"},"phone1":{"type":"string","nullable":true},"phone2":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true},"reference":{"type":"string","nullable":true,"description":"«Su referencia» de la comisión"},"yearsAsMember":{"type":"number","nullable":true,"description":"Años de fallero (todas sus fichas + antigüedad documental, spec 17)"},"yearsAsOfficer":{"type":"number","nullable":true,"description":"Años de directivo"},"awards":{"type":"array","description":"Recompensas de persona concedidas, en orden","items":{"type":"string","enum":["distintiu_argent","distintiu_or","bunyol_argent","bunyol_or","bunyol_fulles","bunyol_brillants"]}},"topAward":{"type":"string","enum":["distintiu_argent","distintiu_or","bunyol_argent","bunyol_or","bunyol_fulles","bunyol_brillants"],"nullable":true,"description":"La mayor concedida"},"profileUpdatedAt":{"type":"string","format":"date-time","nullable":true,"description":"Última modificación de la ficha"},"entity":{"description":"La falla de la fila","allOf":[{"$ref":"#/components/schemas/EntityRefDto"}]}},"required":["entryId","profileId","givenName","familyName","category","joinedAt","entity"]},"BoardEntityDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["comision","junta_local","falla_municipio","agrupacion"]},"officialNumber":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"sector":{"type":"string","nullable":true},"city":{"type":"string","nullable":true}},"required":["id","kind","officialNumber","slug","name"]},"BoardExerciseStartDto":{"type":"object","properties":{"state":{"type":"string","enum":["not_started","in_progress","ready_to_submit","in_review","returned","approved","rejected"],"description":"Estado del inicio de ejercicio (spec 16), la misma regla que el cuadro de la Junta"},"updatedAt":{"type":"string","format":"date-time","nullable":true,"description":"Último movimiento del proceso (null = no ha empezado)"}},"required":["state"]},"BoardFallaDto":{"type":"object","properties":{"entity":{"$ref":"#/components/schemas/BoardEntityDto"},"census":{"$ref":"#/components/schemas/BoardCensusCountsDto"},"keyOffices":{"description":"Presidencia, secretaría, tesorería y delegación de infantiles, en ese orden","type":"array","items":{"$ref":"#/components/schemas/BoardKeyOfficeDto"}},"exerciseStart":{"description":"Inicio de ejercicio de la falla en el ejercicio pedido","allOf":[{"$ref":"#/components/schemas/BoardExerciseStartDto"}]},"awards":{"description":"Su propuesta de recompensas del ejercicio pedido","allOf":[{"$ref":"#/components/schemas/BoardAwardsDto"}]}},"required":["entity","census","keyOffices","exerciseStart","awards"]},"BoardFallasDto":{"type":"object","properties":{"board":{"description":"La junta local o agrupación","allOf":[{"$ref":"#/components/schemas/BoardEntityDto"}]},"exercise":{"type":"string","example":"2026-27"},"items":{"description":"Sus fallas, por nombre","type":"array","items":{"$ref":"#/components/schemas/BoardFallaDto"}},"totals":{"description":"Suma de todas sus fallas","allOf":[{"$ref":"#/components/schemas/BoardCensusCountsDto"}]}},"required":["board","exercise","items","totals"]},"BoardHolderDto":{"type":"object","properties":{"profileId":{"type":"string","format":"uuid"},"givenName":{"type":"string"},"familyName":{"type":"string"}},"required":["profileId","givenName","familyName"]},"BoardKeyOfficeDto":{"type":"object","properties":{"office":{"type":"string","enum":["presidente","secretario","tesorero","delegado_infantiles"]},"holders":{"description":"Ocupantes activos (vacío = sin cubrir)","type":"array","items":{"$ref":"#/components/schemas/BoardHolderDto"}}},"required":["office","holders"]},"BoardMemberDto":{"type":"object","properties":{"entity":{"description":"La falla donde está censada","allOf":[{"$ref":"#/components/schemas/EntityRefDto"}]},"profileId":{"type":"string","format":"uuid"},"givenName":{"type":"string"},"familyName":{"type":"string"},"category":{"type":"string","enum":["infantil","mayor"]},"censusNumber":{"type":"number","nullable":true}},"required":["entity","profileId","givenName","familyName","category"]},"BoardMembersDto":{"type":"object","properties":{"board":{"$ref":"#/components/schemas/BoardEntityDto"},"exercise":{"type":"string","example":"2026-27"},"office":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"],"description":"`miembro_junta_local` en una junta local; `directiva_agrupacion` en una agrupación"},"items":{"type":"array","items":{"$ref":"#/components/schemas/BoardMemberDto"}}},"required":["board","exercise","office","items"]},"CensusPageDto":{"type":"object","properties":{"exercise":{"type":"string","example":"2026-27"},"items":{"type":"array","items":{"$ref":"#/components/schemas/CensusRowDto"}},"nextCursor":{"type":"string","nullable":true},"availableFields":{"type":"array","description":"Las columnas que ESTA sesión puede pedir con `fields` (spec 22): la web no ofrece lo que no venga aquí","items":{"type":"string","enum":["entity","censusNumber","familyName","givenName","category","office","joinedAt","leftAt","leaveReason","birthDate","age","sex","idKind","nationalId","jcfCensusNumber","phone1","phone2","email","address","city","postalCode","reference","yearsAsMember","yearsAsOfficer","awards","topAward","profileUpdatedAt"]}}},"required":["exercise","items","availableFields"]},"CensusRowDto":{"type":"object","properties":{"entryId":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"censusNumber":{"type":"number","nullable":true,"description":"Nº de censo en falla"},"givenName":{"type":"string"},"familyName":{"type":"string"},"category":{"type":"string","enum":["infantil","mayor"]},"office":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"],"nullable":true},"joinedAt":{"type":"string","format":"date-time"},"leftAt":{"type":"string","format":"date-time","nullable":true},"leaveReason":{"type":"string","enum":["voluntaria","traslado","fallecimiento","expulsion","otro"],"nullable":true},"leaveNote":{"type":"string","nullable":true},"birthDate":{"type":"string","format":"date","nullable":true,"description":"Con `fields=birthDate`"},"age":{"type":"number","nullable":true,"description":"Años cumplidos a la fecha de corte del ejercicio (19-03); con `fields=age`"},"sex":{"type":"string","enum":["hombre","mujer"],"nullable":true},"idKind":{"type":"string","enum":["dni","menor","extranjero"]},"nationalId":{"type":"string","nullable":true,"description":"Enmascarado (`****678Z`) salvo con `census:write`"},"jcfCensusNumber":{"type":"string","nullable":true,"description":"Nº de censo en JCF de la ficha"},"phone1":{"type":"string","nullable":true},"phone2":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true},"reference":{"type":"string","nullable":true,"description":"«Su referencia» de la comisión"},"yearsAsMember":{"type":"number","nullable":true,"description":"Años de fallero (todas sus fichas + antigüedad documental, spec 17)"},"yearsAsOfficer":{"type":"number","nullable":true,"description":"Años de directivo"},"awards":{"type":"array","description":"Recompensas de persona concedidas, en orden","items":{"type":"string","enum":["distintiu_argent","distintiu_or","bunyol_argent","bunyol_or","bunyol_fulles","bunyol_brillants"]}},"topAward":{"type":"string","enum":["distintiu_argent","distintiu_or","bunyol_argent","bunyol_or","bunyol_fulles","bunyol_brillants"],"nullable":true,"description":"La mayor concedida"},"profileUpdatedAt":{"type":"string","format":"date-time","nullable":true,"description":"Última modificación de la ficha"}},"required":["entryId","profileId","givenName","familyName","category","joinedAt"]},"CommunicationDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"category":{"type":"string","enum":["actas_asambleas_presidentes","actas_plenos","boletines","carteles_folletos","convocatorias_asambleas_presidentes","convocatorias_plenos","documentacion_asambleas_plenos","hojas_censos","instrucciones_bases","notas_avisos","solicitudes_inscripciones","varios","cursos_cre","otros"]},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"bodyEs":{"type":"string","nullable":true,"description":"Nulo si está cerrada (`locked`)"},"bodyVa":{"type":"string","nullable":true},"hidden":{"type":"boolean"},"hasFile":{"type":"boolean"},"pendingFile":{"type":"boolean"},"locked":{"type":"boolean","description":"= !allowed"},"sentAt":{"type":"string","nullable":true},"read":{"type":"boolean","description":"La cuenta de la sesión ya la ha abierto o descargado"},"actions":{"type":"array","items":{"type":"string","enum":["view","download","sign_in_to_download","edit"]}}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","category","titleEs","titleVa","hidden","hasFile","pendingFile","locked","read","actions"]},"CommunicationFacetDto":{"type":"object","properties":{"value":{"type":"string","enum":["actas_asambleas_presidentes","actas_plenos","boletines","carteles_folletos","convocatorias_asambleas_presidentes","convocatorias_plenos","documentacion_asambleas_plenos","hojas_censos","instrucciones_bases","notas_avisos","solicitudes_inscripciones","varios","cursos_cre","otros"]},"count":{"type":"number"}},"required":["value","count"]},"CommunicationFacetsDto":{"type":"object","properties":{"total":{"type":"number","description":"Cuántas casan con TODOS los filtros"},"categories":{"description":"Categorías con cuántas casan contando los demás filtros","type":"array","items":{"$ref":"#/components/schemas/CommunicationFacetDto"}},"downloadable":{"type":"number","description":"Cuántas se pueden descargar ya con los demás filtros"}},"required":["total","categories","downloadable"]},"CommunicationPageDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CommunicationDto"}},"nextCursor":{"type":"string","nullable":true}},"required":["items"]},"ContactDestinationDto":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"nameEs":{"type":"string"},"nameVa":{"type":"string"},"configured":{"type":"boolean","description":"Tiene correo configurado: si no, el mensaje se guarda y va al buzón general (o queda `not_configured`)"},"email":{"type":"string","nullable":true,"description":"Correo público del destino (como la ficha de hoy); nulo si la Junta no lo ha puesto"},"phone":{"type":"string","nullable":true,"description":"Teléfono público; nulo si la Junta no lo ha puesto"},"descriptionEs":{"type":"string","nullable":true,"description":"Qué atiende (castellano); nulo = no se pinta"},"descriptionVa":{"type":"string","nullable":true},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true,"description":"Delegación de la Junta que atiende este destino (ola 5-F: el pie de Gestión y los correos que nacen de ella la buscan por aquí); nulo si no es una delegación"},"isActive":{"type":"boolean","description":"Activo = sale en «Contactar»; `GET /contact/destinations` solo trae activos, Gestión los ve todos"},"order":{"type":"number"},"logoUrl":{"type":"string","nullable":true,"description":"Logo del destino (`GET /contact/destinations/{id}/logo`); nulo si la Junta no lo ha subido"}},"required":["id","slug","nameEs","nameVa","configured","isActive","order"]},"ContactDestinationListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContactDestinationDto"}}},"required":["items"]},"ContactDto":{"type":"object","properties":{"delegation":{"type":"string","description":"Slug del destino (`GET /contact/destinations`)"},"name":{"type":"string","description":"Quién escribe (con sesión de entidad, la persona; la entidad la pone la sesión)"},"email":{"type":"string","description":"Correo de respuesta. Obligatorio SIN sesión; con sesión de entidad se IGNORA y se usa el de la cuenta (el de la Secretaría)"},"fallaNumber":{"type":"string","description":"«Número de su Falla» (hasta 5 cifras). Con sesión de entidad se IGNORA: es el de la entidad"},"fallaName":{"type":"string","description":"«Nombre de su Falla». Con sesión de entidad se IGNORA: es el de la entidad"},"subject":{"type":"string","description":"«Tema del mensaje»: va en el asunto del correo a la delegación y de la copia"},"message":{"type":"string"},"locale":{"type":"string","enum":["es","va"],"description":"Idioma de la copia al remitente (por defecto valenciano)"},"publicTicket":{"type":"string","description":"SIN sesión y con Turnstile en el servidor (`GET /public-submission` → `configured`), obligatorio: el ticket de `POST /public-submission/ticket`, de un uso (se gasta tras validar). Con sesión se ignora. Sin Turnstile en el servidor no hace falta, pero entonces NO se manda la copia al remitente (`copyMail: skipped_unverified`)."}},"required":["delegation","name","message"]},"ContactResultDto":{"type":"object","properties":{"id":{"type":"string"},"reference":{"type":"string","description":"Referencia corta para citar el mensaje (los 8 últimos caracteres del id, en mayúsculas)"},"createdAt":{"type":"string"},"delegationMail":{"type":"string","enum":["pending","sent","logged","failed","not_configured","skipped_unverified"],"description":"Correo a la delegación: `logged` = sin proveedor (desarrollo); `not_configured` = el destino no tiene correo ni hay buzón general"},"copyMail":{"type":"string","enum":["pending","sent","logged","failed","not_configured","skipped_unverified"],"description":"Copia al remitente: `skipped_unverified` = sin sesión y sin Turnstile en el servidor no se manda un texto libre a un correo que nadie ha comprobado (sería un relé de phishing con remitente de la Junta); el mensaje queda guardado igual"}},"required":["id","reference","createdAt","delegationMail","copyMail"]},"CreateRegistryDto":{"type":"object","properties":{"subject":{"type":"string","description":"Asunto: descripción breve"},"kind":{"type":"string","enum":["documents_only","request"],"description":"«Indique lo que desea hacer»"},"presenter":{"$ref":"#/components/schemas/PresenterDto"},"contact":{"$ref":"#/components/schemas/RegistryContactDto"},"notification":{"description":"Domicilio a efectos de notificación","allOf":[{"$ref":"#/components/schemas/NotificationAddressDto"}]},"expose":{"type":"string","nullable":true,"maxLength":1500},"request":{"type":"string","nullable":true,"maxLength":1000},"attachments":{"maxItems":10,"type":"array","items":{"$ref":"#/components/schemas/RegistryAttachmentInputDto"}},"locale":{"type":"string","enum":["es","va"],"description":"Idioma del acuse (por defecto, el de la cuenta)"},"publicTicket":{"type":"string","description":"SIN sesión: el ticket de `POST /public-submission/ticket`. Obligatorio si el servidor tiene Turnstile (`GET /public-submission` → `turnstile`); con `quota_only` es opcional, pero sin él no se puede adjuntar nada (los adjuntos se suben antes con `POST /public-submission/files` y ese ticket). Con sesión se ignora."}},"required":["subject","kind","presenter","contact","notification","attachments"]},"DocumentDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"category":{"type":"string","enum":["impresos_jcf","agrupaciones","juntas_locales","ayuntamiento","jornadas","privacidad","rgcre","petardos","normativa","otros"]},"pageSlug":{"type":"string","nullable":true},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true},"sectionEs":{"type":"string","nullable":true},"sectionVa":{"type":"string","nullable":true},"hidden":{"type":"boolean"},"kind":{"type":"string","enum":["pdf","pdf_r","excel","word","zip","otro"]},"hasFile":{"type":"boolean","description":"Hay fichero descargable"},"fileId":{"type":"string","nullable":true,"description":"Solo en Gestión JCF (`/gestion/documents`): para descargar por `/files/{id}` cualquier audiencia"},"pendingFile":{"type":"boolean","description":"Sembrado desde el inventario sin el fichero real: la Junta lo sube"},"locked":{"type":"boolean","description":"= !allowed"},"order":{"type":"number"},"publishedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"actions":{"type":"array","items":{"type":"string","enum":["view","download","sign_in_to_download","edit"]}}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","titleEs","titleVa","category","hidden","kind","hasFile","pendingFile","locked","order","updatedAt","actions"]},"DocumentFacetsDto":{"type":"object","properties":{"total":{"type":"number","description":"Cuántos casan con TODOS los filtros"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/FacetValueDto"}},"delegations":{"type":"array","items":{"$ref":"#/components/schemas/FacetValueDto"}},"kinds":{"type":"array","items":{"$ref":"#/components/schemas/FacetValueDto"}},"sections":{"type":"array","items":{"$ref":"#/components/schemas/FacetValueDto"}},"downloadable":{"type":"number","description":"Cuántos se pueden descargar ya con los demás filtros"}},"required":["total","categories","delegations","kinds","sections","downloadable"]},"DocumentPageDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DocumentDto"}},"nextCursor":{"type":"string","nullable":true}},"required":["items"]},"EntityCapabilitiesDto":{"type":"object","properties":{"hasCensus":{"type":"boolean","description":"Tiene censo propio (comisiones y fallas de municipio)"},"awardsEligible":{"type":"boolean","description":"Puede pedir recompensas"},"hasFallas":{"type":"boolean","description":"Tiene fallas a su cargo (juntas locales y agrupaciones)"},"privateHome":{"type":"string","enum":["panel","mis-fallas"],"description":"Su Zona Privada en la web de las fallas"}},"required":["hasCensus","awardsEligible","hasFallas","privateHome"]},"EntityDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["comision","junta_local","falla_municipio","agrupacion"]},"officialNumber":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"capabilities":{"$ref":"#/components/schemas/EntityCapabilitiesDto"},"legacyCode":{"type":"string","nullable":true,"description":"Código del sistema viejo (`fal35303`)"},"sector":{"type":"string","nullable":true},"taxId":{"type":"string","nullable":true,"description":"NIF de la entidad (solo lo cambia la Junta)"},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true},"phone":{"type":"string","nullable":true,"description":"Teléfono del casal, solo dígitos"},"publicEmail":{"type":"string","nullable":true,"description":"Correo público (directorios de JCF)"},"localBoard":{"nullable":true,"description":"Junta local de la que cuelga","type":"object","allOf":[{"$ref":"#/components/schemas/EntityRefDto"}]},"grouping":{"nullable":true,"description":"Agrupación a la que pertenece","type":"object","allOf":[{"$ref":"#/components/schemas/EntityRefDto"}]},"editableFields":{"type":"array","description":"Campos que ESTA cuenta puede cambiar (la API decide; la web solo pinta)","items":{"type":"string","enum":["address","city","postalCode","phone","publicEmail","name","officialNumber","sector","taxId","localBoardId","groupingId"]}}},"required":["id","kind","officialNumber","slug","name","capabilities","editableFields"]},"EntityRefDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["comision","junta_local","falla_municipio","agrupacion"]},"officialNumber":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["id","kind","officialNumber","slug","name"]},"ErrorBodyDto":{"type":"object","properties":{"code":{"type":"string","enum":["validation","not_found","forbidden","unauthorized","invalid_credentials","conflict","person_exists","census_closed","rate_limited","no_impersonation","unavailable","payload_too_large","not_implemented","internal"]},"message":{"type":"string","description":"Texto para personas (castellano); la web traduce por `code`"},"details":{"type":"object","additionalProperties":true,"description":"En `validation`: campo → problemas"},"requestId":{"type":"string","description":"El mismo que la cabecera X-Request-Id; búscalo en audit_log y en los logs"}},"required":["code","message","requestId"]},"EventDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"descriptionEs":{"type":"string","nullable":true,"description":"Nula si la audiencia no lo deja ver"},"descriptionVa":{"type":"string","nullable":true},"startsAt":{"type":"string"},"endsAt":{"type":"string","nullable":true},"place":{"type":"string","nullable":true},"kind":{"type":"string","enum":["junta","ffmm","otro"]},"hidden":{"type":"boolean"},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true,"description":"Delegación que lo organiza (spec 23)"},"internal":{"type":"boolean","description":"Solo Gestión JCF (spec 23): nunca sale en la sede ni en el buscador"},"allDay":{"type":"boolean","description":"Día entero (las 00:00 a las 23:59:59 de València)"},"actions":{"type":"array","items":{"type":"string","enum":["view","download","sign_in_to_download","edit"]}}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","titleEs","titleVa","startsAt","kind","hidden","internal","allDay","actions"]},"EventListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EventDto"}}},"required":["items"]},"ExerciseAwardWindowDto":{"type":"object","properties":{"window":{"type":"string","enum":["none","not_yet","open","closed"],"description":"`none` sin plazo; `not_yet`, `open`, `closed`"},"opensAt":{"type":"string","format":"date-time","nullable":true},"closesAt":{"type":"string","format":"date-time","nullable":true}},"required":["window"]},"ExerciseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string","example":"2026-27"},"opensAt":{"type":"string","format":"date-time"},"closesAt":{"type":"string","format":"date-time","nullable":true},"isCurrent":{"type":"boolean"},"phase":{"type":"string","enum":["planned","open","census_closed","constitution","closed"]},"allowedOperations":{"type":"array","description":"Operaciones del censo que la fase permite (ADR 0013); la web solo esconde botones","items":{"type":"string","enum":["census.register","census.leave","census.office","census.edit"]}},"categoryCutoff":{"type":"string","format":"date","description":"Fecha de corte para la categoría (14 años cumplidos a San José, configurable)"},"adultAge":{"type":"number","description":"Años cumplidos a la fecha de corte para pasar a mayores en este ejercicio (ADR 0018)"},"sheetsDeadline":{"type":"string","format":"date-time","nullable":true,"description":"Fecha límite de entrega de las Hojas de Constitución (spec 16; informativa)"},"requiredOffices":{"type":"array","description":"Cargos obligatorios de la comprobación de censos (spec 16)","items":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"]}},"awardWindow":{"description":"Plazo de la propuesta de recompensas de este ejercicio (spec 17; desde el 07-10-2026 se fija aquí). Viene en `/exercises`, `/exercises/current` y `/gestion/exercises`; en el ejercicio embebido en otras respuestas se omite","allOf":[{"$ref":"#/components/schemas/ExerciseAwardWindowDto"}]}},"required":["id","label","opensAt","isCurrent","phase","allowedOperations","categoryCutoff","adultAge","requiredOffices"]},"FacetValueDto":{"type":"object","properties":{"value":{"type":"string","description":"Valor del filtro (enumeración o, en `sections`, el rótulo en castellano)"},"labelVa":{"type":"string","nullable":true,"description":"Solo en `sections`: el rótulo en valenciano"},"count":{"type":"number","description":"Cuántos casan con este valor y los demás filtros"}},"required":["value","count"]},"FileDto":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["pdf","jpg","png","docx","xlsx","zip","mp3"]},"mimeType":{"type":"string"},"size":{"type":"number"},"originalName":{"type":"string"},"sha256":{"type":"string","description":"SHA-256 del contenido (hex)"},"purpose":{"type":"string","enum":["document","communication","registry","message","receipt","procedure","candidacy","brand","award","history"]},"createdAt":{"type":"string"}},"required":["id","type","mimeType","size","originalName","sha256","purpose","createdAt"]},"FormConditionDto":{"type":"object","properties":{"field":{"type":"string","description":"Clave de un campo ANTERIOR"},"op":{"type":"string","enum":["equals","not_equals","in","filled","empty"]},"value":{"description":"Texto, número, sí/no o lista (con `in`)","oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]}},"required":["field","op"]},"FormFieldDto":{"type":"object","properties":{"key":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,47}$"},"type":{"type":"string","enum":["text","textarea","number","date","time","datetime","select","multiselect","boolean","file","address","person_from_census","entity","amount","repeatable_group","custom_code"]},"labelEs":{"type":"string"},"labelVa":{"type":"string"},"helpEs":{"type":"string"},"helpVa":{"type":"string"},"required":{"type":"boolean"},"showIf":{"description":"Se ve solo si se cumplen todas","type":"array","items":{"$ref":"#/components/schemas/FormConditionDto"}},"minLength":{"type":"number"},"maxLength":{"type":"number"},"pattern":{"type":"string","description":"Expresión regular (texto entero)"},"min":{"type":"number"},"max":{"type":"number"},"options":{"type":"array","items":{"$ref":"#/components/schemas/FormOptionDto"}},"minItems":{"type":"number"},"maxItems":{"type":"number"},"accept":{"type":"array","items":{"type":"string","enum":["pdf","jpg","png","docx","xlsx","zip","mp3"]}},"code":{"type":"string","description":"`custom_code`: declarado, NO implementado (publicar → 501 not_implemented)"},"fields":{"description":"Solo `repeatable_group`","type":"array","items":{"$ref":"#/components/schemas/FormFieldDto"}}},"required":["key","type","labelEs","labelVa"]},"FormFlowDto":{"type":"object","properties":{"stages":{"type":"array","items":{"$ref":"#/components/schemas/FormFlowStageDto"}}},"required":["stages"]},"FormFlowStageDto":{"type":"object","properties":{"key":{"type":"string"},"labelEs":{"type":"string"},"labelVa":{"type":"string"},"role":{"type":"string","description":"Rol que resuelve la etapa"}},"required":["key","labelEs","labelVa","role"]},"FormOptionDto":{"type":"object","properties":{"value":{"type":"string","pattern":"^[a-z0-9_-]{1,60}$"},"labelEs":{"type":"string"},"labelVa":{"type":"string"}},"required":["value","labelEs","labelVa"]},"FormPresenterDto":{"type":"object","properties":{"name":{"type":"string","description":"Clave del campo con el nombre (con sesión, la API pone el de la entidad)"},"email":{"type":"string","description":"Clave del campo con el correo"},"phone":{"type":"string"},"nationalId":{"type":"string"}},"required":["name","email"]},"FormSchemaDto":{"type":"object","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/FormFieldDto"}},"noticeEs":{"type":"string","description":"Aviso previo (castellano)"},"noticeVa":{"type":"string"},"flow":{"$ref":"#/components/schemas/FormFlowDto"},"presenter":{"description":"Quién presenta, con campos del formulario: sin él no se presenta sin sesión","allOf":[{"$ref":"#/components/schemas/FormPresenterDto"}]}},"required":["fields"]},"FormVersionDto":{"type":"object","properties":{"id":{"type":"string"},"formId":{"type":"string"},"version":{"type":"number"},"schema":{"$ref":"#/components/schemas/FormSchemaDto"},"publishedAt":{"type":"string"}},"required":["id","formId","version","schema","publishedAt"]},"HealthDto":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"version":{"type":"string"},"time":{"type":"string","format":"date-time"}},"required":["status","version","time"]},"HistoryRequestSummaryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["draft","sent","accepted","rejected","returned"]},"exercise":{"type":"string","example":"2026-27"},"entity":{"$ref":"#/components/schemas/EntityRefDto"},"items":{"type":"number"},"attachments":{"type":"number"},"exOfficio":{"type":"boolean","description":"De oficio (la abrió la Junta)"},"sentAt":{"type":"string","format":"date-time","nullable":true},"registryNumber":{"type":"string","nullable":true},"decidedAt":{"type":"string","format":"date-time","nullable":true},"decisionNote":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","status","exercise","entity","items","attachments","exOfficio","createdAt","updatedAt"]},"HistoryRowDto":{"type":"object","properties":{"exercise":{"type":"string","example":"2025-26"},"entityOfficialNumber":{"type":"string","description":"Número oficial de la falla"},"entityName":{"type":"string"},"category":{"type":"string","enum":["infantil","mayor"]},"censusNumber":{"type":"number","nullable":true},"office":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"],"nullable":true},"leftAt":{"type":"string","format":"date-time","nullable":true}},"required":["exercise","entityOfficialNumber","entityName","category"]},"JobsDto":{"type":"object","properties":{"backend":{"type":"string","enum":["memory"],"description":"Dónde vive la cola de trabajos en segundo plano (envíos, PDF, lotes): hoy siempre en memoria del proceso, con lo duradero en la base"},"queued":{"type":"number"},"running":{"type":"number"},"capacity":{"type":"number","description":"Tope de la cola"}},"required":["backend","queued","running","capacity"]},"LocalizedNoteDto":{"type":"object","properties":{"es":{"type":"string"},"va":{"type":"string"}},"required":["es","va"]},"MenuDto":{"type":"object","properties":{"main":{"description":"Menú principal: las páginas que la audiencia deja ver a la sesión (navegación: lo que no puede abrir no sale)","type":"array","items":{"$ref":"#/components/schemas/MenuItemDto"}},"privateZone":{"nullable":true,"description":"Bloque «Zona Privada»: solo con sesión de una entidad","type":"array","items":{"$ref":"#/components/schemas/PrivateZoneItemDto"}},"gestion":{"type":"boolean","description":"Con sesión de la Junta: enlace a Gestión JCF"},"privateZonePaths":{"description":"Rutas de la Zona Privada (con o sin sesión): una web sabe así que una ruta es privada y, sin sesión, manda al acceso. Solo rutas, ningún dato","type":"array","items":{"type":"string"}}},"required":["main","gestion","privateZonePaths"]},"MenuItemDto":{"type":"object","properties":{"slug":{"type":"string"},"path":{"type":"string"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"children":{"type":"array","items":{"$ref":"#/components/schemas/MenuItemDto"}}},"required":["slug","path","titleEs","titleVa","children"]},"NotificationAddressDto":{"type":"object","properties":{"address":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string","nullable":true}},"required":["address","city"]},"OfficeHolderDto":{"type":"object","properties":{"profileId":{"type":"string","format":"uuid"},"givenName":{"type":"string"},"familyName":{"type":"string"},"category":{"type":"string","enum":["infantil","mayor"]},"censusNumber":{"type":"number","nullable":true}},"required":["profileId","givenName","familyName","category"]},"OfficesDto":{"type":"object","properties":{"exercise":{"type":"string","example":"2026-27"},"offices":{"description":"Todos los cargos menos `vocal`, en el orden de OFFICE_RANK","type":"array","items":{"$ref":"#/components/schemas/OfficeSlotDto"}},"vocalCount":{"type":"number","description":"Personas activas con cargo `vocal`"}},"required":["exercise","offices","vocalCount"]},"OfficeSlotDto":{"type":"object","properties":{"office":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"]},"unique":{"type":"boolean","description":"Cargo único (desplaza al anterior)"},"holders":{"description":"Ocupantes activos en el ejercicio (vacío = sin cubrir)","type":"array","items":{"$ref":"#/components/schemas/OfficeHolderDto"}}},"required":["office","unique","holders"]},"OrganizationDto":{"type":"object","properties":{"officialName":{"type":"string","example":"Junta Central Fallera de València"},"shortName":{"type":"string","example":"Junta Central Fallera"},"legalFormEs":{"type":"string","nullable":true},"legalFormVa":{"type":"string","nullable":true},"taxId":{"type":"string","nullable":true,"description":"NIF"},"address":{"type":"string","nullable":true,"description":"Dirección postal (puede tener saltos de línea)"},"phone":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"description":"Correo general"},"website":{"type":"string","nullable":true},"openingHoursEs":{"type":"string","nullable":true},"openingHoursVa":{"type":"string","nullable":true},"dpoEmail":{"type":"string","nullable":true,"description":"Correo del Delegado de Protección de Datos"},"social":{"type":"array","items":{"$ref":"#/components/schemas/OrgSocialLinkDto"}},"logoUrl":{"type":"string","nullable":true,"description":"Emblema subido por la Junta (`GET /org/logo`): va en los documentos (PDF), junto al logo de la Secretaría Virtual; las webs llevan siempre el del kit. null = sin emblema"},"logoStrokeUrl":{"type":"string","nullable":true,"description":"Trazo del emblema (`GET /org/logo-stroke`): un solo color con transparencia, para teñir por CSS (blanco en fondos oscuros)"},"logoLightVariant":{"type":"string","enum":["color","stroke"],"description":"Qué emblema va en fondos claros: `color` (por defecto) o `stroke` (el trazo teñido)"},"legalFooterEs":{"type":"string","nullable":true,"description":"Pie legal corto (castellano)"},"legalFooterVa":{"type":"string","nullable":true},"updatedAt":{"type":"string"}},"required":["officialName","shortName","social","logoLightVariant","updatedAt"]},"OrgSocialLinkDto":{"type":"object","properties":{"label":{"type":"string","description":"Nombre de la red tal como se enseña (Instagram, Facebook…)"},"url":{"type":"string","description":"Enlace https"}},"required":["label","url"]},"PageDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"slug":{"type":"string"},"path":{"type":"string","description":"Ruta en la web de las fallas"},"kind":{"type":"string","enum":["content","link"]},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"bodyEs":{"type":"string","description":"Markdown; vacío si la página está cerrada (`locked`)"},"bodyVa":{"type":"string"},"hidden":{"type":"boolean","description":"No se lista (se abre por enlace directo si la audiencia lo permite)"},"locked":{"type":"boolean","description":"= !allowed: se enseña el título y el motivo, sin cuerpo"},"menu":{"type":"string","nullable":true},"parentSlug":{"type":"string","nullable":true},"order":{"type":"number"},"publishedAt":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"actions":{"type":"array","items":{"type":"string","enum":["view","download","sign_in_to_download","edit"]}}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","slug","path","kind","titleEs","titleVa","bodyEs","bodyVa","hidden","locked","order","updatedAt","actions"]},"PageListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PageDto"}}},"required":["items"]},"PaymentPolicyDto":{"type":"object","properties":{"amountCents":{"type":"number","description":"Importe en céntimos (0 = según las bases de la convocatoria)","example":13000},"concept":{"type":"string","description":"Concepto que hay que poner en la transferencia o el ingreso","example":"Fianza Concurs de Playback"},"iban":{"type":"string","nullable":true,"description":"Cuenta (IBAN, sin espacios; se comprueba el control)"},"proofRequired":{"type":"boolean","enum":[true],"description":"El expediente exige el justificante como anexo (`role: payment_proof`)"},"noteEs":{"type":"string","nullable":true,"description":"Cómo pagar, en castellano (plazo, autoliquidación…)"},"noteVa":{"type":"string","nullable":true}},"required":["amountCents","concept","proofRequired"]},"PersonHistoryDto":{"type":"object","properties":{"profileId":{"type":"string","format":"uuid"},"personId":{"type":"string","format":"uuid","nullable":true,"description":"Solo para la Junta"},"name":{"type":"string","description":"Nombre y apellidos (de la ficha)"},"exercise":{"type":"string","example":"2026-27","description":"Ejercicio hasta el que se cuenta (incluido)"},"rows":{"description":"Año a año, del más reciente al más antiguo; la fila de migración, la última","type":"array","items":{"$ref":"#/components/schemas/PersonHistoryRowDto"}},"years":{"type":"number","description":"Años de fallero: censo + solicitudes aceptadas + resto documental"},"officerYears":{"type":"number"},"censusYears":{"type":"number"},"censusOfficerYears":{"type":"number"},"historyYears":{"type":"number","description":"Años aceptados por solicitud que el censo no tenía"},"historyOfficerYears":{"type":"number"},"migrationYears":{"type":"number","description":"Antigüedad documental heredada que ninguna solicitud explica"},"migrationOfficerYears":{"type":"number"},"canRequest":{"type":"boolean","description":"Esta sesión puede pedir una modificación (entity.admin de la entidad de la ficha)"},"openRequestId":{"type":"string","format":"uuid","nullable":true,"description":"La solicitud ABIERTA de esta entidad para la persona, si la hay"},"requests":{"description":"Solicitudes de ESTA entidad (la Junta ve las de todas), de la más reciente a la más antigua","type":"array","items":{"$ref":"#/components/schemas/HistoryRequestSummaryDto"}}},"required":["profileId","name","exercise","rows","years","officerYears","censusYears","censusOfficerYears","historyYears","historyOfficerYears","migrationYears","migrationOfficerYears","canRequest","requests"]},"PersonHistoryRowDto":{"type":"object","properties":{"exercise":{"type":"string","nullable":true,"example":"1998-99","description":"Nulo en la fila agregada de la migración"},"entities":{"description":"Entidades del año: «001 Falla de Prova Ú» o «Falla Sant Antoni (0300)» si es de fuera","type":"array","items":{"type":"string"}},"topOffice":{"type":"string","enum":["presidente","vicepresidente_1","vicepresidente_2","vicepresidente_3","vicepresidente_4","secretario","vicesecretario","contador","tesorero","vicecontador","delegado_infantiles","delegado_1","delegado_2","delegado_3","delegado_4","delegado_5","delegado_6","delegado_7","bibliotecario_archivero","fallera_mayor","vocal","miembro_junta_local","directiva_agrupacion"],"nullable":true,"description":"Cargo mayor del año"},"category":{"type":"string","enum":["infantil","mayor"],"nullable":true},"counts":{"type":"boolean","description":"Cuenta como año de fallero"},"officer":{"type":"boolean","description":"Cuenta como año de directivo"},"origin":{"type":"string","enum":["census","history","migration"],"description":"`census` = asiento del censo · `history` = solicitud aceptada · `migration` = antigüedad documental heredada (sin ejercicio)"},"years":{"type":"number","description":"Años que agrupa la fila (1, o N en la de migración)"},"officerYears":{"type":"number"},"pending":{"type":"boolean","description":"Algún ítem PENDIENTE toca este año (solo lo ve la Junta y la entidad que lo pidió)"},"itemIds":{"type":"array","items":{"type":"string"}}},"required":["entities","counts","officer","origin","years","officerYears","pending","itemIds"]},"PresenterDto":{"type":"object","properties":{"name":{"type":"string","description":"Presentador/a"},"nationalId":{"type":"string","description":"DNI, NIE o NIF (CIF)"},"onBehalfOf":{"type":"string","nullable":true,"description":"«En representación de»; nulo = en nombre propio. En `POST /registry` con sesión de entidad se IGNORA: es la entidad de la sesión"},"onBehalfOfNumber":{"type":"string","nullable":true,"description":"«Número de su falla» (1–5 cifras), para quien presenta SIN cuenta en nombre de una falla (ADR 0025). No se resuelve a ninguna entidad: la Junta lo comprueba. Con sesión de entidad se ignora"}},"required":["name","nationalId"]},"PrivateZoneItemDto":{"type":"object","properties":{"key":{"type":"string","enum":["summary","profile","entity","census","procedures","can_submit","exercise_start","awards","ffmm_request","ffmm_candidacies","messages","my_fallas","board_census","board_members"]},"path":{"type":"string"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"children":{"description":"Subentradas (las de «Trámites y servicios»)","type":"array","items":{"$ref":"#/components/schemas/PrivateZoneItemDto"}}},"required":["key","path","titleEs","titleVa","children"]},"ProcedureTypeDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"slug":{"type":"string"},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"descriptionEs":{"type":"string","nullable":true},"descriptionVa":{"type":"string","nullable":true},"kind":{"type":"string","enum":["online","pdf","document"],"deprecated":true,"description":"DERIVADO de `channel` (compatibilidad): `online` → online; `upload_signed` → pdf; el resto → document"},"channel":{"type":"string","enum":["online","upload_signed","in_person","by_email","via_contact","external"],"description":"Cómo se presenta: `online` (formulario), `upload_signed` (descargar, firmar y subir por el propio trámite), `in_person` (oficina), `by_email`, `via_contact` (Contactar) o `external` (otra administración)"},"channelNoteEs":{"type":"string","nullable":true,"description":"Dónde, cómo y horario (castellano)"},"channelNoteVa":{"type":"string","nullable":true},"hidden":{"type":"boolean"},"opensAt":{"type":"string","nullable":true},"closesAt":{"type":"string","nullable":true},"window":{"type":"string","enum":["always","open","not_yet","closed"],"description":"Plazo: sin plazo, abierto, aún no abierto o cerrado"},"windowNoteEs":{"type":"string","nullable":true},"windowNoteVa":{"type":"string","nullable":true},"documentId":{"type":"string","nullable":true,"description":"Impreso de la biblioteca (`GET /documents/{id}/file`)"},"hasForm":{"type":"boolean","description":"Tiene formulario publicado (se puede presentar en línea)"},"paymentPolicy":{"nullable":true,"description":"Pago con justificante; nulo = sin pago","type":"object","allOf":[{"$ref":"#/components/schemas/PaymentPolicyDto"}]},"responsibleDelegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true},"order":{"type":"number"},"actions":{"type":"array","description":"Botones para ESTA sesión (los calcula la API)","items":{"type":"string","enum":["view","download","do_online","sign_in","do_anonymous","edit"]}}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","slug","delegation","titleEs","titleVa","kind","channel","hidden","window","hasForm","order","actions"]},"ProcedureTypeListDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProcedureTypeDto"}}},"required":["items"]},"ProcedureTypeSheetDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"id":{"type":"string"},"slug":{"type":"string"},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"descriptionEs":{"type":"string","nullable":true},"descriptionVa":{"type":"string","nullable":true},"kind":{"type":"string","enum":["online","pdf","document"],"deprecated":true,"description":"DERIVADO de `channel` (compatibilidad): `online` → online; `upload_signed` → pdf; el resto → document"},"channel":{"type":"string","enum":["online","upload_signed","in_person","by_email","via_contact","external"],"description":"Cómo se presenta: `online` (formulario), `upload_signed` (descargar, firmar y subir por el propio trámite), `in_person` (oficina), `by_email`, `via_contact` (Contactar) o `external` (otra administración)"},"channelNoteEs":{"type":"string","nullable":true,"description":"Dónde, cómo y horario (castellano)"},"channelNoteVa":{"type":"string","nullable":true},"hidden":{"type":"boolean"},"opensAt":{"type":"string","nullable":true},"closesAt":{"type":"string","nullable":true},"window":{"type":"string","enum":["always","open","not_yet","closed"],"description":"Plazo: sin plazo, abierto, aún no abierto o cerrado"},"windowNoteEs":{"type":"string","nullable":true},"windowNoteVa":{"type":"string","nullable":true},"documentId":{"type":"string","nullable":true,"description":"Impreso de la biblioteca (`GET /documents/{id}/file`)"},"hasForm":{"type":"boolean","description":"Tiene formulario publicado (se puede presentar en línea)"},"paymentPolicy":{"nullable":true,"description":"Pago con justificante; nulo = sin pago","type":"object","allOf":[{"$ref":"#/components/schemas/PaymentPolicyDto"}]},"responsibleDelegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true},"order":{"type":"number"},"actions":{"type":"array","description":"Botones para ESTA sesión (los calcula la API)","items":{"type":"string","enum":["view","download","do_online","sign_in","do_anonymous","edit"]}},"whoEs":{"type":"string","nullable":true},"whoVa":{"type":"string","nullable":true},"howEs":{"type":"string","nullable":true},"howVa":{"type":"string","nullable":true},"requirementsEs":{"type":"string","nullable":true},"requirementsVa":{"type":"string","nullable":true},"regulationEs":{"type":"string","nullable":true},"regulationVa":{"type":"string","nullable":true},"attachmentsPolicy":{"$ref":"#/components/schemas/AttachmentsPolicyDto"},"form":{"nullable":true,"description":"El formulario que se presenta hoy (solo `online`)","type":"object","allOf":[{"$ref":"#/components/schemas/FormVersionDto"}]}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","id","slug","delegation","titleEs","titleVa","kind","channel","hidden","window","hasForm","order","actions","attachmentsPolicy"]},"ProfileDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"entity":{"$ref":"#/components/schemas/EntityRefDto"},"jcfCensusNumber":{"type":"string","nullable":true,"description":"«Num. Censo en JCF» de ESTA ficha"},"givenName":{"type":"string"},"familyName":{"type":"string"},"birthDate":{"type":"string","format":"date","nullable":true},"sex":{"type":"string","enum":["hombre","mujer"],"nullable":true},"idKind":{"type":"string","enum":["dni","menor","extranjero"]},"nationalId":{"type":"string","nullable":true},"reference":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"postalCode":{"type":"string","nullable":true},"phone1":{"type":"string","nullable":true},"phone2":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"exercise":{"type":"string","example":"2026-27","description":"Ejercicio de `entry`"},"entry":{"nullable":true,"description":"Entrada de la ficha en ese ejercicio (null = no está en ese censo)","type":"object","allOf":[{"$ref":"#/components/schemas/CensusRowDto"}]},"awards":{"$ref":"#/components/schemas/AwardsDto"},"history":{"description":"Historial de la PERSONA (todas sus fichas), en lectura, como hoy","type":"array","items":{"$ref":"#/components/schemas/HistoryRowDto"}},"historyNote":{"description":"Aviso de que el historial puede no ser completo","allOf":[{"$ref":"#/components/schemas/LocalizedNoteDto"}]},"personId":{"type":"string","format":"uuid","description":"Solo para la Junta (`person:read`): la persona global"}},"required":["id","entity","givenName","familyName","idKind","exercise","awards","history","historyNote"]},"PublicSubmissionConfigDto":{"type":"object","properties":{"status":{"type":"string","enum":["turnstile","quota_only"],"description":"`turnstile`: hay captcha y el ticket es obligatorio sin sesión. `quota_only`: sin Turnstile en el servidor; se presenta igual (ticket opcional, solo necesario para adjuntar) con la mitad de la cuota por IP, y lo presentado queda `verification: none`"},"siteKey":{"type":"string","nullable":true,"description":"Clave de sitio de Turnstile (pública) para el widget del navegador; nula en `quota_only`"},"ticketTtlSeconds":{"type":"number","description":"Validez del ticket, en segundos"},"quotaPerHour":{"type":"number","description":"Presentaciones sin sesión por IP y hora que admite este servidor (`PUBLIC_SUBMISSION_QUOTA_PER_HOUR`; la mitad en `quota_only`)"}},"required":["status","ticketTtlSeconds","quotaPerHour"]},"PublicTicketDto":{"type":"object","properties":{"ticket":{"type":"string","description":"Ticket para UNA presentación sin sesión y sus adjuntos (cabecera o campo `publicTicket`)"},"expiresAt":{"type":"string"},"verification":{"type":"string","enum":["turnstile","none"],"description":"Cómo se comprobó que hay una persona: con el captcha o solo con la cuota (ADR 0025)"}},"required":["ticket","expiresAt","verification"]},"PublicTicketRequestDto":{"type":"object","properties":{"turnstileToken":{"type":"string","description":"El token que da el widget de Turnstile en el navegador. Obligatorio con `status: turnstile`; en `quota_only` se ignora (el ticket lo da la cuota por IP y lleva `verification: none`)"}}},"PublicUploadDto":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"El fichero (por BYTES: PDF o JPG en el registro; PDF, JPG, PNG o MP3 en un trámite)"},"purpose":{"type":"string","enum":["registry","procedure"]},"publicTicket":{"type":"string","description":"El ticket de `POST /public-submission/ticket`"}},"required":["file","purpose","publicTicket"]},"ReadyDto":{"type":"object","properties":{"database":{"type":"string","enum":["ok","error"]},"valkey":{"type":"string","enum":["ok","error","not_configured"],"description":"`not_configured` si no hay VALKEY_URL (las cuotas van en memoria)"},"jobs":{"$ref":"#/components/schemas/JobsDto"}},"required":["database","valkey","jobs"]},"RegistryAttachmentDto":{"type":"object","properties":{"fileId":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"size":{"type":"number"},"type":{"type":"string"}},"required":["fileId","description","name","size","type"]},"RegistryAttachmentInputDto":{"type":"object","properties":{"fileId":{"type":"string","description":"Fichero subido con `POST /files` (purpose `registry`: PDF o JPG)"},"description":{"type":"string","description":"«Describa el documento»"}},"required":["fileId","description"]},"RegistryContactDto":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string","description":"En `POST /registry` con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)"}},"required":["phone","email"]},"RegistryCreatedDto":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"string","example":"2026/000123"},"registeredAt":{"type":"string"},"channel":{"type":"string","enum":["telematic","in_person"]},"subject":{"type":"string"},"kind":{"type":"string","enum":["documents_only","request"]},"presenter":{"$ref":"#/components/schemas/PresenterDto"},"contact":{"$ref":"#/components/schemas/RegistryContactDto"},"notification":{"$ref":"#/components/schemas/NotificationAddressDto"},"expose":{"type":"string","nullable":true},"request":{"type":"string","nullable":true},"entityId":{"type":"string","nullable":true},"entityName":{"type":"string","nullable":true},"authenticated":{"type":"boolean","description":"ADR 0025: falso = presentado SIN cuenta ni credencial (datos del presentador y de la entidad sin verificar: la Junta los comprueba). El alta presencial cuenta como autenticada (la hace la Junta)"},"verification":{"type":"string","enum":["turnstile","none"],"nullable":true,"description":"Solo sin autenticar: `turnstile` (pasó el captcha) o `none` (solo la cuota por IP)"},"procedureId":{"type":"string","nullable":true,"description":"Expediente ligado (spec 14)"},"procedure":{"nullable":true,"description":"ADR 0028: el trámite del asiento con su estado; nulo = instancia general","type":"object","allOf":[{"$ref":"#/components/schemas/RegistryProcedureRefDto"}]},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/RegistryAttachmentDto"}},"receiptFileId":{"type":"string","nullable":true},"receiptStatus":{"type":"string","enum":["pending","ok","not_configured","failed"],"description":"Justificante PDF: `not_configured` = no hay Chromium en el servidor"},"status":{"type":"string","enum":["received","classified","closed"]},"assignedDelegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"],"nullable":true},"note":{"type":"string","nullable":true,"description":"Solo en Gestión JCF"},"closedAt":{"type":"string","nullable":true},"ackMail":{"type":"string","enum":["sent","logged","failed","pending"],"description":"Acuse por correo al presentador; `pending` = el justificante y el acuse siguen en segundo plano (la respuesta no espera a Chromium ni al correo)"}},"required":["id","number","registeredAt","channel","subject","kind","presenter","contact","notification","authenticated","attachments","receiptStatus","status","ackMail"]},"RegistryProcedureRefDto":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["borrador","presentado","en_revision","subsanacion","aceptado","rechazado","archivado"]},"typeSlug":{"type":"string"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"delegation":{"type":"string","enum":["cultura_solidaridad","deportes","festejos","infantiles_juventud","juveniles","relaciones_publicas_protocolo","incidencias","fallas","pirotecnia","censos","recompensas","medios_comunicacion","secretaria","juntas_locales"]}},"required":["id","status","typeSlug","titleEs","titleVa","delegation"]},"SearchGroupDto":{"type":"object","properties":{"type":{"type":"string","enum":["section","procedure_type","procedure","person","thread","entity","registry_entry","document","page","communication","event"]},"total":{"type":"number","description":"Resultados de este tipo en total (hasta 500 entre todos)"},"items":{"description":"Los primeros `perGroup`; el resto, con `types=<tipo>`","type":"array","items":{"$ref":"#/components/schemas/SearchResultDto"}}},"required":["type","total","items"]},"SearchPageDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SearchResultDto"}},"nextCursor":{"type":"string","nullable":true},"total":{"type":"number","description":"Resultados en total (hasta 500)"},"groups":{"description":"Los mismos resultados agrupados por tipo; los grupos van por su mejor puntuación","type":"array","items":{"$ref":"#/components/schemas/SearchGroupDto"}},"scope":{"type":"string","enum":["anonymous","entity","junta"],"description":"Como quién se ha buscado: sin sesión (solo lo público), una entidad (además su Zona Privada y lo suyo) o la Junta (además Gestión)"}},"required":["items","total","groups","scope"]},"SearchResultDto":{"type":"object","properties":{"audience":{"$ref":"#/components/schemas/AudienceDto"},"audienceLabelEs":{"type":"string","description":"La frase de la ficha en castellano («Para: comisiones de València del sector X»)"},"audienceLabelVa":{"type":"string","description":"La frase en valenciano"},"allowed":{"type":"boolean","description":"La sesión (o la credencial) puede abrirlo o presentarlo"},"reason":{"type":"string","enum":["anonymous","not_for_entity","closed","census_not_empty"],"nullable":true,"description":"`anonymous` accede; `not_for_entity` no es para tu entidad; `closed` fuera de plazo"},"type":{"type":"string","enum":["section","procedure_type","procedure","person","thread","entity","registry_entry","document","page","communication","event"]},"id":{"type":"string"},"path":{"type":"string","description":"Ruta en la web de las fallas"},"title":{"type":"string","description":"Título en el idioma pedido"},"titleEs":{"type":"string"},"titleVa":{"type":"string"},"snippet":{"type":"string","nullable":true,"description":"Fragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)"},"date":{"type":"string","nullable":true,"description":"Fecha relevante (publicación, envío, inicio del acto, cierre del plazo)"},"zone":{"type":"string","enum":["public","private","gestion"],"description":"`public` zona pública; `private` Zona Privada de la entidad de la sesión; `gestion` Gestión JCF (la ruta empieza por `/gestion`)"},"isAction":{"type":"boolean","description":"Sección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar"},"subtitle":{"type":"string","nullable":true,"description":"Dato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más"},"opensAt":{"type":"string","nullable":true,"description":"Trámite: apertura del plazo"},"closesAt":{"type":"string","nullable":true,"description":"Trámite: cierre del plazo"},"match":{"type":"string","enum":["exact","prefix","title","synonym","body"],"description":"Cómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo"},"score":{"type":"number","description":"Puntuación (mayor = antes); la regla es `rankHit` de @jcf/shared"}},"required":["audience","audienceLabelEs","audienceLabelVa","allowed","type","id","path","title","titleEs","titleVa","zone","isAction","match","score"]}}}}