La mateixa API que usen les webs, oberta a les aplicacions de les comissions amb la seua clau i als assistents d'IA. Esta referència es genera de l'OpenAPI que publica la mateixa API: el que veus és el que hi ha.
Totes les rutes pengen d'esta adreça. És la de la Secretaria que estàs mirant, la mateixa que anuncia l'OpenAPI en servers.
https://test-jcf.alejandrofan2.devEl document complet, per a generar el teu client (openapi-typescript, openapi-generator…) o importar-lo en la teua ferramenta. Swagger UI amb el mateix document, servit per l'API.
La zona pública (estat del servici, impresos i documents, agenda i comunicacions) es consulta sense res.
Per a una aplicació de la teua comissió (un servidor, no un navegador). La crea qui té el compte de la falla amb la seua sessió (POST /api/v1/api-keys). Es mostra una vegada: guarda-la com una contrasenya. Sols arriba a la teua entitat i sols al que marques; les escriptures, únicament si la Junta les ha obertes.
Un assistent d'IA no porta la teua clau: et demana permís. El connectes a l'adreça MCP i, la primera vegada, entres amb el teu compte i autoritzes el que podrà consultar.
Authorization: Bearer <la teua clau> en cada petició. JSON en les dos direccions; dates ISO 8601 en UTC. Cada resposta porta X-Request-Id: dona'l si ens escrius per un problema.
Sempre amb la mateixa forma: { code, message, details?, requestId }. Decidix per code, no per message. 401 sense credencial o amb una que no val; 403 si la credencial no té eixe abast; 404 també per al que és d'una altra entitat (no es revela que existix); 422 amb details per camp (un JSON mal format també és 422: esta API no retorna 400); 429 amb Retry-After (600 peticions per minut per clau).
Per cursor: ?limit= (50 per defecte, 200 com a molt) i ?cursor= amb el nextCursor de la resposta anterior. nextCursor: null = no n'hi ha més.
Copia i apega: són peticions de veritat contra esta Secretaria.
curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents?limit=5'curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents?limit=1000'curl 'https://test-jcf.alejandrofan2.dev/api/v1/pages/no-existe'curl -i -H 'Authorization: Bearer clave-que-no-vale' 'https://test-jcf.alejandrofan2.dev/api/v1/entities/me'curl -H "Authorization: Bearer $SV_API_KEY" 'https://test-jcf.alejandrofan2.dev/api/v1/entities/me'import { createApiClient, unwrap, ApiError } from '@jcf/api-client';
const api = createApiClient({ baseUrl: 'https://test-jcf.alejandrofan2.dev', headers: { Authorization: `Bearer ${process.env.SV_API_KEY}` } });
const me = await unwrap(api.GET('/api/v1/entities/me'));
const page = await unwrap(api.GET('/api/v1/entities/{id}/census', { params: { path: { id: me.id }, query: { filter: 'adults', limit: 50 } } }));
try {
await unwrap(api.GET('/api/v1/entities/{id}', { params: { path: { id: 'otra-entidad' } } }));
} catch (e) {
if (e instanceof ApiError && e.code === 'not_found') { /* 404 */ }
}
// Fora del monorepo: genera els teus tipus amb npx openapi-typescript https://test-jcf.alejandrofan2.dev/openapi.jsonCada operació amb la seua autenticació, els seus paràmetres, el cos que espera i totes les seues respostes amb el model desplegat. 39 operacions · OpenAPI 3.0.0 · v0.1.0
/api/v1/healthSense credencialHealthDtoEl proceso responde (no mira dependencias)statusstringobligatoriValors:"ok"
versionstringobligatoritimestring (date-time)obligatori{
"status": "ok",
"version": "texto",
"time": "2026-10-06T10:00:00.000Z"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/health'/api/v1/readySense credencialReadyDtoBase de datos y Valkey comprobados ahora mismodatabasestringobligatoriValors:"ok""error"
valkeystringobligatorinot_configured si no hay VALKEY_URL (las cuotas van en memoria)
Valors:"ok""error""not_configured"
backendstringobligatoriDó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
Valors:"memory"
queuednumberobligatorirunningnumberobligatoricapacitynumberobligatoriTope de la cola
{
"database": "ok",
"valkey": "ok",
"jobs": {
"backend": "memory",
"queued": 0,
"running": 0,
"capacity": 0
}
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoLa base no responde, o Valkey está configurado y no respondeModel: ErrorBodyDto
{
"code": "unavailable",
"message": "No disponible ahora mismo",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/ready'/api/v1/exercisesEjercicios, del más reciente al más antiguoRequerix compte o clau d'APICon su fase y las operaciones del censo que permite.
exercise:readsv_session · apiKey · oauth2ExerciseDto[]idstring (uuid)obligatorilabelstringobligatoriExemple: "2026-27"
opensAtstring (date-time)obligatoriclosesAtstring (date-time) | nullopcionalisCurrentbooleanobligatoriphasestringobligatoriValors:"planned""open""census_closed""constitution""closed"
allowedOperations"census.register" | "census.leave" | "census.office" | "census.edit"[]obligatoriOperaciones del censo que la fase permite (ADR 0013); la web solo esconde botones
Valors:"census.register""census.leave""census.office""census.edit"
categoryCutoffstring (date)obligatoriFecha de corte para la categoría (14 años cumplidos a San José, configurable)
adultAgenumberobligatoriAños cumplidos a la fecha de corte para pasar a mayores en este ejercicio (ADR 0018)
sheetsDeadlinestring (date-time) | nullopcionalFecha límite de entrega de las Hojas de Constitución (spec 16; informativa)
requiredOffices"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"[]obligatoriCargos obligatorios de la comprobación de censos (spec 16)
Valors:"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"
[
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"label": "2026-27",
"opensAt": "2026-10-06T10:00:00.000Z",
"closesAt": "2026-10-06T10:00:00.000Z",
"isCurrent": true,
"phase": "planned",
"allowedOperations": [
"census.register"
],
"categoryCutoff": "2026-10-06",
"adultAge": 0,
"sheetsDeadline": "2026-10-06T10:00:00.000Z",
"requiredOffices": [
"presidente"
]
}
]ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/exercises' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/exercises/currentEjercicio en cursoRequerix compte o clau d'APIexercise:readsv_session · apiKey · oauth2ExerciseDtoidstring (uuid)obligatorilabelstringobligatoriExemple: "2026-27"
opensAtstring (date-time)obligatoriclosesAtstring (date-time) | nullopcionalisCurrentbooleanobligatoriphasestringobligatoriValors:"planned""open""census_closed""constitution""closed"
allowedOperations"census.register" | "census.leave" | "census.office" | "census.edit"[]obligatoriOperaciones del censo que la fase permite (ADR 0013); la web solo esconde botones
Valors:"census.register""census.leave""census.office""census.edit"
categoryCutoffstring (date)obligatoriFecha de corte para la categoría (14 años cumplidos a San José, configurable)
adultAgenumberobligatoriAños cumplidos a la fecha de corte para pasar a mayores en este ejercicio (ADR 0018)
sheetsDeadlinestring (date-time) | nullopcionalFecha límite de entrega de las Hojas de Constitución (spec 16; informativa)
requiredOffices"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"[]obligatoriCargos obligatorios de la comprobación de censos (spec 16)
Valors:"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"
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"label": "2026-27",
"opensAt": "2026-10-06T10:00:00.000Z",
"closesAt": "2026-10-06T10:00:00.000Z",
"isCurrent": true,
"phase": "planned",
"allowedOperations": [
"census.register"
],
"categoryCutoff": "2026-10-06",
"adultAge": 0,
"sheetsDeadline": "2026-10-06T10:00:00.000Z",
"requiredOffices": [
"presidente"
]
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/exercises/current' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/meLa entidad activa de la sesión (Mi Falla)Requerix compte o clau d'APIentity:readsv_session · apiKey · oauth2EntityDtoidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorihasCensusbooleanobligatoriTiene censo propio (comisiones y fallas de municipio)
awardsEligiblebooleanobligatoriPuede pedir recompensas
hasFallasbooleanobligatoriTiene fallas a su cargo (juntas locales y agrupaciones)
privateHomestringobligatoriSu Zona Privada en la web de las fallas
Valors:"panel""mis-fallas"
legacyCodestring | nullopcionalCódigo del sistema viejo (fal35303)
sectorstring | nullopcionaltaxIdstring | nullopcionalNIF de la entidad (solo lo cambia la Junta)
addressstring | nullopcionalcitystring | nullopcionalpostalCodestring | nullopcionalphonestring | nullopcionalTeléfono del casal, solo dígitos
publicEmailstring | nullopcionalCorreo público (directorios de JCF)
localBoardEntityRefDto | nullopcionalJunta local de la que cuelga
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorigroupingEntityRefDto | nullopcionalAgrupación a la que pertenece
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorieditableFields"address" | "city" | "postalCode" | "phone" | "publicEmail" | "name" | "officialNumber" | "sector" | "taxId" | "localBoardId" | "groupingId"[]obligatoriCampos que ESTA cuenta puede cambiar (la API decide; la web solo pinta)
Valors:"address""city""postalCode""phone""publicEmail""name""officialNumber""sector""taxId""localBoardId""groupingId"
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto",
"capabilities": {
"hasCensus": true,
"awardsEligible": true,
"hasFallas": true,
"privateHome": "panel"
},
"legacyCode": "texto",
"sector": "texto",
"taxId": "texto",
"address": "texto",
"city": "texto",
"postalCode": "texto",
"phone": "texto",
"publicEmail": "texto",
"localBoard": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"grouping": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"editableFields": [
"address"
]
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/me' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}Ficha de una entidadRequerix compte o clau d'APIeditableFields dice qué puede cambiar esta cuenta.
entity:readsv_session · apiKey · oauth2idstringcamíobligatoriEntityDtoidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorihasCensusbooleanobligatoriTiene censo propio (comisiones y fallas de municipio)
awardsEligiblebooleanobligatoriPuede pedir recompensas
hasFallasbooleanobligatoriTiene fallas a su cargo (juntas locales y agrupaciones)
privateHomestringobligatoriSu Zona Privada en la web de las fallas
Valors:"panel""mis-fallas"
legacyCodestring | nullopcionalCódigo del sistema viejo (fal35303)
sectorstring | nullopcionaltaxIdstring | nullopcionalNIF de la entidad (solo lo cambia la Junta)
addressstring | nullopcionalcitystring | nullopcionalpostalCodestring | nullopcionalphonestring | nullopcionalTeléfono del casal, solo dígitos
publicEmailstring | nullopcionalCorreo público (directorios de JCF)
localBoardEntityRefDto | nullopcionalJunta local de la que cuelga
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorigroupingEntityRefDto | nullopcionalAgrupación a la que pertenece
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorieditableFields"address" | "city" | "postalCode" | "phone" | "publicEmail" | "name" | "officialNumber" | "sector" | "taxId" | "localBoardId" | "groupingId"[]obligatoriCampos que ESTA cuenta puede cambiar (la API decide; la web solo pinta)
Valors:"address""city""postalCode""phone""publicEmail""name""officialNumber""sector""taxId""localBoardId""groupingId"
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto",
"capabilities": {
"hasCensus": true,
"awardsEligible": true,
"hasFallas": true,
"privateHome": "panel"
},
"legacyCode": "texto",
"sector": "texto",
"taxId": "texto",
"address": "texto",
"city": "texto",
"postalCode": "texto",
"phone": "texto",
"publicEmail": "texto",
"localBoard": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"grouping": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"editableFields": [
"address"
]
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/profiles/{id}Ficha de una persona en la entidadRequerix compte o clau d'APIFicha + entrada del ejercicio + recompensas + historial de la persona en lectura (puede no ser completo). Una ficha de otra comisión es 404.
profile:readsv_session · apiKey · oauth2idstringcamíobligatoriexercisestringconsultaopcionalId o etiqueta del ejercicio de la entrada; por defecto, el en curso
ProfileDtoidstring (uuid)obligatoriidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorijcfCensusNumberstring | nullopcional«Num. Censo en JCF» de ESTA ficha
givenNamestringobligatorifamilyNamestringobligatoribirthDatestring (date) | nullopcionalsexstring | nullopcionalValors:"hombre""mujer"
idKindstringobligatoriValors:"dni""menor""extranjero"
nationalIdstring | nullopcionalreferencestring | nullopcionaladdressstring | nullopcionalcitystring | nullopcionalpostalCodestring | nullopcionalphone1string | nullopcionalphone2string | nullopcionalemailstring | nullopcionalexercisestringobligatoriEjercicio de entry
Exemple: "2026-27"
entryCensusRowDto | nullopcionalEntrada de la ficha en ese ejercicio (null = no está en ese censo)
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionaldistintiuArgentnumber | nullopcionaldistintiuOrnumber | nullopcionalbunyolArgentnumber | nullopcionalbunyolOrnumber | nullopcionalbunyolFullesnumber | nullopcionalbunyolBrillantsnumber | nullopcionalHistorial de la PERSONA (todas sus fichas), en lectura, como hoy
exercisestringobligatoriExemple: "2025-26"
entityOfficialNumberstringobligatoriNúmero oficial de la falla
entityNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalofficestring | nullopcionalValors:"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"
leftAtstring (date-time) | nullopcionalhistoryNoteLocalizedNoteDtoobligatoriAviso de que el historial puede no ser completo
esstringobligatorivastringobligatoripersonIdstring (uuid)opcionalSolo para la Junta (person:read): la persona global
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"jcfCensusNumber": "texto",
"givenName": "texto",
"familyName": "texto",
"birthDate": "2026-10-06",
"sex": "hombre",
"idKind": "dni",
"nationalId": "texto",
"reference": "texto",
"address": "texto",
"city": "texto",
"postalCode": "texto",
"phone1": "texto",
"phone2": "texto",
"email": "texto",
"exercise": "2026-27",
"entry": {
"entryId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"profileId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"censusNumber": 0,
"givenName": "texto",
"familyName": "texto",
"category": "infantil",
"office": "presidente",
"joinedAt": "2026-10-06T10:00:00.000Z",
"leftAt": "2026-10-06T10:00:00.000Z",
"leaveReason": "voluntaria",
"leaveNote": "texto"
},
"awards": {
"distintiuArgent": 0,
"distintiuOr": 0,
"bunyolArgent": 0,
"bunyolOr": 0,
"bunyolFulles": 0,
"bunyolBrillants": 0
},
"history": [
{
"exercise": "2025-26",
"entityOfficialNumber": "texto",
"entityName": "texto",
"category": "infantil",
"censusNumber": 0,
"office": "presidente",
"leftAt": "2026-10-06T10:00:00.000Z"
}
],
"historyNote": {
"es": "texto",
"va": "texto"
},
"personId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campoDesconocido": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/profiles/<id>' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/censusCenso de la entidad en un ejercicioRequerix compte o clau d'APIFiltros 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.
census:readsv_session · apiKey · oauth2idstringcamíobligatoricursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50exercisestringconsultaopcionalId o etiqueta del ejercicio («2026-27»); por defecto, el en curso
filter"adults" | "children" | "all" | "left" | "everyone"consultaopcional= "all"adults = mayores activos · children = infantiles activos · all = todos activos · left = solo bajas · everyone = todos
qstringconsultaopcionalNombre o apellidos (todas las palabras), o nº de censo en falla
CensusPageDtoexercisestringobligatoriExemple: "2026-27"
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalnextCursorstring | nullopcional{
"exercise": "2026-27",
"items": [
{
"entryId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"profileId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"censusNumber": 0,
"givenName": "texto",
"familyName": "texto",
"category": "infantil",
"office": "presidente",
"joinedAt": "2026-10-06T10:00:00.000Z",
"leftAt": "2026-10-06T10:00:00.000Z",
"leaveReason": "voluntaria",
"leaveNote": "texto"
}
],
"nextCursor": "texto"
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/census' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/officesCargo → ocupante actualRequerix compte o clau d'APITodos los cargos menos vocal, en orden de rango, con sus ocupantes activos (vacío = sin cubrir).
census:readsv_session · apiKey · oauth2idstringcamíobligatoriexercisestringconsultaopcionalId o etiqueta del ejercicio de la entrada; por defecto, el en curso
OfficesDtoexercisestringobligatoriExemple: "2026-27"
Todos los cargos menos vocal, en el orden de OFFICE_RANK
officestringobligatoriValors:"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"
uniquebooleanobligatoriCargo único (desplaza al anterior)
Ocupantes activos en el ejercicio (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalvocalCountnumberobligatoriPersonas activas con cargo vocal
{
"exercise": "2026-27",
"offices": [
{
"office": "presidente",
"unique": true,
"holders": [
{
"profileId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"givenName": "texto",
"familyName": "texto",
"category": "infantil",
"censusNumber": 0
}
]
}
],
"vocalCount": 0
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campoDesconocido": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/offices' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/files/{id}Descargar un ficheroMés amb credencialComprueba el nivel y el permiso en cada descarga; nunca una URL pública.
Amb credencial, a més: 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.
idstringcamíobligatoristring (binary)Los bytesstring (binary)
"<fichero>"ErrorBodyDtounauthorized: el contenido es de nivel members y no hay sesiónModel: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/files/<id>'/api/v1/pagesPáginas de contenido (lista y búsqueda)Més amb credencialLas 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.
Amb credencial, a més: 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`.
parentstringconsultaopcionalSolo las hijas de esta página (p. ej. ayuda: el centro de ayuda)
qstringconsultaopcionalBusca en título y cuerpo, en castellano y valenciano (sin distinguir mayúsculas)
PageListDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoripathstringobligatoriRuta en la web de las fallas
kindstringobligatoriValors:"content""link"
titleEsstringobligatorititleVastringobligatoribodyEsstringobligatoriMarkdown; vacío si la página está cerrada (locked)
bodyVastringobligatorihiddenbooleanobligatoriNo se lista (se abre por enlace directo si la audiencia lo permite)
lockedbooleanobligatori= !allowed: se enseña el título y el motivo, sin cuerpo
menustring | nullopcionalparentSlugstring | nullopcionalordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"slug": "texto",
"path": "texto",
"kind": "content",
"titleEs": "texto",
"titleVa": "texto",
"bodyEs": "texto",
"bodyVa": "texto",
"hidden": true,
"locked": true,
"menu": "texto",
"parentSlug": "texto",
"order": 0,
"publishedAt": "texto",
"updatedAt": "texto",
"actions": [
"view"
]
}
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campoDesconocido": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/pages'/api/v1/pages/{slug}Página de contenidoMés amb credencialMarkdown en castellano y valenciano. Una página que la sesión no puede ver llega con locked: true, su motivo y sin cuerpo.
Amb credencial, a més: 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`.
slugstringcamíobligatoriPageDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoripathstringobligatoriRuta en la web de las fallas
kindstringobligatoriValors:"content""link"
titleEsstringobligatorititleVastringobligatoribodyEsstringobligatoriMarkdown; vacío si la página está cerrada (locked)
bodyVastringobligatorihiddenbooleanobligatoriNo se lista (se abre por enlace directo si la audiencia lo permite)
lockedbooleanobligatori= !allowed: se enseña el título y el motivo, sin cuerpo
menustring | nullopcionalparentSlugstring | nullopcionalordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
{
"audience": {
"mode": "public",
"rules": [
{
"kinds": [],
"sectors": [],
"localBoards": [],
"groupings": [],
"entities": [],
"cities": [],
"categories": []
}
]
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"slug": "texto",
"path": "texto",
"kind": "content",
"titleEs": "texto",
"titleVa": "texto",
"bodyEs": "texto",
"bodyVa": "texto",
"hidden": true,
"locked": true,
"menu": "texto",
"parentSlug": "texto",
"order": 0,
"publishedAt": "texto",
"updatedAt": "texto",
"actions": [
"view"
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/pages/<slug>'/api/v1/documentsBiblioteca de documentosMés amb credencialImpresos, documentación y normativa, por sección, delegación o subpágina; búsqueda por título; paginación por cursor.
Amb credencial, a més: 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`.
cursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50category"impresos_jcf" | "agrupaciones" | "juntas_locales" | "ayuntamiento" | "jornadas" | "privacidad" | "rgcre" | "petardos" | "normativa" | "otros"consultaopcionaldelegation"cultura_solidaridad" | "deportes" | "festejos" | "infantiles_juventud" | "juveniles" | "relaciones_publicas_protocolo" | "incidencias" | "fallas" | "pirotecnia" | "censos" | "recompensas" | "medios_comunicacion" | "secretaria" | "juntas_locales"consultaopcionalpagestringconsultaopcionalSolo los de esta subpágina
qstringconsultaopcionalBusca en el título (castellano y valenciano)
kind"pdf" | "pdf_r" | "excel" | "word" | "zip" | "otro"consultaopcionalFormato (PDF, PDF rellenable, Excel…)
sectionstringconsultaopcionalSección dentro de la subpágina (el rótulo en castellano, p. ej. Censos)
downloadable"true"consultaopcionalSolo los que quien mira puede descargar ya (hay fichero y su nivel está abierto)
DocumentPageDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoricategorystringobligatoriValors:"impresos_jcf""agrupaciones""juntas_locales""ayuntamiento""jornadas""privacidad""rgcre""petardos""normativa""otros"
pageSlugstring | nullopcionaldelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
sectionEsstring | nullopcionalsectionVastring | nullopcionalhiddenbooleanobligatorikindstringobligatoriValors:"pdf""pdf_r""excel""word""zip""otro"
hasFilebooleanobligatoriHay fichero descargable
fileIdstring | nullopcionalSolo en Gestión JCF (/gestion/documents): para descargar por /files/{id} cualquier audiencia
pendingFilebooleanobligatoriSembrado desde el inventario sin el fichero real: la Junta lo sube
lockedbooleanobligatori= !allowed
ordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
nextCursorstring | nullopcional{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"titleEs": "texto",
"titleVa": "texto",
"category": "impresos_jcf",
"pageSlug": "texto",
"delegation": "cultura_solidaridad",
"sectionEs": "texto",
"sectionVa": "texto",
"hidden": true,
"kind": "pdf",
"hasFile": true,
"fileId": "texto",
"pendingFile": true,
"locked": true,
"order": 0,
"publishedAt": "texto",
"updatedAt": "texto",
"actions": [
"view"
]
}
],
"nextCursor": "texto"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents'/api/v1/documents/facetsFacetas de la bibliotecaMés amb credencialLos 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.
Amb credencial, a més: 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`.
cursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50category"impresos_jcf" | "agrupaciones" | "juntas_locales" | "ayuntamiento" | "jornadas" | "privacidad" | "rgcre" | "petardos" | "normativa" | "otros"consultaopcionaldelegation"cultura_solidaridad" | "deportes" | "festejos" | "infantiles_juventud" | "juveniles" | "relaciones_publicas_protocolo" | "incidencias" | "fallas" | "pirotecnia" | "censos" | "recompensas" | "medios_comunicacion" | "secretaria" | "juntas_locales"consultaopcionalpagestringconsultaopcionalSolo los de esta subpágina
qstringconsultaopcionalBusca en el título (castellano y valenciano)
kind"pdf" | "pdf_r" | "excel" | "word" | "zip" | "otro"consultaopcionalFormato (PDF, PDF rellenable, Excel…)
sectionstringconsultaopcionalSección dentro de la subpágina (el rótulo en castellano, p. ej. Censos)
downloadable"true"consultaopcionalSolo los que quien mira puede descargar ya (hay fichero y su nivel está abierto)
DocumentFacetsDtototalnumberobligatoriCuántos casan con TODOS los filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
downloadablenumberobligatoriCuántos se pueden descargar ya con los demás filtros
{
"total": 0,
"categories": [
{
"value": "texto",
"labelVa": "texto",
"count": 0
}
],
"delegations": [
{
"value": "texto",
"labelVa": "texto",
"count": 0
}
],
"kinds": [
{
"value": "texto",
"labelVa": "texto",
"count": 0
}
],
"sections": [
{
"value": "texto",
"labelVa": "texto",
"count": 0
}
],
"downloadable": 0
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents/facets'/api/v1/documents/{id}Un documentoMés amb credencialUn documento que la sesión no puede abrir NO da 404: llega cerrado (locked) con su audiencia y su motivo.
Amb credencial, a més: 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`.
idstringcamíobligatoriDocumentDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoricategorystringobligatoriValors:"impresos_jcf""agrupaciones""juntas_locales""ayuntamiento""jornadas""privacidad""rgcre""petardos""normativa""otros"
pageSlugstring | nullopcionaldelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
sectionEsstring | nullopcionalsectionVastring | nullopcionalhiddenbooleanobligatorikindstringobligatoriValors:"pdf""pdf_r""excel""word""zip""otro"
hasFilebooleanobligatoriHay fichero descargable
fileIdstring | nullopcionalSolo en Gestión JCF (/gestion/documents): para descargar por /files/{id} cualquier audiencia
pendingFilebooleanobligatoriSembrado desde el inventario sin el fichero real: la Junta lo sube
lockedbooleanobligatori= !allowed
ordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
{
"audience": {
"mode": "public",
"rules": [
{
"kinds": [],
"sectors": [],
"localBoards": [],
"groupings": [],
"entities": [],
"cities": [],
"categories": []
}
]
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"titleEs": "texto",
"titleVa": "texto",
"category": "impresos_jcf",
"pageSlug": "texto",
"delegation": "cultura_solidaridad",
"sectionEs": "texto",
"sectionVa": "texto",
"hidden": true,
"kind": "pdf",
"hasFile": true,
"fileId": "texto",
"pendingFile": true,
"locked": true,
"order": 0,
"publishedAt": "texto",
"updatedAt": "texto",
"actions": [
"view"
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents/<id>'/api/v1/documents/{id}/fileDescargar un documentoMés amb credencialComprueba la audiencia en cada descarga; nunca una URL pública.
Amb credencial, a més: Audiencia no pública sin sesión → 401; con sesión y no es para su entidad → 403; si no, los bytes.
idstringcamíobligatoristring (binary)Los bytesstring (binary)
"<fichero>"ErrorBodyDtounauthorized: el contenido es de nivel members y no hay sesiónModel: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/documents/<id>/file'/api/v1/eventsAgendaMés amb credencialActos de la Junta y de FFMM entre from y to (por defecto, de hoy a un año).
Amb credencial, a més: Todo menos lo `staff` y lo `hidden`; lo que la sesión no puede ver sale sin descripción y con su motivo.
fromstringconsultaopcionalDesde (ISO); por defecto, hoy
tostringconsultaopcionalHasta (ISO); por defecto, un año después de from
kind"junta" | "ffmm" | "otro"consultaopcionalEventListDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionalNula si la audiencia no lo deja ver
descriptionVastring | nullopcionalstartsAtstringobligatoriendsAtstring | nullopcionalplacestring | nullopcionalkindstringobligatoriValors:"junta""ffmm""otro"
hiddenbooleanobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"titleEs": "texto",
"titleVa": "texto",
"descriptionEs": "texto",
"descriptionVa": "texto",
"startsAt": "texto",
"endsAt": "texto",
"place": "texto",
"kind": "junta",
"hidden": true,
"actions": [
"view"
]
}
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"kind": [
"isIn"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/events'/api/v1/communicationsCorreos enviadosMés amb credencialPor categoría y búsqueda en el título; lo más reciente primero; paginación por cursor.
Amb credencial, a més: 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.
cursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50category"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"consultaopcionalqstringconsultaopcionalBusca en el título
downloadable"true"consultaopcionalSolo las que quien mira puede descargar ya (hay fichero y su nivel está abierto)
CommunicationPageDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatoricategorystringobligatoriValors:"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"
titleEsstringobligatorititleVastringobligatoribodyEsstring | nullopcionalNulo si está cerrada (locked)
bodyVastring | nullopcionalhiddenbooleanobligatorihasFilebooleanobligatoripendingFilebooleanobligatorilockedbooleanobligatori= !allowed
sentAtstring | nullopcionalreadbooleanobligatoriLa cuenta de la sesión ya la ha abierto o descargado
actions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
nextCursorstring | nullopcional{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"category": "actas_asambleas_presidentes",
"titleEs": "texto",
"titleVa": "texto",
"bodyEs": "texto",
"bodyVa": "texto",
"hidden": true,
"hasFile": true,
"pendingFile": true,
"locked": true,
"sentAt": "texto",
"read": true,
"actions": [
"view"
]
}
],
"nextCursor": "texto"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/communications'/api/v1/communications/facetsFacetas de «Correos enviados»Més amb credencialCategorí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.
Amb credencial, a més: 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.
cursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50category"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"consultaopcionalqstringconsultaopcionalBusca en el título
downloadable"true"consultaopcionalSolo las que quien mira puede descargar ya (hay fichero y su nivel está abierto)
CommunicationFacetsDtototalnumberobligatoriCuántas casan con TODOS los filtros
Categorías con cuántas casan contando los demás filtros
valuestringobligatoriValors:"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"
countnumberobligatoridownloadablenumberobligatoriCuántas se pueden descargar ya con los demás filtros
{
"total": 0,
"categories": [
{
"value": "actas_asambleas_presidentes",
"count": 0
}
],
"downloadable": 0
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/communications/facets'/api/v1/communications/{id}Una comunicaciónMés amb credencialAmb credencial, a més: 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.
idstringcamíobligatoriCommunicationDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatoricategorystringobligatoriValors:"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"
titleEsstringobligatorititleVastringobligatoribodyEsstring | nullopcionalNulo si está cerrada (locked)
bodyVastring | nullopcionalhiddenbooleanobligatorihasFilebooleanobligatoripendingFilebooleanobligatorilockedbooleanobligatori= !allowed
sentAtstring | nullopcionalreadbooleanobligatoriLa cuenta de la sesión ya la ha abierto o descargado
actions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
{
"audience": {
"mode": "public",
"rules": [
{
"kinds": [],
"sectors": [],
"localBoards": [],
"groupings": [],
"entities": [],
"cities": [],
"categories": []
}
]
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"category": "actas_asambleas_presidentes",
"titleEs": "texto",
"titleVa": "texto",
"bodyEs": "texto",
"bodyVa": "texto",
"hidden": true,
"hasFile": true,
"pendingFile": true,
"locked": true,
"sentAt": "texto",
"read": true,
"actions": [
"view"
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/communications/<id>'/api/v1/communications/{id}/fileDescargar el documento de una comunicaciónMés amb credencialAmb credencial, a més: Audiencia no pública sin sesión → 401; no es para su entidad → 403; si no, los bytes (y la lectura queda apuntada).
idstringcamíobligatoristring (binary)Los bytesstring (binary)
"<fichero>"ErrorBodyDtounauthorized: el contenido es de nivel members y no hay sesiónModel: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/communications/<id>/file'/api/v1/contact/destinationsDestinos de «Contactar»Sense credencialLas delegaciones de hoy; configured dice si el destino tiene correo propio.
ContactDestinationListDtoidstringobligatorislugstringobligatorinameEsstringobligatorinameVastringobligatoriconfiguredbooleanobligatoriTiene correo configurado: si no, el mensaje se guarda y va al buzón general (o queda not_configured)
emailstring | nullopcionalCorreo público del destino (como la ficha de hoy); nulo si la Junta no lo ha puesto
phonestring | nullopcionalTeléfono público; nulo si la Junta no lo ha puesto
descriptionEsstring | nullopcionalQué atiende (castellano); nulo = no se pinta
descriptionVastring | nullopcionaldelegationstring | nullopcionalDelegació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
Valors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
{
"items": [
{
"id": "texto",
"slug": "texto",
"nameEs": "texto",
"nameVa": "texto",
"configured": true,
"email": "texto",
"phone": "texto",
"descriptionEs": "texto",
"descriptionVa": "texto",
"delegation": "cultura_solidaridad"
}
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/contact/destinations'/api/v1/contactEnviar un mensaje a una delegaciónMés amb credencialCuota 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.
Amb credencial, a més: 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.
delegationstringobligatoriSlug del destino (GET /contact/destinations)
namestringobligatoriQuién escribe (con sesión de entidad, la persona; la entidad la pone la sesión)
emailstringopcionalCorreo 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)
fallaNumberstringopcional«Número de su Falla» (hasta 5 cifras). Con sesión de entidad se IGNORA: es el de la entidad
fallaNamestringopcional«Nombre de su Falla». Con sesión de entidad se IGNORA: es el de la entidad
subjectstringopcional«Tema del mensaje»: va en el asunto del correo a la delegación y de la copia
messagestringobligatorilocalestringopcionalIdioma de la copia al remitente (por defecto valenciano)
Valors:"es""va"
publicTicketstringopcionalSIN 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).
{
"delegation": "texto",
"name": "texto",
"email": "texto",
"fallaNumber": "texto",
"fallaName": "texto",
"subject": "texto",
"message": "texto",
"locale": "es",
"publicTicket": "texto"
}ContactResultDtoidstringobligatorireferencestringobligatoriReferencia corta para citar el mensaje (los 8 últimos caracteres del id, en mayúsculas)
createdAtstringobligatoridelegationMailstringobligatoriCorreo a la delegación: logged = sin proveedor (desarrollo); not_configured = el destino no tiene correo ni hay buzón general
Valors:"pending""sent""logged""failed""not_configured""skipped_unverified"
copyMailstringobligatoriCopia 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
Valors:"pending""sent""logged""failed""not_configured""skipped_unverified"
{
"id": "texto",
"reference": "texto",
"createdAt": "texto",
"delegationMail": "pending",
"copyMail": "pending"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"delegation": [
"isString"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones (details.retryAfterSeconds, cabecera Retry-After)Model: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl -X POST 'https://test-jcf.alejandrofan2.dev/api/v1/contact' \
-H 'Content-Type: application/json' \
-d '{"delegation":"texto","name":"texto","email":"texto","fallaNumber":"texto","fallaName":"texto","subject":"texto","message":"texto","locale":"es","publicTicket":"texto"}'/api/v1/public-submission¿Cómo se presenta sin sesión?Sense credencialADR 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.
PublicSubmissionConfigDtostatusstringobligatoriturnstile: 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
Valors:"turnstile""quota_only"
siteKeystring | nullopcionalClave de sitio de Turnstile (pública) para el widget del navegador; nula en quota_only
ticketTtlSecondsnumberobligatoriValidez del ticket, en segundos
quotaPerHournumberobligatoriPresentaciones sin sesión por IP y hora que admite este servidor (PUBLIC_SUBMISSION_QUOTA_PER_HOUR; la mitad en quota_only)
{
"status": "turnstile",
"siteKey": "texto",
"ticketTtlSeconds": 0,
"quotaPerHour": 0
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/public-submission'/api/v1/public-submission/ticketObtener un ticket de presentación sin sesiónSense credencialCuota 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.
turnstileTokenstringopcionalEl 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)
{
"turnstileToken": "texto"
}PublicTicketDtoticketstringobligatoriTicket para UNA presentación sin sesión y sus adjuntos (cabecera o campo publicTicket)
expiresAtstringobligatoriverificationstringobligatoriCómo se comprobó que hay una persona: con el captcha o solo con la cuota (ADR 0025)
Valors:"turnstile""none"
{
"ticket": "texto",
"expiresAt": "texto",
"verification": "turnstile"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"turnstileToken": [
"isString"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones (details.retryAfterSeconds, cabecera Retry-After)Model: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl -X POST 'https://test-jcf.alejandrofan2.dev/api/v1/public-submission/ticket' \
-H 'Content-Type: application/json' \
-d '{"turnstileToken":"texto"}'/api/v1/public-submission/filesSubir un adjunto sin sesiónSense credencialCon 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.
filestring (binary)obligatoriEl fichero (por BYTES: PDF o JPG en el registro; PDF, JPG, PNG o MP3 en un trámite)
purposestringobligatoriValors:"registry""procedure"
publicTicketstringobligatoriEl ticket de POST /public-submission/ticket
FileDtoidstringobligatoritypestringobligatoriValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
mimeTypestringobligatorisizenumberobligatorioriginalNamestringobligatorisha256stringobligatoriSHA-256 del contenido (hex)
purposestringobligatoriValors:"document""communication""registry""message""receipt""procedure""candidacy""brand""award"
createdAtstringobligatori{
"id": "texto",
"type": "pdf",
"mimeType": "texto",
"size": 0,
"originalName": "texto",
"sha256": "texto",
"purpose": "document",
"createdAt": "texto"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtopayload_too_large: el fichero pasa del máximo (details.maxBytes)Model: ErrorBodyDto
{
"code": "payload_too_large",
"message": "Fichero demasiado grande",
"details": {
"maxBytes": 20971520
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campo": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones (details.retryAfterSeconds, cabecera Retry-After)Model: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl -X POST 'https://test-jcf.alejandrofan2.dev/api/v1/public-submission/files' \
-F '[email protected]' \
-F 'purpose=…' \
-F 'publicTicket=…'/api/v1/orgIdentidad de la JuntaMés amb credencialNombre 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.
Amb credencial, a més: Igual con o sin sesión: es la identidad de la Junta.
OrganizationDtoofficialNamestringobligatoriExemple: "Junta Central Fallera de València"
shortNamestringobligatoriExemple: "Junta Central Fallera"
legalFormEsstring | nullopcionallegalFormVastring | nullopcionaltaxIdstring | nullopcionalNIF
addressstring | nullopcionalDirección postal (puede tener saltos de línea)
phonestring | nullopcionalemailstring | nullopcionalCorreo general
websitestring | nullopcionalopeningHoursEsstring | nullopcionalopeningHoursVastring | nullopcionaldpoEmailstring | nullopcionalCorreo del Delegado de Protección de Datos
labelstringobligatoriNombre de la red tal como se enseña (Instagram, Facebook…)
urlstringobligatoriEnlace https
logoUrlstring | nullopcionalLogo subido por la Junta (GET /org/logo); null = el provisional del kit
legalFooterEsstring | nullopcionalPie legal corto (castellano)
legalFooterVastring | nullopcionalupdatedAtstringobligatori{
"officialName": "Junta Central Fallera de València",
"shortName": "Junta Central Fallera",
"legalFormEs": "texto",
"legalFormVa": "texto",
"taxId": "texto",
"address": "texto",
"phone": "texto",
"email": "texto",
"website": "texto",
"openingHoursEs": "texto",
"openingHoursVa": "texto",
"dpoEmail": "texto",
"social": [
{
"label": "texto",
"url": "texto"
}
],
"logoUrl": "texto",
"legalFooterEs": "texto",
"legalFooterVa": "texto",
"updatedAt": "texto"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/org'/api/v1/org/logoLogo subido por la JuntaMés amb credencial404 si no hay ninguno: entonces se usa el provisional del kit.
Amb credencial, a més: El logo es público.
string (binary)La imagenstring (binary)
"<fichero>"ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/org/logo'/api/v1/procedure-typesCatálogo de trámites (impresos e inscripciones)Més amb credencialPor 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.
Amb credencial, a més: 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.
delegation"cultura_solidaridad" | "deportes" | "festejos" | "infantiles_juventud" | "juveniles" | "relaciones_publicas_protocolo" | "incidencias" | "fallas" | "pirotecnia" | "censos" | "recompensas" | "medios_comunicacion" | "secretaria" | "juntas_locales"consultaopcionalkind"online" | "pdf" | "document"consultaopcionalMejor channel
channel"online" | "upload_signed" | "in_person" | "by_email" | "via_contact" | "external"consultaopcionalqstringconsultaopcionalBusca en el título y la descripción (castellano y valenciano, sin tildes)
ProcedureTypeListDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoridelegationstringobligatoriValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
titleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionaldescriptionVastring | nullopcionalkindstringobligatoriDERIVADO de channel (compatibilidad): online → online; upload_signed → pdf; el resto → document
Valors:"online""pdf""document"
channelstringobligatoriCó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)
Valors:"online""upload_signed""in_person""by_email""via_contact""external"
channelNoteEsstring | nullopcionalDónde, cómo y horario (castellano)
channelNoteVastring | nullopcionalhiddenbooleanobligatoriopensAtstring | nullopcionalclosesAtstring | nullopcionalwindowstringobligatoriPlazo: sin plazo, abierto, aún no abierto o cerrado
Valors:"always""open""not_yet""closed"
windowNoteEsstring | nullopcionalwindowNoteVastring | nullopcionaldocumentIdstring | nullopcionalImpreso de la biblioteca (GET /documents/{id}/file)
hasFormbooleanobligatoriTiene formulario publicado (se puede presentar en línea)
paymentPolicyPaymentPolicyDto | nullopcionalPago con justificante; nulo = sin pago
amountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalsheetPendingReviewbooleanobligatoriLa ficha es un texto de partida pendiente de que la Junta lo revise
responsibleDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ordernumberobligatoriactions"view" | "download" | "do_online" | "sign_in" | "do_anonymous" | "edit"[]obligatoriBotones para ESTA sesión (los calcula la API)
Valors:"view""download""do_online""sign_in""do_anonymous""edit"
{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"slug": "texto",
"delegation": "cultura_solidaridad",
"titleEs": "texto",
"titleVa": "texto",
"descriptionEs": "texto",
"descriptionVa": "texto",
"kind": "online",
"channel": "online",
"channelNoteEs": "texto",
"channelNoteVa": "texto",
"hidden": true,
"opensAt": "texto",
"closesAt": "texto",
"window": "always",
"windowNoteEs": "texto",
"windowNoteVa": "texto",
"documentId": "texto",
"hasForm": true,
"paymentPolicy": {
"amountCents": 13000,
"concept": "Fianza Concurs de Playback",
"iban": "texto",
"proofRequired": true,
"noteEs": "texto",
"noteVa": "texto"
},
"sheetPendingReview": true,
"responsibleDelegation": "cultura_solidaridad",
"order": 0,
"actions": [
"view"
]
}
]
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"delegation": [
"isIn"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/procedure-types'/api/v1/procedure-types/{slug}Ficha de sede de un trámiteMés amb credencialQué 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.
Amb credencial, a més: 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.
slugstringcamíobligatoriProcedureTypeSheetDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoridelegationstringobligatoriValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
titleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionaldescriptionVastring | nullopcionalkindstringobligatoriDERIVADO de channel (compatibilidad): online → online; upload_signed → pdf; el resto → document
Valors:"online""pdf""document"
channelstringobligatoriCó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)
Valors:"online""upload_signed""in_person""by_email""via_contact""external"
channelNoteEsstring | nullopcionalDónde, cómo y horario (castellano)
channelNoteVastring | nullopcionalhiddenbooleanobligatoriopensAtstring | nullopcionalclosesAtstring | nullopcionalwindowstringobligatoriPlazo: sin plazo, abierto, aún no abierto o cerrado
Valors:"always""open""not_yet""closed"
windowNoteEsstring | nullopcionalwindowNoteVastring | nullopcionaldocumentIdstring | nullopcionalImpreso de la biblioteca (GET /documents/{id}/file)
hasFormbooleanobligatoriTiene formulario publicado (se puede presentar en línea)
paymentPolicyPaymentPolicyDto | nullopcionalPago con justificante; nulo = sin pago
amountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalsheetPendingReviewbooleanobligatoriLa ficha es un texto de partida pendiente de que la Junta lo revise
responsibleDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ordernumberobligatoriactions"view" | "download" | "do_online" | "sign_in" | "do_anonymous" | "edit"[]obligatoriBotones para ESTA sesión (los calcula la API)
Valors:"view""download""do_online""sign_in""do_anonymous""edit"
whoEsstring | nullopcionalwhoVastring | nullopcionalhowEsstring | nullopcionalhowVastring | nullopcionalrequirementsEsstring | nullopcionalrequirementsVastring | nullopcionalregulationEsstring | nullopcionalregulationVastring | nullopcionalminnumberobligatorimaxnumberobligatoritypes"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]obligatoriValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
maxSizeMbnumberobligatoriformFormVersionDto | nullopcionalEl formulario que se presenta hoy (solo online)
idstringobligatoriformIdstringobligatoriversionnumberobligatorikeystringobligatori/^[a-z][a-z0-9_]{0,47}$/typestringobligatoriValors:"text""textarea""number""date""time""datetime""select""multiselect""boolean""file""address""person_from_census""entity""amount""repeatable_group""custom_code"
labelEsstringobligatorilabelVastringobligatorihelpEsstringopcionalhelpVastringopcionalrequiredbooleanopcionalSe ve solo si se cumplen todas
fieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
minLengthnumberopcionalmaxLengthnumberopcionalpatternstringopcionalExpresión regular (texto entero)
minnumberopcionalmaxnumberopcionalvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriminItemsnumberopcionalmaxItemsnumberopcionalaccept"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]opcionalValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
codestringopcionalcustom_code: declarado, NO implementado (publicar → 501 not_implemented)
Solo repeatable_group
noticeEsstringopcionalAviso previo (castellano)
noticeVastringopcionalkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
presenterFormPresenterDtoopcionalQuién presenta, con campos del formulario: sin él no se presenta sin sesión
namestringobligatoriClave del campo con el nombre (con sesión, la API pone el de la entidad)
emailstringobligatoriClave del campo con el correo
phonestringopcionalnationalIdstringopcionalpublishedAtstringobligatori{
"audience": {
"mode": "public",
"rules": [
{
"kinds": [],
"sectors": [],
"localBoards": [],
"groupings": [],
"entities": [],
"cities": [],
"categories": []
}
]
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"id": "texto",
"slug": "texto",
"delegation": "cultura_solidaridad",
"titleEs": "texto",
"titleVa": "texto",
"descriptionEs": "texto",
"descriptionVa": "texto",
"kind": "online",
"channel": "online",
"channelNoteEs": "texto",
"channelNoteVa": "texto",
"hidden": true,
"opensAt": "texto",
"closesAt": "texto",
"window": "always",
"windowNoteEs": "texto",
"windowNoteVa": "texto",
"documentId": "texto",
"hasForm": true,
"paymentPolicy": {
"amountCents": 13000,
"concept": "Fianza Concurs de Playback",
"iban": "texto",
"proofRequired": true,
"noteEs": "texto",
"noteVa": "texto"
},
"sheetPendingReview": true,
"responsibleDelegation": "cultura_solidaridad",
"order": 0,
"actions": [
"view"
],
"whoEs": "texto",
"whoVa": "texto",
"howEs": "texto",
"howVa": "texto",
"requirementsEs": "texto",
"requirementsVa": "texto",
"regulationEs": "texto",
"regulationVa": "texto",
"attachmentsPolicy": {
"min": 0,
"max": 0,
"types": [
"pdf"
],
"maxSizeMb": 0
},
"form": {
"id": "texto",
"formId": "texto",
"version": 0,
"schema": {
"fields": [],
"noticeEs": "texto",
"noticeVa": "texto",
"flow": {},
"presenter": {}
},
"publishedAt": "texto"
}
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/procedure-types/<slug>'/api/v1/searchBuscar en la sedeMés amb credencialSin 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).
Amb credencial, a més: 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.
qstringconsultaobligatoriTexto a buscar (sin tildes ni mayúsculas, en castellano y valenciano a la vez)
types"section" | "procedure_type" | "procedure" | "person" | "thread" | "entity" | "registry_entry" | "document" | "page" | "communication" | "event"[]consultaopcionalTipos (separados por comas); por defecto, todos
locale"es" | "va"consultaopcional= "va"Idioma de title y snippet (los dos idiomas van siempre en titleEs/titleVa)
cursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 50≥ 1= 20perGroupnumberconsultaopcional≤ 20≥ 1= 5Resultados por grupo en groups (la vista agrupada con «ver todos»)
SearchPageDtomodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared
nextCursorstring | nullopcionaltotalnumberobligatoriResultados en total (hasta 500)
Los mismos resultados agrupados por tipo; los grupos van por su mejor puntuación
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
totalnumberobligatoriResultados de este tipo en total (hasta 500 entre todos)
Los primeros perGroup; el resto, con types=<tipo>
modestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared
scopestringobligatoriComo 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)
Valors:"anonymous""entity""junta"
{
"items": [
{
"audience": {
"mode": "public",
"rules": []
},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"type": "section",
"id": "texto",
"path": "texto",
"title": "texto",
"titleEs": "texto",
"titleVa": "texto",
"snippet": "texto",
"date": "texto",
"zone": "public",
"isAction": true,
"subtitle": "texto",
"opensAt": "texto",
"closesAt": "texto",
"match": "exact",
"score": 0
}
],
"nextCursor": "texto",
"total": 0,
"groups": [
{
"type": "section",
"total": 0,
"items": [
{
"audience": {},
"audienceLabelEs": "texto",
"audienceLabelVa": "texto",
"allowed": true,
"reason": "anonymous",
"type": "section",
"id": "texto",
"path": "texto",
"title": "texto",
"titleEs": "texto",
"titleVa": "texto",
"snippet": "texto",
"date": "texto",
"zone": "public",
"isAction": true,
"subtitle": "texto",
"opensAt": "texto",
"closesAt": "texto",
"match": "exact",
"score": 0
}
]
}
],
"scope": "anonymous"
}ErrorBodyDtounauthorized: se mandó Authorization: Bearer con una clave o un token que no vale (cabecera WWW-Authenticate). Sin cabecera no se pide nada.Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/search?q=texto'/api/v1/registryPresentar en el registro de entrada (solicitud genérica)Més amb credencialLos 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).
Amb credencial, a més: 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.
subjectstringobligatoriAsunto: descripción breve
kindstringobligatori«Indique lo que desea hacer»
Valors:"documents_only""request"
namestringobligatoriPresentador/a
nationalIdstringobligatoriDNI, NIE o NIF (CIF)
onBehalfOfstring | nullopcional«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
onBehalfOfNumberstring | nullopcional«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
phonestringobligatoriemailstringobligatoriEn POST /registry con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)
notificationNotificationAddressDtoobligatoriDomicilio a efectos de notificación
addressstringobligatoricitystringobligatoripostalCodestring | nullopcionalexposestring | nullopcionalmax 1500requeststring | nullopcionalmax 1000fileIdstringobligatoriFichero subido con POST /files (purpose registry: PDF o JPG)
descriptionstringobligatori«Describa el documento»
localestringopcionalIdioma del acuse (por defecto, el de la cuenta)
Valors:"es""va"
publicTicketstringopcionalSIN 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.
{
"subject": "texto",
"kind": "documents_only",
"presenter": {
"name": "texto",
"nationalId": "texto",
"onBehalfOf": "texto",
"onBehalfOfNumber": "texto"
},
"contact": {
"phone": "texto",
"email": "texto"
},
"notification": {
"address": "texto",
"city": "texto",
"postalCode": "texto"
},
"expose": "texto",
"request": "texto",
"attachments": [
{
"fileId": "texto",
"description": "texto"
}
],
"locale": "es",
"publicTicket": "texto"
}RegistryCreatedDtoidstringobligatorinumberstringobligatoriExemple: "2026/000123"
registeredAtstringobligatorichannelstringobligatoriValors:"telematic""in_person"
subjectstringobligatorikindstringobligatoriValors:"documents_only""request"
namestringobligatoriPresentador/a
nationalIdstringobligatoriDNI, NIE o NIF (CIF)
onBehalfOfstring | nullopcional«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
onBehalfOfNumberstring | nullopcional«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
phonestringobligatoriemailstringobligatoriEn POST /registry con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)
addressstringobligatoricitystringobligatoripostalCodestring | nullopcionalexposestring | nullopcionalrequeststring | nullopcionalentityIdstring | nullopcionalentityNamestring | nullopcionalauthenticatedbooleanobligatoriADR 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)
verificationstring | nullopcionalSolo sin autenticar: turnstile (pasó el captcha) o none (solo la cuota por IP)
Valors:"turnstile""none"
procedureIdstring | nullopcionalExpediente ligado (spec 14)
fileIdstringobligatoridescriptionstringobligatorinamestringobligatorisizenumberobligatoritypestringobligatorireceiptFileIdstring | nullopcionalreceiptStatusstringobligatoriJustificante PDF: not_configured = no hay Chromium en el servidor
Valors:"pending""ok""not_configured""failed"
statusstringobligatoriValors:"received""classified""closed"
assignedDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
notestring | nullopcionalSolo en Gestión JCF
closedAtstring | nullopcionalackMailstringobligatoriAcuse por correo al presentador; pending = el justificante y el acuse siguen en segundo plano (la respuesta no espera a Chromium ni al correo)
Valors:"sent""logged""failed""pending"
{
"id": "texto",
"number": "2026/000123",
"registeredAt": "texto",
"channel": "telematic",
"subject": "texto",
"kind": "documents_only",
"presenter": {
"name": "texto",
"nationalId": "texto",
"onBehalfOf": "texto",
"onBehalfOfNumber": "texto"
},
"contact": {
"phone": "texto",
"email": "texto"
},
"notification": {
"address": "texto",
"city": "texto",
"postalCode": "texto"
},
"expose": "texto",
"request": "texto",
"entityId": "texto",
"entityName": "texto",
"authenticated": true,
"verification": "turnstile",
"procedureId": "texto",
"attachments": [
{
"fileId": "texto",
"description": "texto",
"name": "texto",
"size": 0,
"type": "texto"
}
],
"receiptFileId": "texto",
"receiptStatus": "pending",
"status": "received",
"assignedDelegation": "cultura_solidaridad",
"note": "texto",
"closedAt": "texto",
"ackMail": "sent"
}ErrorBodyDtounauthorized: el contenido es de nivel members y no hay sesiónModel: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"subject": [
"isString"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones (details.retryAfterSeconds, cabecera Retry-After)Model: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl -X POST 'https://test-jcf.alejandrofan2.dev/api/v1/registry' \
-H 'Content-Type: application/json' \
-d '{"subject":"texto","kind":"documents_only","presenter":{"name":"texto","nationalId":"texto","onBehalfOf":"texto","onBehalfOfNumber":"texto"},"contact":{"phone":"texto","email":"texto"},"notification":{"address":"texto","city":"texto","postalCode":"texto"},"expose":"texto","request":"texto","attachments":[{"fileId":"texto","description":"texto"}],"locale":"es","publicTicket":"texto"}'/api/v1/procedures/anonymousPresentar SIN sesión un trámite públicoMés amb credencialComo 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.
Amb credencial, a més: Es SOLO para quien no tiene sesión: con sesión, 409 `use_session` (se presenta desde la Zona Privada, con la entidad).
typestringobligatoriSlug (o id) del tipo de trámite: audiencia pública, en línea, con formulario que declara su presentador
dataobject (clave → valor)obligatoriLas respuestas del formulario (se validan enteras; los campos file, con ids subidos con el ticket)
publicTicketstringopcionalEl 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
localestringopcionalIdioma del acuse (por defecto valenciano)
Valors:"es""va"
{
"type": "texto",
"data": {},
"publicTicket": "texto",
"locale": "es"
}AnonymousProcedureSubmittedDtoidstringobligatoriregistryNumberstringobligatoriNúmero del registro de entrada (AAAA/NNNNNN)
submittedAtstringobligatorititleEsstringobligatoriTítulo del trámite (castellano)
titleVastringobligatoriemailstringobligatoriCorreo al que se mandó el acuse
receiptStatusstringobligatoriok, not_configured (sin Chromium) o failed
ackMailstringobligatoriEstado del correo de acuse (con el justificante); pending = el justificante y el acuse siguen en segundo plano
Valors:"sent""logged""failed""pending"
authenticatedbooleanobligatoriSiempre falso aquí (ADR 0025): presentado sin cuenta, la Junta comprueba quién es
verificationstringobligatoriCómo se comprobó que hay una persona: el captcha o solo la cuota por IP
Valors:"turnstile""none"
{
"id": "texto",
"registryNumber": "texto",
"submittedAt": "texto",
"titleEs": "texto",
"titleVa": "texto",
"email": "texto",
"receiptStatus": "texto",
"ackMail": "sent",
"authenticated": true,
"verification": "turnstile"
}ErrorBodyDtounauthorized: el contenido es de nivel members y no hay sesiónModel: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoconflict / census_closed / person_existsModel: ErrorBodyDto
{
"code": "conflict",
"message": "La operación choca con el estado actual",
"details": {
"reason": "<motivo>"
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"type": [
"isString"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones (details.retryAfterSeconds, cabecera Retry-After)Model: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl -X POST 'https://test-jcf.alejandrofan2.dev/api/v1/procedures/anonymous' \
-H 'Content-Type: application/json' \
-d '{"type":"texto","data":{},"publicTicket":"texto","locale":"es"}'/api/v1/awards/proposalPropuesta de recompensas del ejercicioRequerix compte o clau d'APICabecera («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.
award:readsv_session · apiKey · oauth2exercisestringconsultaopcionalId o etiqueta del ejercicio («2026-27»); por defecto, el en curso
filter"approved" | "denied" | "to_review" | "rejected" | "all"consultaopcional= "all"Aprobadas JCF / Denegadas JCF / Pendientes revisar / Rechazadas por la falla / Todas
AwardProposalDtoidstring | nullopcionalNulo = aún no hay propuesta (nace con la primera solicitud)
exercisestringobligatoriExemple: "2026-27"
awardsYearnumberobligatoriAño de las recompensas («Recompensas 2027»)
Exemple: 2027
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoristatusstring | nullopcionalValors:"draft""sent""received""completed""returned"
createdAtstring (date-time) | nullopcional«Elaborada el»
updatedAtstring (date-time) | nullopcional«Actualizada el»
sentAtstring (date-time) | nullopcionalreturnedAtstring (date-time) | nullopcionalreturnNotestring | nullopcionalreceivedAtstring (date-time) | nullopcionalRECIBIDA: la Junta empezó a revisarla
completedAtstring (date-time) | nullopcionalCOMPLETADA: todo resuelto
contactPhonestring | nullopcionalcontactEmailstring | nullopcionalcopperBunyolsnumber | nullopcionalcopperDistintiusnumber | nullopcionalcanCancelSendbooleanobligatoriLa comisión puede ANULAR el envío (enviada y aún no recibida)
canRecalculatebooleanobligatoriLa comisión puede RECALCULAR la propuesta ahora
exercisestringobligatoriExemple: "2026-27"
windowstringobligatoriValors:"none""not_yet""open""closed"
opensAtstring (date-time) | nullopcionalclosesAtstring (date-time) | nullopcionaleditablebooleanobligatoriLa comisión puede cambiarla ahora
lockedReasonstring | nullopcionalValors:"window_none""window_not_yet""window_closed""sent""received""completed""no_permission"
canSendbooleanobligatoriSe puede enviar a JCF (hay solicitudes y ninguna pendiente)
approvednumberobligatorideniednumberobligatorito_reviewnumberobligatoriPendientes de revisar
rejectednumberobligatoriRechazadas por la falla
allnumberobligatorifilterstringobligatoriValors:"approved""denied""to_review""rejected""all"
idstring (uuid)obligatoriexercisestringobligatoriExemple: "2026-27"
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoricollectivebooleanobligatoriCol·lectiva de la entidad (sin persona)
profileIdstring | nullopcionalpersonIdstring | nullopcionalSolo para la Junta
namestring | nullopcionalNombre y apellidos (de la ficha) o nombre de la entidad
nationalIdMaskedstring | nullopcionalDocumento enmascarado (••••1234)
awardstringobligatoriValors:"distintiu_argent""distintiu_or""bunyol_argent""bunyol_or""bunyol_fulles""bunyol_brillants""bunyol_collectiu""distintiu_collectiu"
gradestring | nullopcionalValors:"argent""or""fulles""brillants"
yearsAsMembernumber | nullopcionalyearsAsOfficernumber | nullopcionaloutsideRulebooleanobligatoriSe pide sin cumplir la regla
statusstringobligatoriValors:"pending""accepted""rejected""approved""denied"
manualbooleanobligatoriMANUAL = añadida por la falla (no la ofreció JCF); se justifica en persona. Automática = la ofrece JCF.
suggestedbooleanobligatoriLa ofrece JCF (candidatos o recálculo)
notesstring | nullopcionaldecisionNotestring | nullopcionaldecidedAtstring (date-time) | nullopcionalgrantedYearnumber | nullopcionalidDocumentSentAtstring (date-time) | nullopcionalCuándo envió la comisión la copia del DNI (o similar)
scrollSentAtstring (date-time) | nullopcionalCuándo envió la imagen del pergamino (solo manuales)
proposalStatusstringobligatoriEstado de la propuesta a la que pertenece
Valors:"draft""sent""received""completed""returned"
createdAtstring (date-time)obligatoriupdatedAtstring (date-time)obligatoriactions"accept" | "reject" | "pending" | "remove" | "id_document" | "scroll" | "approve" | "deny" | "manage"[]obligatoriLo que ESTA sesión puede hacer ahora con ella
Valors:"accept""reject""pending""remove""id_document""scroll""approve""deny""manage"
{
"id": "texto",
"exercise": "2026-27",
"awardsYear": 2027,
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"status": "draft",
"createdAt": "2026-10-06T10:00:00.000Z",
"updatedAt": "2026-10-06T10:00:00.000Z",
"sentAt": "2026-10-06T10:00:00.000Z",
"returnedAt": "2026-10-06T10:00:00.000Z",
"returnNote": "texto",
"receivedAt": "2026-10-06T10:00:00.000Z",
"completedAt": "2026-10-06T10:00:00.000Z",
"contactPhone": "texto",
"contactEmail": "texto",
"copperBunyols": 0,
"copperDistintius": 0,
"canCancelSend": true,
"canRecalculate": true,
"window": {
"exercise": "2026-27",
"window": "none",
"opensAt": "2026-10-06T10:00:00.000Z",
"closesAt": "2026-10-06T10:00:00.000Z"
},
"editable": true,
"lockedReason": "window_none",
"canSend": true,
"counts": {
"approved": 0,
"denied": 0,
"to_review": 0,
"rejected": 0,
"all": 0
},
"filter": "approved",
"requests": [
{
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"exercise": "2026-27",
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"collective": true,
"profileId": "texto",
"personId": "texto",
"name": "texto",
"nationalIdMasked": "texto",
"award": "distintiu_argent",
"grade": "argent",
"yearsAsMember": 0,
"yearsAsOfficer": 0,
"outsideRule": true,
"status": "pending",
"manual": true,
"suggested": true,
"notes": "texto",
"decisionNote": "texto",
"decidedAt": "2026-10-06T10:00:00.000Z",
"grantedYear": 0,
"idDocumentSentAt": "2026-10-06T10:00:00.000Z",
"scrollSentAt": "2026-10-06T10:00:00.000Z",
"proposalStatus": "draft",
"createdAt": "2026-10-06T10:00:00.000Z",
"updatedAt": "2026-10-06T10:00:00.000Z",
"actions": [
"accept"
]
}
]
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"filter": [
"isIn"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/awards/proposal' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/fallasLes meues falles: las fallas de una junta local o agrupaciónRequerix compte o clau d'APIPor 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"].
entity:readsv_session · apiKey · oauth2idstringcamíobligatoriexercisestringconsultaopcionalId o etiqueta del ejercicio («2026-27»); por defecto, el en curso
BoardFallasDtoboardBoardEntityDtoobligatoriLa junta local o agrupación
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionalexercisestringobligatoriExemple: "2026-27"
Sus fallas, por nombre
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionaladultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
Presidencia, secretaría, tesorería y delegación de infantiles, en ese orden
officestringobligatoriValors:"presidente""secretario""tesorero""delegado_infantiles"
Ocupantes activos (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoriexerciseStartBoardExerciseStartDtoobligatoriInicio de ejercicio de la falla en el ejercicio pedido
statestringobligatoriEstado del inicio de ejercicio (spec 16), la misma regla que el cuadro de la Junta
Valors:"not_started""in_progress""ready_to_submit""in_review""returned""approved""rejected"
updatedAtstring (date-time) | nullopcionalÚltimo movimiento del proceso (null = no ha empezado)
awardsBoardAwardsDtoobligatoriSu propuesta de recompensas del ejercicio pedido
statusstring | nullopcionalEstado de la propuesta de recompensas del ejercicio (spec 17); null = la falla no ha empezado ninguna
Valors:"draft""sent""received""completed""returned"
requestsnumberobligatoriSolicitudes en la propuesta
sentAtstring (date-time) | nullopcionalEnviada a la Junta
updatedAtstring (date-time) | nullopcionalÚltima actualización
totalsBoardCensusCountsDtoobligatoriSuma de todas sus fallas
adultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
{
"board": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto",
"sector": "texto",
"city": "texto"
},
"exercise": "2026-27",
"items": [
{
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto",
"sector": "texto",
"city": "texto"
},
"census": {
"adults": 0,
"children": 0,
"left": 0
},
"keyOffices": [
{
"office": "presidente",
"holders": []
}
],
"exerciseStart": {
"state": "not_started",
"updatedAt": "2026-10-06T10:00:00.000Z"
},
"awards": {
"status": "draft",
"requests": 0,
"sentAt": "2026-10-06T10:00:00.000Z",
"updatedAt": "2026-10-06T10:00:00.000Z"
}
}
],
"totals": {
"adults": 0,
"children": 0,
"left": 0
}
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campoDesconocido": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/fallas' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/board-censusCenso agregado de una junta local o agrupaciónRequerix compte o clau d'APIEl 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.
census:readsv_session · apiKey · oauth2idstringcamíobligatoricursorstringconsultaopcionalEl nextCursor de la página anterior
limitnumberconsultaopcional≤ 200≥ 1= 50exercisestringconsultaopcionalId o etiqueta del ejercicio («2026-27»); por defecto, el en curso
filter"adults" | "children" | "all" | "left" | "everyone"consultaopcional= "all"adults = mayores activos · children = infantiles activos · all = todos activos · left = solo bajas · everyone = todos
qstringconsultaopcionalNombre o apellidos (todas las palabras), o nº de censo en falla
fallaIdstring (uuid)consultaopcionalSolo una de SUS fallas (otra → 422)
BoardCensusPageDtoexercisestringobligatoriExemple: "2026-27"
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalentityEntityRefDtoobligatoriLa falla de la fila
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorinextCursorstring | nullopcional{
"exercise": "2026-27",
"items": [
{
"entryId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"profileId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"censusNumber": 0,
"givenName": "texto",
"familyName": "texto",
"category": "infantil",
"office": "presidente",
"joinedAt": "2026-10-06T10:00:00.000Z",
"leftAt": "2026-10-06T10:00:00.000Z",
"leaveReason": "voluntaria",
"leaveNote": "texto",
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
}
}
],
"nextCursor": "texto"
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"limit": [
"max"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/board-census' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/board-census/exportDescargar el censo agregado (CSV o PDF)Requerix compte o clau d'APIMismos filtros que la lista. CSV ; en UTF-8 con BOM; PDF con la cabecera institucional (sin generador de PDF en el servidor → 503 details.reason = "not_configured"). Queda en auditoría.
census:readsv_session · apiKey · oauth2idstringcamíobligatoriformat"csv" | "pdf"consultaobligatorifilter"adults" | "children" | "all" | "left" | "everyone"consultaopcional= "all"fallaIdstring (uuid)consultaopcionalSolo una de SUS fallas
exercisestringconsultaopcionalId o etiqueta del ejercicio; por defecto, el en curso
lang"va" | "es"consultaopcional= "va"Idioma de la cabecera (CSV) o del documento (PDF)
stringEl ficherostring
"texto"ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"format": [
"isIn"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtounavailable: sin generador de PDF (not_configured) o fallo al generarloModel: ErrorBodyDto
{
"code": "unavailable",
"message": "No disponible ahora mismo",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/board-census/export?format=csv' \
-H "Authorization: Bearer $SV_API_KEY"/api/v1/entities/{id}/board-membersMiembros de la junta local o directiva de la agrupaciónRequerix compte o clau d'APIPersonas censadas activas en SUS fallas con el cargo miembro_junta_local (junta local) o directiva_agrupacion (agrupación), con su falla.
census:readsv_session · apiKey · oauth2idstringcamíobligatoriexercisestringconsultaopcionalId o etiqueta del ejercicio («2026-27»); por defecto, el en curso
BoardMembersDtoidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionalexercisestringobligatoriExemple: "2026-27"
officestringobligatorimiembro_junta_local en una junta local; directiva_agrupacion en una agrupación
Valors:"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"
entityEntityRefDtoobligatoriLa falla donde está censada
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoriprofileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcional{
"board": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto",
"sector": "texto",
"city": "texto"
},
"exercise": "2026-27",
"office": "presidente",
"items": [
{
"entity": {
"id": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"kind": "comision",
"officialNumber": "texto",
"slug": "texto",
"name": "texto"
},
"profileId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b",
"givenName": "texto",
"familyName": "texto",
"category": "infantil",
"censusNumber": 0
}
]
}ErrorBodyDtounauthorized: sin sesión, o con una clave o un token que no vale (cabecera WWW-Authenticate)Model: ErrorBodyDto
{
"code": "unauthorized",
"message": "Hace falta iniciar sesión",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtoforbidden: la cuenta ve el recurso pero no tiene la acciónModel: ErrorBodyDto
{
"code": "forbidden",
"message": "No tienes permiso para esta acción",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtonot_found: no existe o es de otra entidad (no se revela cuál)Model: ErrorBodyDto
{
"code": "not_found",
"message": "No encontrado",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtovalidation: details lleva campo → problemasModel: ErrorBodyDto
{
"code": "validation",
"message": "Datos no válidos",
"details": {
"campoDesconocido": [
"whitelistValidation"
]
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtorate_limited: demasiadas peticiones con esta credencial (600/min); details.retryAfterSeconds y cabecera Retry-AfterModel: ErrorBodyDto
{
"code": "rate_limited",
"message": "Demasiados intentos; espera un poco",
"details": {
"retryAfterSeconds": 42
},
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}ErrorBodyDtointernal: error no controlado; da el requestId si nos escribesModel: ErrorBodyDto
{
"code": "internal",
"message": "Error interno",
"requestId": "0199b6a1-4c2e-7d3f-9a8b-1c2d3e4f5a6b"
}curl 'https://test-jcf.alejandrofan2.dev/api/v1/entities/<id>/board-members' \
-H "Authorization: Bearer $SV_API_KEY"Tots els models que apareixen en les peticions i les respostes.
AnonymousProcedureDtoobjecttypestringobligatoriSlug (o id) del tipo de trámite: audiencia pública, en línea, con formulario que declara su presentador
dataobject (clave → valor)obligatoriLas respuestas del formulario (se validan enteras; los campos file, con ids subidos con el ticket)
publicTicketstringopcionalEl 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
localestringopcionalIdioma del acuse (por defecto valenciano)
Valors:"es""va"
AnonymousProcedureSubmittedDtoobjectidstringobligatoriregistryNumberstringobligatoriNúmero del registro de entrada (AAAA/NNNNNN)
submittedAtstringobligatorititleEsstringobligatoriTítulo del trámite (castellano)
titleVastringobligatoriemailstringobligatoriCorreo al que se mandó el acuse
receiptStatusstringobligatoriok, not_configured (sin Chromium) o failed
ackMailstringobligatoriEstado del correo de acuse (con el justificante); pending = el justificante y el acuse siguen en segundo plano
Valors:"sent""logged""failed""pending"
authenticatedbooleanobligatoriSiempre falso aquí (ADR 0025): presentado sin cuenta, la Junta comprueba quién es
verificationstringobligatoriCómo se comprobó que hay una persona: el captcha o solo la cuota por IP
Valors:"turnstile""none"
AttachmentsPolicyDtoobjectminnumberobligatorimaxnumberobligatoritypes"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]obligatoriValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
maxSizeMbnumberobligatoriAudienceDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
AudienceRuleDtoobjectkinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
AwardProposalCountsDtoobjectapprovednumberobligatorideniednumberobligatorito_reviewnumberobligatoriPendientes de revisar
rejectednumberobligatoriRechazadas por la falla
allnumberobligatoriAwardProposalDtoobjectidstring | nullopcionalNulo = aún no hay propuesta (nace con la primera solicitud)
exercisestringobligatoriExemple: "2026-27"
awardsYearnumberobligatoriAño de las recompensas («Recompensas 2027»)
Exemple: 2027
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoristatusstring | nullopcionalValors:"draft""sent""received""completed""returned"
createdAtstring (date-time) | nullopcional«Elaborada el»
updatedAtstring (date-time) | nullopcional«Actualizada el»
sentAtstring (date-time) | nullopcionalreturnedAtstring (date-time) | nullopcionalreturnNotestring | nullopcionalreceivedAtstring (date-time) | nullopcionalRECIBIDA: la Junta empezó a revisarla
completedAtstring (date-time) | nullopcionalCOMPLETADA: todo resuelto
contactPhonestring | nullopcionalcontactEmailstring | nullopcionalcopperBunyolsnumber | nullopcionalcopperDistintiusnumber | nullopcionalcanCancelSendbooleanobligatoriLa comisión puede ANULAR el envío (enviada y aún no recibida)
canRecalculatebooleanobligatoriLa comisión puede RECALCULAR la propuesta ahora
exercisestringobligatoriExemple: "2026-27"
windowstringobligatoriValors:"none""not_yet""open""closed"
opensAtstring (date-time) | nullopcionalclosesAtstring (date-time) | nullopcionaleditablebooleanobligatoriLa comisión puede cambiarla ahora
lockedReasonstring | nullopcionalValors:"window_none""window_not_yet""window_closed""sent""received""completed""no_permission"
canSendbooleanobligatoriSe puede enviar a JCF (hay solicitudes y ninguna pendiente)
approvednumberobligatorideniednumberobligatorito_reviewnumberobligatoriPendientes de revisar
rejectednumberobligatoriRechazadas por la falla
allnumberobligatorifilterstringobligatoriValors:"approved""denied""to_review""rejected""all"
idstring (uuid)obligatoriexercisestringobligatoriExemple: "2026-27"
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoricollectivebooleanobligatoriCol·lectiva de la entidad (sin persona)
profileIdstring | nullopcionalpersonIdstring | nullopcionalSolo para la Junta
namestring | nullopcionalNombre y apellidos (de la ficha) o nombre de la entidad
nationalIdMaskedstring | nullopcionalDocumento enmascarado (••••1234)
awardstringobligatoriValors:"distintiu_argent""distintiu_or""bunyol_argent""bunyol_or""bunyol_fulles""bunyol_brillants""bunyol_collectiu""distintiu_collectiu"
gradestring | nullopcionalValors:"argent""or""fulles""brillants"
yearsAsMembernumber | nullopcionalyearsAsOfficernumber | nullopcionaloutsideRulebooleanobligatoriSe pide sin cumplir la regla
statusstringobligatoriValors:"pending""accepted""rejected""approved""denied"
manualbooleanobligatoriMANUAL = añadida por la falla (no la ofreció JCF); se justifica en persona. Automática = la ofrece JCF.
suggestedbooleanobligatoriLa ofrece JCF (candidatos o recálculo)
notesstring | nullopcionaldecisionNotestring | nullopcionaldecidedAtstring (date-time) | nullopcionalgrantedYearnumber | nullopcionalidDocumentSentAtstring (date-time) | nullopcionalCuándo envió la comisión la copia del DNI (o similar)
scrollSentAtstring (date-time) | nullopcionalCuándo envió la imagen del pergamino (solo manuales)
proposalStatusstringobligatoriEstado de la propuesta a la que pertenece
Valors:"draft""sent""received""completed""returned"
createdAtstring (date-time)obligatoriupdatedAtstring (date-time)obligatoriactions"accept" | "reject" | "pending" | "remove" | "id_document" | "scroll" | "approve" | "deny" | "manage"[]obligatoriLo que ESTA sesión puede hacer ahora con ella
Valors:"accept""reject""pending""remove""id_document""scroll""approve""deny""manage"
AwardRequestDtoobjectidstring (uuid)obligatoriexercisestringobligatoriExemple: "2026-27"
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoricollectivebooleanobligatoriCol·lectiva de la entidad (sin persona)
profileIdstring | nullopcionalpersonIdstring | nullopcionalSolo para la Junta
namestring | nullopcionalNombre y apellidos (de la ficha) o nombre de la entidad
nationalIdMaskedstring | nullopcionalDocumento enmascarado (••••1234)
awardstringobligatoriValors:"distintiu_argent""distintiu_or""bunyol_argent""bunyol_or""bunyol_fulles""bunyol_brillants""bunyol_collectiu""distintiu_collectiu"
gradestring | nullopcionalValors:"argent""or""fulles""brillants"
yearsAsMembernumber | nullopcionalyearsAsOfficernumber | nullopcionaloutsideRulebooleanobligatoriSe pide sin cumplir la regla
statusstringobligatoriValors:"pending""accepted""rejected""approved""denied"
manualbooleanobligatoriMANUAL = añadida por la falla (no la ofreció JCF); se justifica en persona. Automática = la ofrece JCF.
suggestedbooleanobligatoriLa ofrece JCF (candidatos o recálculo)
notesstring | nullopcionaldecisionNotestring | nullopcionaldecidedAtstring (date-time) | nullopcionalgrantedYearnumber | nullopcionalidDocumentSentAtstring (date-time) | nullopcionalCuándo envió la comisión la copia del DNI (o similar)
scrollSentAtstring (date-time) | nullopcionalCuándo envió la imagen del pergamino (solo manuales)
proposalStatusstringobligatoriEstado de la propuesta a la que pertenece
Valors:"draft""sent""received""completed""returned"
createdAtstring (date-time)obligatoriupdatedAtstring (date-time)obligatoriactions"accept" | "reject" | "pending" | "remove" | "id_document" | "scroll" | "approve" | "deny" | "manage"[]obligatoriLo que ESTA sesión puede hacer ahora con ella
Valors:"accept""reject""pending""remove""id_document""scroll""approve""deny""manage"
AwardsDtoobjectdistintiuArgentnumber | nullopcionaldistintiuOrnumber | nullopcionalbunyolArgentnumber | nullopcionalbunyolOrnumber | nullopcionalbunyolFullesnumber | nullopcionalbunyolBrillantsnumber | nullopcionalAwardWindowDtoobjectexercisestringobligatoriExemple: "2026-27"
windowstringobligatoriValors:"none""not_yet""open""closed"
opensAtstring (date-time) | nullopcionalclosesAtstring (date-time) | nullopcionalBoardAwardsDtoobjectstatusstring | nullopcionalEstado de la propuesta de recompensas del ejercicio (spec 17); null = la falla no ha empezado ninguna
Valors:"draft""sent""received""completed""returned"
requestsnumberobligatoriSolicitudes en la propuesta
sentAtstring (date-time) | nullopcionalEnviada a la Junta
updatedAtstring (date-time) | nullopcionalÚltima actualización
BoardCensusCountsDtoobjectadultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
BoardCensusPageDtoobjectexercisestringobligatoriExemple: "2026-27"
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalentityEntityRefDtoobligatoriLa falla de la fila
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorinextCursorstring | nullopcionalBoardCensusRowDtoobjectentryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalentityEntityRefDtoobligatoriLa falla de la fila
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoriBoardEntityDtoobjectidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionalBoardExerciseStartDtoobjectstatestringobligatoriEstado del inicio de ejercicio (spec 16), la misma regla que el cuadro de la Junta
Valors:"not_started""in_progress""ready_to_submit""in_review""returned""approved""rejected"
updatedAtstring (date-time) | nullopcionalÚltimo movimiento del proceso (null = no ha empezado)
BoardFallaDtoobjectidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionaladultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
Presidencia, secretaría, tesorería y delegación de infantiles, en ese orden
officestringobligatoriValors:"presidente""secretario""tesorero""delegado_infantiles"
Ocupantes activos (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoriexerciseStartBoardExerciseStartDtoobligatoriInicio de ejercicio de la falla en el ejercicio pedido
statestringobligatoriEstado del inicio de ejercicio (spec 16), la misma regla que el cuadro de la Junta
Valors:"not_started""in_progress""ready_to_submit""in_review""returned""approved""rejected"
updatedAtstring (date-time) | nullopcionalÚltimo movimiento del proceso (null = no ha empezado)
awardsBoardAwardsDtoobligatoriSu propuesta de recompensas del ejercicio pedido
statusstring | nullopcionalEstado de la propuesta de recompensas del ejercicio (spec 17); null = la falla no ha empezado ninguna
Valors:"draft""sent""received""completed""returned"
requestsnumberobligatoriSolicitudes en la propuesta
sentAtstring (date-time) | nullopcionalEnviada a la Junta
updatedAtstring (date-time) | nullopcionalÚltima actualización
BoardFallasDtoobjectboardBoardEntityDtoobligatoriLa junta local o agrupación
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionalexercisestringobligatoriExemple: "2026-27"
Sus fallas, por nombre
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionaladultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
Presidencia, secretaría, tesorería y delegación de infantiles, en ese orden
officestringobligatoriValors:"presidente""secretario""tesorero""delegado_infantiles"
Ocupantes activos (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoriexerciseStartBoardExerciseStartDtoobligatoriInicio de ejercicio de la falla en el ejercicio pedido
statestringobligatoriEstado del inicio de ejercicio (spec 16), la misma regla que el cuadro de la Junta
Valors:"not_started""in_progress""ready_to_submit""in_review""returned""approved""rejected"
updatedAtstring (date-time) | nullopcionalÚltimo movimiento del proceso (null = no ha empezado)
awardsBoardAwardsDtoobligatoriSu propuesta de recompensas del ejercicio pedido
statusstring | nullopcionalEstado de la propuesta de recompensas del ejercicio (spec 17); null = la falla no ha empezado ninguna
Valors:"draft""sent""received""completed""returned"
requestsnumberobligatoriSolicitudes en la propuesta
sentAtstring (date-time) | nullopcionalEnviada a la Junta
updatedAtstring (date-time) | nullopcionalÚltima actualización
totalsBoardCensusCountsDtoobligatoriSuma de todas sus fallas
adultsnumberobligatoriMayores activos en el ejercicio
childrennumberobligatoriInfantiles activos en el ejercicio
leftnumberobligatoriBajas del ejercicio
BoardHolderDtoobjectprofileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoriBoardKeyOfficeDtoobjectofficestringobligatoriValors:"presidente""secretario""tesorero""delegado_infantiles"
Ocupantes activos (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoriBoardMemberDtoobjectentityEntityRefDtoobligatoriLa falla donde está censada
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoriprofileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalBoardMembersDtoobjectidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorisectorstring | nullopcionalcitystring | nullopcionalexercisestringobligatoriExemple: "2026-27"
officestringobligatorimiembro_junta_local en una junta local; directiva_agrupacion en una agrupación
Valors:"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"
entityEntityRefDtoobligatoriLa falla donde está censada
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoriprofileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalCensusPageDtoobjectexercisestringobligatoriExemple: "2026-27"
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalnextCursorstring | nullopcionalCensusRowDtoobjectentryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionalCommunicationDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatoricategorystringobligatoriValors:"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"
titleEsstringobligatorititleVastringobligatoribodyEsstring | nullopcionalNulo si está cerrada (locked)
bodyVastring | nullopcionalhiddenbooleanobligatorihasFilebooleanobligatoripendingFilebooleanobligatorilockedbooleanobligatori= !allowed
sentAtstring | nullopcionalreadbooleanobligatoriLa cuenta de la sesión ya la ha abierto o descargado
actions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
CommunicationFacetDtoobjectvaluestringobligatoriValors:"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"
countnumberobligatoriCommunicationFacetsDtoobjecttotalnumberobligatoriCuántas casan con TODOS los filtros
Categorías con cuántas casan contando los demás filtros
valuestringobligatoriValors:"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"
countnumberobligatoridownloadablenumberobligatoriCuántas se pueden descargar ya con los demás filtros
CommunicationPageDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatoricategorystringobligatoriValors:"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"
titleEsstringobligatorititleVastringobligatoribodyEsstring | nullopcionalNulo si está cerrada (locked)
bodyVastring | nullopcionalhiddenbooleanobligatorihasFilebooleanobligatoripendingFilebooleanobligatorilockedbooleanobligatori= !allowed
sentAtstring | nullopcionalreadbooleanobligatoriLa cuenta de la sesión ya la ha abierto o descargado
actions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
nextCursorstring | nullopcionalContactDestinationDtoobjectidstringobligatorislugstringobligatorinameEsstringobligatorinameVastringobligatoriconfiguredbooleanobligatoriTiene correo configurado: si no, el mensaje se guarda y va al buzón general (o queda not_configured)
emailstring | nullopcionalCorreo público del destino (como la ficha de hoy); nulo si la Junta no lo ha puesto
phonestring | nullopcionalTeléfono público; nulo si la Junta no lo ha puesto
descriptionEsstring | nullopcionalQué atiende (castellano); nulo = no se pinta
descriptionVastring | nullopcionaldelegationstring | nullopcionalDelegació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
Valors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ContactDestinationListDtoobjectidstringobligatorislugstringobligatorinameEsstringobligatorinameVastringobligatoriconfiguredbooleanobligatoriTiene correo configurado: si no, el mensaje se guarda y va al buzón general (o queda not_configured)
emailstring | nullopcionalCorreo público del destino (como la ficha de hoy); nulo si la Junta no lo ha puesto
phonestring | nullopcionalTeléfono público; nulo si la Junta no lo ha puesto
descriptionEsstring | nullopcionalQué atiende (castellano); nulo = no se pinta
descriptionVastring | nullopcionaldelegationstring | nullopcionalDelegació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
Valors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ContactDtoobjectdelegationstringobligatoriSlug del destino (GET /contact/destinations)
namestringobligatoriQuién escribe (con sesión de entidad, la persona; la entidad la pone la sesión)
emailstringopcionalCorreo 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)
fallaNumberstringopcional«Número de su Falla» (hasta 5 cifras). Con sesión de entidad se IGNORA: es el de la entidad
fallaNamestringopcional«Nombre de su Falla». Con sesión de entidad se IGNORA: es el de la entidad
subjectstringopcional«Tema del mensaje»: va en el asunto del correo a la delegación y de la copia
messagestringobligatorilocalestringopcionalIdioma de la copia al remitente (por defecto valenciano)
Valors:"es""va"
publicTicketstringopcionalSIN 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).
ContactResultDtoobjectidstringobligatorireferencestringobligatoriReferencia corta para citar el mensaje (los 8 últimos caracteres del id, en mayúsculas)
createdAtstringobligatoridelegationMailstringobligatoriCorreo a la delegación: logged = sin proveedor (desarrollo); not_configured = el destino no tiene correo ni hay buzón general
Valors:"pending""sent""logged""failed""not_configured""skipped_unverified"
copyMailstringobligatoriCopia 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
Valors:"pending""sent""logged""failed""not_configured""skipped_unverified"
CreateRegistryDtoobjectsubjectstringobligatoriAsunto: descripción breve
kindstringobligatori«Indique lo que desea hacer»
Valors:"documents_only""request"
namestringobligatoriPresentador/a
nationalIdstringobligatoriDNI, NIE o NIF (CIF)
onBehalfOfstring | nullopcional«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
onBehalfOfNumberstring | nullopcional«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
phonestringobligatoriemailstringobligatoriEn POST /registry con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)
notificationNotificationAddressDtoobligatoriDomicilio a efectos de notificación
addressstringobligatoricitystringobligatoripostalCodestring | nullopcionalexposestring | nullopcionalmax 1500requeststring | nullopcionalmax 1000fileIdstringobligatoriFichero subido con POST /files (purpose registry: PDF o JPG)
descriptionstringobligatori«Describa el documento»
localestringopcionalIdioma del acuse (por defecto, el de la cuenta)
Valors:"es""va"
publicTicketstringopcionalSIN 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.
DocumentDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoricategorystringobligatoriValors:"impresos_jcf""agrupaciones""juntas_locales""ayuntamiento""jornadas""privacidad""rgcre""petardos""normativa""otros"
pageSlugstring | nullopcionaldelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
sectionEsstring | nullopcionalsectionVastring | nullopcionalhiddenbooleanobligatorikindstringobligatoriValors:"pdf""pdf_r""excel""word""zip""otro"
hasFilebooleanobligatoriHay fichero descargable
fileIdstring | nullopcionalSolo en Gestión JCF (/gestion/documents): para descargar por /files/{id} cualquier audiencia
pendingFilebooleanobligatoriSembrado desde el inventario sin el fichero real: la Junta lo sube
lockedbooleanobligatori= !allowed
ordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
DocumentFacetsDtoobjecttotalnumberobligatoriCuántos casan con TODOS los filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
valuestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
downloadablenumberobligatoriCuántos se pueden descargar ya con los demás filtros
DocumentPageDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoricategorystringobligatoriValors:"impresos_jcf""agrupaciones""juntas_locales""ayuntamiento""jornadas""privacidad""rgcre""petardos""normativa""otros"
pageSlugstring | nullopcionaldelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
sectionEsstring | nullopcionalsectionVastring | nullopcionalhiddenbooleanobligatorikindstringobligatoriValors:"pdf""pdf_r""excel""word""zip""otro"
hasFilebooleanobligatoriHay fichero descargable
fileIdstring | nullopcionalSolo en Gestión JCF (/gestion/documents): para descargar por /files/{id} cualquier audiencia
pendingFilebooleanobligatoriSembrado desde el inventario sin el fichero real: la Junta lo sube
lockedbooleanobligatori= !allowed
ordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
nextCursorstring | nullopcionalEntityCapabilitiesDtoobjecthasCensusbooleanobligatoriTiene censo propio (comisiones y fallas de municipio)
awardsEligiblebooleanobligatoriPuede pedir recompensas
hasFallasbooleanobligatoriTiene fallas a su cargo (juntas locales y agrupaciones)
privateHomestringobligatoriSu Zona Privada en la web de las fallas
Valors:"panel""mis-fallas"
EntityDtoobjectidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorihasCensusbooleanobligatoriTiene censo propio (comisiones y fallas de municipio)
awardsEligiblebooleanobligatoriPuede pedir recompensas
hasFallasbooleanobligatoriTiene fallas a su cargo (juntas locales y agrupaciones)
privateHomestringobligatoriSu Zona Privada en la web de las fallas
Valors:"panel""mis-fallas"
legacyCodestring | nullopcionalCódigo del sistema viejo (fal35303)
sectorstring | nullopcionaltaxIdstring | nullopcionalNIF de la entidad (solo lo cambia la Junta)
addressstring | nullopcionalcitystring | nullopcionalpostalCodestring | nullopcionalphonestring | nullopcionalTeléfono del casal, solo dígitos
publicEmailstring | nullopcionalCorreo público (directorios de JCF)
localBoardEntityRefDto | nullopcionalJunta local de la que cuelga
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorigroupingEntityRefDto | nullopcionalAgrupación a la que pertenece
idstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorieditableFields"address" | "city" | "postalCode" | "phone" | "publicEmail" | "name" | "officialNumber" | "sector" | "taxId" | "localBoardId" | "groupingId"[]obligatoriCampos que ESTA cuenta puede cambiar (la API decide; la web solo pinta)
Valors:"address""city""postalCode""phone""publicEmail""name""officialNumber""sector""taxId""localBoardId""groupingId"
EntityRefDtoobjectidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatoriErrorBodyDtoobjectcodestringobligatoriValors:"validation""not_found""forbidden""unauthorized""invalid_credentials""conflict""person_exists""census_closed""rate_limited""no_impersonation""unavailable""payload_too_large""not_implemented""internal"
messagestringobligatoriTexto para personas (castellano); la web traduce por code
detailsobject (clave → valor)opcionalEn validation: campo → problemas
requestIdstringobligatoriEl mismo que la cabecera X-Request-Id; búscalo en audit_log y en los logs
EventDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionalNula si la audiencia no lo deja ver
descriptionVastring | nullopcionalstartsAtstringobligatoriendsAtstring | nullopcionalplacestring | nullopcionalkindstringobligatoriValors:"junta""ffmm""otro"
hiddenbooleanobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
EventListDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorititleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionalNula si la audiencia no lo deja ver
descriptionVastring | nullopcionalstartsAtstringobligatoriendsAtstring | nullopcionalplacestring | nullopcionalkindstringobligatoriValors:"junta""ffmm""otro"
hiddenbooleanobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
ExerciseDtoobjectidstring (uuid)obligatorilabelstringobligatoriExemple: "2026-27"
opensAtstring (date-time)obligatoriclosesAtstring (date-time) | nullopcionalisCurrentbooleanobligatoriphasestringobligatoriValors:"planned""open""census_closed""constitution""closed"
allowedOperations"census.register" | "census.leave" | "census.office" | "census.edit"[]obligatoriOperaciones del censo que la fase permite (ADR 0013); la web solo esconde botones
Valors:"census.register""census.leave""census.office""census.edit"
categoryCutoffstring (date)obligatoriFecha de corte para la categoría (14 años cumplidos a San José, configurable)
adultAgenumberobligatoriAños cumplidos a la fecha de corte para pasar a mayores en este ejercicio (ADR 0018)
sheetsDeadlinestring (date-time) | nullopcionalFecha límite de entrega de las Hojas de Constitución (spec 16; informativa)
requiredOffices"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"[]obligatoriCargos obligatorios de la comprobación de censos (spec 16)
Valors:"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"
FacetValueDtoobjectvaluestringobligatoriValor del filtro (enumeración o, en sections, el rótulo en castellano)
labelVastring | nullopcionalSolo en sections: el rótulo en valenciano
countnumberobligatoriCuántos casan con este valor y los demás filtros
FileDtoobjectidstringobligatoritypestringobligatoriValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
mimeTypestringobligatorisizenumberobligatorioriginalNamestringobligatorisha256stringobligatoriSHA-256 del contenido (hex)
purposestringobligatoriValors:"document""communication""registry""message""receipt""procedure""candidacy""brand""award"
createdAtstringobligatoriFormConditionDtoobjectfieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
FormFieldDtoobjectkeystringobligatori/^[a-z][a-z0-9_]{0,47}$/typestringobligatoriValors:"text""textarea""number""date""time""datetime""select""multiselect""boolean""file""address""person_from_census""entity""amount""repeatable_group""custom_code"
labelEsstringobligatorilabelVastringobligatorihelpEsstringopcionalhelpVastringopcionalrequiredbooleanopcionalSe ve solo si se cumplen todas
fieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
minLengthnumberopcionalmaxLengthnumberopcionalpatternstringopcionalExpresión regular (texto entero)
minnumberopcionalmaxnumberopcionalvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriminItemsnumberopcionalmaxItemsnumberopcionalaccept"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]opcionalValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
codestringopcionalcustom_code: declarado, NO implementado (publicar → 501 not_implemented)
Solo repeatable_group
FormFlowDtoobjectkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
FormFlowStageDtoobjectkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
FormOptionDtoobjectvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriFormPresenterDtoobjectnamestringobligatoriClave del campo con el nombre (con sesión, la API pone el de la entidad)
emailstringobligatoriClave del campo con el correo
phonestringopcionalnationalIdstringopcionalFormSchemaDtoobjectkeystringobligatori/^[a-z][a-z0-9_]{0,47}$/typestringobligatoriValors:"text""textarea""number""date""time""datetime""select""multiselect""boolean""file""address""person_from_census""entity""amount""repeatable_group""custom_code"
labelEsstringobligatorilabelVastringobligatorihelpEsstringopcionalhelpVastringopcionalrequiredbooleanopcionalSe ve solo si se cumplen todas
fieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
minLengthnumberopcionalmaxLengthnumberopcionalpatternstringopcionalExpresión regular (texto entero)
minnumberopcionalmaxnumberopcionalvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriminItemsnumberopcionalmaxItemsnumberopcionalaccept"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]opcionalValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
codestringopcionalcustom_code: declarado, NO implementado (publicar → 501 not_implemented)
Solo repeatable_group
noticeEsstringopcionalAviso previo (castellano)
noticeVastringopcionalkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
presenterFormPresenterDtoopcionalQuién presenta, con campos del formulario: sin él no se presenta sin sesión
namestringobligatoriClave del campo con el nombre (con sesión, la API pone el de la entidad)
emailstringobligatoriClave del campo con el correo
phonestringopcionalnationalIdstringopcionalFormVersionDtoobjectidstringobligatoriformIdstringobligatoriversionnumberobligatorikeystringobligatori/^[a-z][a-z0-9_]{0,47}$/typestringobligatoriValors:"text""textarea""number""date""time""datetime""select""multiselect""boolean""file""address""person_from_census""entity""amount""repeatable_group""custom_code"
labelEsstringobligatorilabelVastringobligatorihelpEsstringopcionalhelpVastringopcionalrequiredbooleanopcionalSe ve solo si se cumplen todas
fieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
minLengthnumberopcionalmaxLengthnumberopcionalpatternstringopcionalExpresión regular (texto entero)
minnumberopcionalmaxnumberopcionalvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriminItemsnumberopcionalmaxItemsnumberopcionalaccept"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]opcionalValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
codestringopcionalcustom_code: declarado, NO implementado (publicar → 501 not_implemented)
Solo repeatable_group
noticeEsstringopcionalAviso previo (castellano)
noticeVastringopcionalkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
presenterFormPresenterDtoopcionalQuién presenta, con campos del formulario: sin él no se presenta sin sesión
namestringobligatoriClave del campo con el nombre (con sesión, la API pone el de la entidad)
emailstringobligatoriClave del campo con el correo
phonestringopcionalnationalIdstringopcionalpublishedAtstringobligatoriHealthDtoobjectstatusstringobligatoriValors:"ok"
versionstringobligatoritimestring (date-time)obligatoriHistoryRowDtoobjectexercisestringobligatoriExemple: "2025-26"
entityOfficialNumberstringobligatoriNúmero oficial de la falla
entityNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalofficestring | nullopcionalValors:"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"
leftAtstring (date-time) | nullopcionalJobsDtoobjectbackendstringobligatoriDó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
Valors:"memory"
queuednumberobligatorirunningnumberobligatoricapacitynumberobligatoriTope de la cola
LocalizedNoteDtoobjectesstringobligatorivastringobligatoriMenuDtoobjectMenú principal: las páginas que la audiencia deja ver a la sesión (navegación: lo que no puede abrir no sale)
slugstringobligatoripathstringobligatorititleEsstringobligatorititleVastringobligatoriBloque «Zona Privada»: solo con sesión de una entidad
keystringobligatoriValors:"summary""profile""entity""census""procedures""can_submit""exercise_start""awards""ffmm_request""ffmm_candidacies""messages""my_fallas""board_census""board_members"
pathstringobligatorititleEsstringobligatorititleVastringobligatoriSubentradas (las de «Trámites y servicios»)
gestionbooleanobligatoriCon sesión de la Junta: enlace a Gestión JCF
privateZonePathsstring[]obligatoriRutas 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
MenuItemDtoobjectslugstringobligatoripathstringobligatorititleEsstringobligatorititleVastringobligatoriNotificationAddressDtoobjectaddressstringobligatoricitystringobligatoripostalCodestring | nullopcionalOfficeHolderDtoobjectprofileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalOfficesDtoobjectexercisestringobligatoriExemple: "2026-27"
Todos los cargos menos vocal, en el orden de OFFICE_RANK
officestringobligatoriValors:"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"
uniquebooleanobligatoriCargo único (desplaza al anterior)
Ocupantes activos en el ejercicio (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalvocalCountnumberobligatoriPersonas activas con cargo vocal
OfficeSlotDtoobjectofficestringobligatoriValors:"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"
uniquebooleanobligatoriCargo único (desplaza al anterior)
Ocupantes activos en el ejercicio (vacío = sin cubrir)
profileIdstring (uuid)obligatorigivenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalOrganizationDtoobjectofficialNamestringobligatoriExemple: "Junta Central Fallera de València"
shortNamestringobligatoriExemple: "Junta Central Fallera"
legalFormEsstring | nullopcionallegalFormVastring | nullopcionaltaxIdstring | nullopcionalNIF
addressstring | nullopcionalDirección postal (puede tener saltos de línea)
phonestring | nullopcionalemailstring | nullopcionalCorreo general
websitestring | nullopcionalopeningHoursEsstring | nullopcionalopeningHoursVastring | nullopcionaldpoEmailstring | nullopcionalCorreo del Delegado de Protección de Datos
labelstringobligatoriNombre de la red tal como se enseña (Instagram, Facebook…)
urlstringobligatoriEnlace https
logoUrlstring | nullopcionalLogo subido por la Junta (GET /org/logo); null = el provisional del kit
legalFooterEsstring | nullopcionalPie legal corto (castellano)
legalFooterVastring | nullopcionalupdatedAtstringobligatoriOrgSocialLinkDtoobjectlabelstringobligatoriNombre de la red tal como se enseña (Instagram, Facebook…)
urlstringobligatoriEnlace https
PageDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoripathstringobligatoriRuta en la web de las fallas
kindstringobligatoriValors:"content""link"
titleEsstringobligatorititleVastringobligatoribodyEsstringobligatoriMarkdown; vacío si la página está cerrada (locked)
bodyVastringobligatorihiddenbooleanobligatoriNo se lista (se abre por enlace directo si la audiencia lo permite)
lockedbooleanobligatori= !allowed: se enseña el título y el motivo, sin cuerpo
menustring | nullopcionalparentSlugstring | nullopcionalordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
PageListDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoripathstringobligatoriRuta en la web de las fallas
kindstringobligatoriValors:"content""link"
titleEsstringobligatorititleVastringobligatoribodyEsstringobligatoriMarkdown; vacío si la página está cerrada (locked)
bodyVastringobligatorihiddenbooleanobligatoriNo se lista (se abre por enlace directo si la audiencia lo permite)
lockedbooleanobligatori= !allowed: se enseña el título y el motivo, sin cuerpo
menustring | nullopcionalparentSlugstring | nullopcionalordernumberobligatoripublishedAtstring | nullopcionalupdatedAtstringobligatoriactions"view" | "download" | "sign_in_to_download" | "edit"[]obligatoriValors:"view""download""sign_in_to_download""edit"
PaymentPolicyDtoobjectamountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalPresenterDtoobjectnamestringobligatoriPresentador/a
nationalIdstringobligatoriDNI, NIE o NIF (CIF)
onBehalfOfstring | nullopcional«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
onBehalfOfNumberstring | nullopcional«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
PrivateZoneItemDtoobjectkeystringobligatoriValors:"summary""profile""entity""census""procedures""can_submit""exercise_start""awards""ffmm_request""ffmm_candidacies""messages""my_fallas""board_census""board_members"
pathstringobligatorititleEsstringobligatorititleVastringobligatoriSubentradas (las de «Trámites y servicios»)
ProcedureTypeDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoridelegationstringobligatoriValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
titleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionaldescriptionVastring | nullopcionalkindstringobligatoriDERIVADO de channel (compatibilidad): online → online; upload_signed → pdf; el resto → document
Valors:"online""pdf""document"
channelstringobligatoriCó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)
Valors:"online""upload_signed""in_person""by_email""via_contact""external"
channelNoteEsstring | nullopcionalDónde, cómo y horario (castellano)
channelNoteVastring | nullopcionalhiddenbooleanobligatoriopensAtstring | nullopcionalclosesAtstring | nullopcionalwindowstringobligatoriPlazo: sin plazo, abierto, aún no abierto o cerrado
Valors:"always""open""not_yet""closed"
windowNoteEsstring | nullopcionalwindowNoteVastring | nullopcionaldocumentIdstring | nullopcionalImpreso de la biblioteca (GET /documents/{id}/file)
hasFormbooleanobligatoriTiene formulario publicado (se puede presentar en línea)
paymentPolicyPaymentPolicyDto | nullopcionalPago con justificante; nulo = sin pago
amountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalsheetPendingReviewbooleanobligatoriLa ficha es un texto de partida pendiente de que la Junta lo revise
responsibleDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ordernumberobligatoriactions"view" | "download" | "do_online" | "sign_in" | "do_anonymous" | "edit"[]obligatoriBotones para ESTA sesión (los calcula la API)
Valors:"view""download""do_online""sign_in""do_anonymous""edit"
ProcedureTypeListDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoridelegationstringobligatoriValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
titleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionaldescriptionVastring | nullopcionalkindstringobligatoriDERIVADO de channel (compatibilidad): online → online; upload_signed → pdf; el resto → document
Valors:"online""pdf""document"
channelstringobligatoriCó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)
Valors:"online""upload_signed""in_person""by_email""via_contact""external"
channelNoteEsstring | nullopcionalDónde, cómo y horario (castellano)
channelNoteVastring | nullopcionalhiddenbooleanobligatoriopensAtstring | nullopcionalclosesAtstring | nullopcionalwindowstringobligatoriPlazo: sin plazo, abierto, aún no abierto o cerrado
Valors:"always""open""not_yet""closed"
windowNoteEsstring | nullopcionalwindowNoteVastring | nullopcionaldocumentIdstring | nullopcionalImpreso de la biblioteca (GET /documents/{id}/file)
hasFormbooleanobligatoriTiene formulario publicado (se puede presentar en línea)
paymentPolicyPaymentPolicyDto | nullopcionalPago con justificante; nulo = sin pago
amountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalsheetPendingReviewbooleanobligatoriLa ficha es un texto de partida pendiente de que la Junta lo revise
responsibleDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ordernumberobligatoriactions"view" | "download" | "do_online" | "sign_in" | "do_anonymous" | "edit"[]obligatoriBotones para ESTA sesión (los calcula la API)
Valors:"view""download""do_online""sign_in""do_anonymous""edit"
ProcedureTypeSheetDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
idstringobligatorislugstringobligatoridelegationstringobligatoriValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
titleEsstringobligatorititleVastringobligatoridescriptionEsstring | nullopcionaldescriptionVastring | nullopcionalkindstringobligatoriDERIVADO de channel (compatibilidad): online → online; upload_signed → pdf; el resto → document
Valors:"online""pdf""document"
channelstringobligatoriCó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)
Valors:"online""upload_signed""in_person""by_email""via_contact""external"
channelNoteEsstring | nullopcionalDónde, cómo y horario (castellano)
channelNoteVastring | nullopcionalhiddenbooleanobligatoriopensAtstring | nullopcionalclosesAtstring | nullopcionalwindowstringobligatoriPlazo: sin plazo, abierto, aún no abierto o cerrado
Valors:"always""open""not_yet""closed"
windowNoteEsstring | nullopcionalwindowNoteVastring | nullopcionaldocumentIdstring | nullopcionalImpreso de la biblioteca (GET /documents/{id}/file)
hasFormbooleanobligatoriTiene formulario publicado (se puede presentar en línea)
paymentPolicyPaymentPolicyDto | nullopcionalPago con justificante; nulo = sin pago
amountCentsnumberobligatoriImporte en céntimos (0 = según las bases de la convocatoria)
Exemple: 13000
conceptstringobligatoriConcepto que hay que poner en la transferencia o el ingreso
Exemple: "Fianza Concurs de Playback"
ibanstring | nullopcionalCuenta (IBAN, sin espacios; se comprueba el control)
proofRequiredbooleanobligatoriEl expediente exige el justificante como anexo (role: payment_proof)
Valors:true
noteEsstring | nullopcionalCómo pagar, en castellano (plazo, autoliquidación…)
noteVastring | nullopcionalsheetPendingReviewbooleanobligatoriLa ficha es un texto de partida pendiente de que la Junta lo revise
responsibleDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
ordernumberobligatoriactions"view" | "download" | "do_online" | "sign_in" | "do_anonymous" | "edit"[]obligatoriBotones para ESTA sesión (los calcula la API)
Valors:"view""download""do_online""sign_in""do_anonymous""edit"
whoEsstring | nullopcionalwhoVastring | nullopcionalhowEsstring | nullopcionalhowVastring | nullopcionalrequirementsEsstring | nullopcionalrequirementsVastring | nullopcionalregulationEsstring | nullopcionalregulationVastring | nullopcionalminnumberobligatorimaxnumberobligatoritypes"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]obligatoriValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
maxSizeMbnumberobligatoriformFormVersionDto | nullopcionalEl formulario que se presenta hoy (solo online)
idstringobligatoriformIdstringobligatoriversionnumberobligatorikeystringobligatori/^[a-z][a-z0-9_]{0,47}$/typestringobligatoriValors:"text""textarea""number""date""time""datetime""select""multiselect""boolean""file""address""person_from_census""entity""amount""repeatable_group""custom_code"
labelEsstringobligatorilabelVastringobligatorihelpEsstringopcionalhelpVastringopcionalrequiredbooleanopcionalSe ve solo si se cumplen todas
fieldstringobligatoriClave de un campo ANTERIOR
opstringobligatoriValors:"equals""not_equals""in""filled""empty"
valuestring | number | boolean | string[]opcionalTexto, número, sí/no o lista (con in)
minLengthnumberopcionalmaxLengthnumberopcionalpatternstringopcionalExpresión regular (texto entero)
minnumberopcionalmaxnumberopcionalvaluestringobligatori/^[a-z0-9_-]{1,60}$/labelEsstringobligatorilabelVastringobligatoriminItemsnumberopcionalmaxItemsnumberopcionalaccept"pdf" | "jpg" | "png" | "docx" | "xlsx" | "zip" | "mp3"[]opcionalValors:"pdf""jpg""png""docx""xlsx""zip""mp3"
codestringopcionalcustom_code: declarado, NO implementado (publicar → 501 not_implemented)
Solo repeatable_group
noticeEsstringopcionalAviso previo (castellano)
noticeVastringopcionalkeystringobligatorilabelEsstringobligatorilabelVastringobligatorirolestringobligatoriRol que resuelve la etapa
presenterFormPresenterDtoopcionalQuién presenta, con campos del formulario: sin él no se presenta sin sesión
namestringobligatoriClave del campo con el nombre (con sesión, la API pone el de la entidad)
emailstringobligatoriClave del campo con el correo
phonestringopcionalnationalIdstringopcionalpublishedAtstringobligatoriProfileDtoobjectidstring (uuid)obligatoriidstring (uuid)obligatorikindstringobligatoriValors:"comision""junta_local""falla_municipio""agrupacion"
officialNumberstringobligatorislugstringobligatorinamestringobligatorijcfCensusNumberstring | nullopcional«Num. Censo en JCF» de ESTA ficha
givenNamestringobligatorifamilyNamestringobligatoribirthDatestring (date) | nullopcionalsexstring | nullopcionalValors:"hombre""mujer"
idKindstringobligatoriValors:"dni""menor""extranjero"
nationalIdstring | nullopcionalreferencestring | nullopcionaladdressstring | nullopcionalcitystring | nullopcionalpostalCodestring | nullopcionalphone1string | nullopcionalphone2string | nullopcionalemailstring | nullopcionalexercisestringobligatoriEjercicio de entry
Exemple: "2026-27"
entryCensusRowDto | nullopcionalEntrada de la ficha en ese ejercicio (null = no está en ese censo)
entryIdstring (uuid)obligatoriprofileIdstring (uuid)obligatoricensusNumbernumber | nullopcionalNº de censo en falla
givenNamestringobligatorifamilyNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
officestring | nullopcionalValors:"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"
joinedAtstring (date-time)obligatorileftAtstring (date-time) | nullopcionalleaveReasonstring | nullopcionalValors:"voluntaria""traslado""fallecimiento""expulsion""otro"
leaveNotestring | nullopcionaldistintiuArgentnumber | nullopcionaldistintiuOrnumber | nullopcionalbunyolArgentnumber | nullopcionalbunyolOrnumber | nullopcionalbunyolFullesnumber | nullopcionalbunyolBrillantsnumber | nullopcionalHistorial de la PERSONA (todas sus fichas), en lectura, como hoy
exercisestringobligatoriExemple: "2025-26"
entityOfficialNumberstringobligatoriNúmero oficial de la falla
entityNamestringobligatoricategorystringobligatoriValors:"infantil""mayor"
censusNumbernumber | nullopcionalofficestring | nullopcionalValors:"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"
leftAtstring (date-time) | nullopcionalhistoryNoteLocalizedNoteDtoobligatoriAviso de que el historial puede no ser completo
esstringobligatorivastringobligatoripersonIdstring (uuid)opcionalSolo para la Junta (person:read): la persona global
PublicSubmissionConfigDtoobjectstatusstringobligatoriturnstile: 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
Valors:"turnstile""quota_only"
siteKeystring | nullopcionalClave de sitio de Turnstile (pública) para el widget del navegador; nula en quota_only
ticketTtlSecondsnumberobligatoriValidez del ticket, en segundos
quotaPerHournumberobligatoriPresentaciones sin sesión por IP y hora que admite este servidor (PUBLIC_SUBMISSION_QUOTA_PER_HOUR; la mitad en quota_only)
PublicTicketDtoobjectticketstringobligatoriTicket para UNA presentación sin sesión y sus adjuntos (cabecera o campo publicTicket)
expiresAtstringobligatoriverificationstringobligatoriCómo se comprobó que hay una persona: con el captcha o solo con la cuota (ADR 0025)
Valors:"turnstile""none"
PublicTicketRequestDtoobjectturnstileTokenstringopcionalEl 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)
PublicUploadDtoobjectfilestring (binary)obligatoriEl fichero (por BYTES: PDF o JPG en el registro; PDF, JPG, PNG o MP3 en un trámite)
purposestringobligatoriValors:"registry""procedure"
publicTicketstringobligatoriEl ticket de POST /public-submission/ticket
ReadyDtoobjectdatabasestringobligatoriValors:"ok""error"
valkeystringobligatorinot_configured si no hay VALKEY_URL (las cuotas van en memoria)
Valors:"ok""error""not_configured"
backendstringobligatoriDó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
Valors:"memory"
queuednumberobligatorirunningnumberobligatoricapacitynumberobligatoriTope de la cola
RegistryAttachmentDtoobjectfileIdstringobligatoridescriptionstringobligatorinamestringobligatorisizenumberobligatoritypestringobligatoriRegistryAttachmentInputDtoobjectfileIdstringobligatoriFichero subido con POST /files (purpose registry: PDF o JPG)
descriptionstringobligatori«Describa el documento»
RegistryContactDtoobjectphonestringobligatoriemailstringobligatoriEn POST /registry con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)
RegistryCreatedDtoobjectidstringobligatorinumberstringobligatoriExemple: "2026/000123"
registeredAtstringobligatorichannelstringobligatoriValors:"telematic""in_person"
subjectstringobligatorikindstringobligatoriValors:"documents_only""request"
namestringobligatoriPresentador/a
nationalIdstringobligatoriDNI, NIE o NIF (CIF)
onBehalfOfstring | nullopcional«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
onBehalfOfNumberstring | nullopcional«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
phonestringobligatoriemailstringobligatoriEn POST /registry con sesión de entidad se IGNORA: es el correo de la cuenta (se cambia en «Compte d'accés»)
addressstringobligatoricitystringobligatoripostalCodestring | nullopcionalexposestring | nullopcionalrequeststring | nullopcionalentityIdstring | nullopcionalentityNamestring | nullopcionalauthenticatedbooleanobligatoriADR 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)
verificationstring | nullopcionalSolo sin autenticar: turnstile (pasó el captcha) o none (solo la cuota por IP)
Valors:"turnstile""none"
procedureIdstring | nullopcionalExpediente ligado (spec 14)
fileIdstringobligatoridescriptionstringobligatorinamestringobligatorisizenumberobligatoritypestringobligatorireceiptFileIdstring | nullopcionalreceiptStatusstringobligatoriJustificante PDF: not_configured = no hay Chromium en el servidor
Valors:"pending""ok""not_configured""failed"
statusstringobligatoriValors:"received""classified""closed"
assignedDelegationstring | nullopcionalValors:"cultura_solidaridad""deportes""festejos""infantiles_juventud""juveniles""relaciones_publicas_protocolo""incidencias""fallas""pirotecnia""censos""recompensas""medios_comunicacion""secretaria""juntas_locales"
notestring | nullopcionalSolo en Gestión JCF
closedAtstring | nullopcionalackMailstringobligatoriAcuse por correo al presentador; pending = el justificante y el acuse siguen en segundo plano (la respuesta no espera a Chromium ni al correo)
Valors:"sent""logged""failed""pending"
SearchGroupDtoobjecttypestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
totalnumberobligatoriResultados de este tipo en total (hasta 500 entre todos)
Los primeros perGroup; el resto, con types=<tipo>
modestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared
SearchPageDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared
nextCursorstring | nullopcionaltotalnumberobligatoriResultados en total (hasta 500)
Los mismos resultados agrupados por tipo; los grupos van por su mejor puntuación
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
totalnumberobligatoriResultados de este tipo en total (hasta 500 entre todos)
Los primeros perGroup; el resto, con types=<tipo>
modestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared
scopestringobligatoriComo 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)
Valors:"anonymous""entity""junta"
SearchResultDtoobjectmodestringobligatoriValors:"public""authenticated""rules""staff"
Solo con mode: rules
kinds"comision" | "junta_local" | "falla_municipio" | "agrupacion"[]opcionalValors:"comision""junta_local""falla_municipio""agrupacion"
sectorsstring[]opcionalSectores de València (los de las entidades)
localBoardsstring[]opcionalIds de juntas locales: casa la junta local y sus fallas de municipio
groupingsstring[]opcionalIds de agrupaciones: casa la agrupación y sus comisiones
entitiesstring[]opcionalIds de entidades concretas
citiesstring[]opcionalMunicipios
categoriesstring[]opcionalReservado (categoría/sección de la falla): hoy no casa con ninguna entidad
audienceLabelEsstringobligatoriLa frase de la ficha en castellano («Para: comisiones de València del sector X»)
audienceLabelVastringobligatoriLa frase en valenciano
allowedbooleanobligatoriLa sesión (o la credencial) puede abrirlo o presentarlo
reasonstring | nullopcionalanonymous accede; not_for_entity no es para tu entidad; closed fuera de plazo
Valors:"anonymous""not_for_entity""closed"
typestringobligatoriValors:"section""procedure_type""procedure""person""thread""entity""registry_entry""document""page""communication""event"
idstringobligatoripathstringobligatoriRuta en la web de las fallas
titlestringobligatoriTítulo en el idioma pedido
titleEsstringobligatorititleVastringobligatorisnippetstring | nullopcionalFragmento alrededor del texto encontrado (nulo si no hay cuerpo o no se puede abrir)
datestring | nullopcionalFecha relevante (publicación, envío, inicio del acto, cierre del plazo)
zonestringobligatoripublic zona pública; private Zona Privada de la entidad de la sesión; gestion Gestión JCF (la ruta empieza por /gestion)
Valors:"public""private""gestion"
isActionbooleanobligatoriSección o pantalla que es una ACCIÓN («Dar de alta un fallero»), no un lugar
subtitlestring | nullopcionalDato corto que lo identifica (nº de registro, nº de censo, nº de la entidad…), sin datos personales de más
opensAtstring | nullopcionalTrámite: apertura del plazo
closesAtstring | nullopcionalTrámite: cierre del plazo
matchstringobligatoriCómo casó: exacta, el título empieza por la consulta, en el título, por sinónimo, en el cuerpo
Valors:"exact""prefix""title""synonym""body"
scorenumberobligatoriPuntuación (mayor = antes); la regla es rankHit de @jcf/shared