{"ok":true,"data":{"name":"EntradaPRO API","version":"2.0.0-api","docs":"docs\/API.md","time":"2026-09-16T19:06:35+02:00","endpoints":{"auth":{"POST \/auth\/login":"Iniciar sesión","POST \/auth\/redeem":"Canjear acceso temporal por QR","GET  \/auth\/me":"Usuario, entidad, membresías y permisos","POST \/auth\/logout":"Revocar la sesión actual"},"departments":{"GET  \/departments":"Listado (filtros: status, q, page, per_page)","GET  \/departments\/show\/{id}":"Detalle","POST \/departments\/create":"Alta (solo entity_admin)","POST \/departments\/update\/{id}":"Modificación parcial","POST \/departments\/delete\/{id}":"Baja (solo si está vacío)"},"initiatives":{"GET  \/initiatives":"Listado (filtros: department_id, status, q)","GET  \/initiatives\/show\/{id}":"Detalle","GET  \/initiatives\/events\/{id}":"Eventos de la iniciativa","POST \/initiatives\/create":"Alta","POST \/initiatives\/update\/{id}":"Modificación parcial","POST \/initiatives\/delete\/{id}":"Baja (solo sin eventos)"},"events":{"GET  \/events":"Listado (filtros: status, department_id, initiative_id, from, to, q)","GET  \/events\/show\/{id}":"Ficha completa del evento","GET  \/events\/stats\/{id}":"Series para las gráficas del panel","POST \/events\/create":"Alta","POST \/events\/update\/{id}":"Modificación parcial","POST \/events\/delete\/{id}":"Baja (solo sin entradas ni escaneos)"},"zones":{"GET  \/zones\/list\/{event_id}":"Zonas del evento y reparto de aforo","GET  \/zones\/show\/{id}":"Detalle","POST \/zones\/create":"Alta","POST \/zones\/update\/{id}":"Modificación parcial","POST \/zones\/delete\/{id}":"Baja (solo sin entradas)"},"tickets":{"GET  \/tickets\/list\/{event_id}":"Listado (filtros: status, modality, type, zone, batch, q)","GET  \/tickets\/show\/{id}":"Detalle con acompañantes","GET  \/tickets\/batches\/{event_id}":"Lotes generados","POST \/tickets\/generate":"Generación en bloque de anónimas (aforo transaccional)","POST \/tickets\/create":"Alta unitaria (anonymous | nominative | nominative_contact)","POST \/tickets\/revoke\/{id}":"Invalidar (exige reason)","POST \/tickets\/cancel\/{id}":"Anular (exige reason)","POST \/tickets\/send":"Enviar entradas (email | manual)","GET  \/tickets\/deliveries\/{event_id}":"Historial de envíos","GET  \/tickets\/pdf\/{id}":"PDF de una entrada (descarga)","POST \/tickets\/pdf-batch":"PDF en bloque o ZIP (descarga)","GET  \/tickets\/prints\/{event_id}":"Historial de impresiones"},"access":{"POST \/access\/scan":"Validar entrada (resultado en el cuerpo, siempre 200)","POST \/access\/exit":"Registrar salida (existe siempre, haya reentrada o no)","POST \/access\/scan-batch":"Sincronizar escaneos hechos sin cobertura","GET  \/access\/occupancy\/{event_id}":"Aforo en tiempo real","GET  \/access\/scans\/{event_id}":"Registro de puerta en vivo (since_id para pedir solo lo nuevo)","GET  \/access\/summary\/{event_id}":"Recuento por resultado"},"users":{"GET  \/users":"Listado (filtros: status, role, scope_type+scope_id, q)","GET  \/users\/show\/{id}":"Ficha con membresías y sesiones activas","POST \/users\/invite":"Alta por invitación (solo entity_admin)","POST \/users\/resend-invite\/{id}":"Nuevo token de invitación","POST \/users\/update\/{id}":"Perfil y estado (suspender corta las sesiones)","POST \/users\/delete\/{id}":"Baja lógica","GET|POST \/users\/memberships\/{id}":"Consultar, otorgar o revocar roles"},"passwords":{"POST \/passwords\/forgot":"Solicitar recuperación (público)","GET  \/passwords\/check\/{token}":"Comprobar el enlace (público)","POST \/passwords\/reset":"Fijar contraseña nueva (público)"},"invitations":{"GET  \/invitations\/show\/{token}":"Datos de la invitación (público)","POST \/invitations\/accept":"Fijar contraseña y activar la cuenta (público)"},"grants":{"POST \/grants\/create":"Acceso temporal por QR (token en claro una sola vez)","GET  \/grants\/list\/{event_id}":"Grants con uso y caducidad (nunca el token)","POST \/grants\/revoke\/{id}":"Revocar el grant y sus sesiones"}}}}