Referencia de la API
Cada ruta que sirve la API, quién puede llamarla y cómo funcionan el inicio de sesión, los permisos, los errores y la paginación.
Para el paquete Full Stack
URL base y formato de respuesta
Todas las rutas se sirven bajo el prefijo /api. En local, la URL base es http://localhost:8000/api. En un servidor es la dirección de tu API seguida de /api, el mismo valor que el panel lee de NEXT_PUBLIC_API_BASE_URL (Variables de entorno).
Los miembros y el personal usan el mismo inicio de sesión y el mismo token; los roles de la cuenta deciden qué rutas responden. Los cuerpos de las peticiones son JSON, salvo las subidas de archivos. Cada respuesta llega en el mismo envoltorio:
{
"success": true,
"data": { },
"message": ""
}data contiene el resultado. message es una frase corta que rellenan algunas escrituras, traducida al idioma de la solicitud, y vacía en los demás casos.
La comprobación de salud es la única ruta fuera del envoltorio. No necesita token y no tiene límite de peticiones:
curl http://localhost:8000/api/health{"status":"ok"}Responde 503 con {"status":"unavailable"} mientras no se puede acceder a la base de datos o no tiene tablas, así que una plataforma puede usarla como sonda de disponibilidad.
Errores
Una solicitud fallida responde con el estado HTTP correspondiente y el mismo envoltorio, con success: false, data: null y, en la validación, los problemas por campo:
{
"success": false,
"data": null,
"message": "<the first field's problem>",
"errors": {
"email": ["<the problem with email>"]
}
}| Estado | Cuándo |
|---|---|
400 | Un campo no pasó la validación, o el cuerpo contiene un campo que la ruta no acepta: los campos desconocidos se rechazan, no se ignoran. También una subida sin bucket configurado. |
401 | Falta el token o ha caducado, un inicio de sesión fallido (la misma respuesta tanto si el correo no tiene cuenta como si la contraseña es incorrecta), o falta la clave de ingesta o es desconocida. |
403 | Los roles de la cuenta no conceden el permiso de la ruta: "You need one of these permissions: …". |
404 | No existe ese registro, o es un registro que no pertenece a quien llama. |
409 | Una eliminación que rompería algo que todavía usa el registro, como exercise_in_use. |
429 | Más de 10 intentos en un minuto desde una dirección en la ruta de inicio de sesión, registro o eliminación de cuenta. La cabecera Retry-After indica cuántos segundos esperar. |
503 | La comprobación de salud antes de que la base de datos esté lista. |
500 | Un fallo inesperado. El mensaje sigue siendo genérico y los detalles van al registro de la API. |
Muchos errores llevan en message una clave que traduce el panel, como member_not_found o event_full.
Paginación
Las listas reciben page, desde 1, y page_count, el tamaño de página. Una página contiene como máximo 100 filas: un tamaño mayor se lee como 100, uno menor como 1, y uno ausente o ilegible recurre al valor por defecto de la lista. Una lista responde siempre con la misma forma:
{
"success": true,
"data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
"message": ""
}| Lista | Tamaño de página por defecto |
|---|---|
| Miembros, los catálogos de contenido | 15 |
| Coaches, roles, ajustes | 10 |
Las listas de contenido se ordenan por updated_at, de la más reciente a la más antigua por defecto (order=asc o desc), con el id para desempatar, y aceptan search y sus propios filtros.
Idioma
Envía el idioma del lector en la cabecera Accept-Language: en o ar tal como vienen. ar-SA cuenta como árabe, y cualquier idioma que la API no tenga se responde en inglés. Los mensajes de error y el message de una escritura correcta se traducen; el contenido guardado en los dos idiomas vuelve como { "en": "...", "ar": "..." }.
Autenticación
- Inicia sesión en
POST /api/auth/login. La respuesta contieneaccess_token, un JWT firmado conJWT_SECRET, y la cuenta con sus roles y permisos. Envíalo comoAuthorization: Bearer <token>. - Un token dura
JWT_EXPIRATION,7dpor defecto. No hay ruta de renovación: cuando un token caduca, la siguiente petición responde401y el cliente vuelve a iniciar sesión. - El inicio de sesión, el registro y la eliminación de cuenta aceptan 10 intentos por minuto desde una dirección, contados por ruta, y después responden
429. El recuento se guarda en la memoria de la API, así que empieza de nuevo al reiniciar. Detrás de un proxy, consultaTRUST_PROXY(Solución de problemas).
Inicia sesión como el Head Coach de los datos de demostración
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"headcoach@example.com","password":"Coach@123"}'Respuesta{ "success": true, "data": { "access_token": "eyJhbGciOiJIUzI1NiIs...", "token_type": "Bearer", "expires_in": "7d", "account": { "email": "headcoach@example.com", "roles": [ ], "permissions": [ ] } }, "message": "..." }Llama a una ruta protegida con el token
Terminalcurl "http://localhost:8000/api/users?page=1&page_count=5" \ -H "Authorization: Bearer <access_token>"Resultado esperado: Los cinco primeros miembros, con la forma de la lista.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/auth/login | Cualquiera | Inicia sesión con cualquier cuenta. Con límite de peticiones. |
POST | /api/auth/register | Cualquiera | Crea una cuenta de miembro (first_name, last_name, email, password de 8 caracteres o más, username opcional) e inicia sesión con ella. Con límite de peticiones. |
GET | /api/auth/me | Cualquier cuenta con la sesión iniciada | La cuenta con sus roles y permisos. |
POST | /api/auth/delete-account | Cualquier cuenta con la sesión iniciada | Cierra la cuenta propia de quien llama después de comprobar password. Con límite de peticiones. |
PATCH | /api/coaches/profile | Cualquier cuenta con la sesión iniciada | Actualiza el perfil propio de quien llama. |
PATCH | /api/coaches/profile/password | Cualquier cuenta con la sesión iniciada | Cambia la contraseña propia de quien llama. |
No hay ninguna ruta para restablecer la contraseña. Las páginas de contraseña olvidada y de restablecer contraseña del panel son solo las pantallas: no se envía ningún restablecimiento. Una cuenta de personal con members.update establece la contraseña de un miembro con PATCH /api/users/:username/change-password.
Cambia las contraseñas de los datos iniciales
Las cuentas de demostración usan contraseñas publicadas: Coach@123, Member@123, Trainer@123, staff123 para el resto del personal y password123 para el resto de los miembros. Cámbialas, o empieza con tablas vacías, antes de publicar nada.
Permisos
Una ruta comprueba primero el token y luego el permiso que indica. Una cuenta tiene todos los permisos de todos sus roles; cuando una ruta indica varios, basta con uno cualquiera. En las tablas de abajo, un nombre de permiso en Quién puede llamarla significa una cuenta cuyos roles lo conceden.
Miembros
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/users | members.view | Una página de miembros (order, search, email, phone, country_id, username, first_name, last_name, from_date, to_date, verified). |
GET | /api/users/statistic | members.view | Recuentos de miembros para la pantalla Gym. |
GET | /api/users/:username | members.view | Un miembro. |
POST | /api/users | members.create | Crea un miembro. |
PATCH | /api/users/:username | members.update | Actualiza un miembro. |
PATCH | /api/users/:username/change-password | members.update | Fija la contraseña de un miembro. |
POST | /api/users/:username/resend-verification-email | members.update | Responde con éxito; no se envía ningún correo, ya que no se incluye transporte de correo. |
POST | /api/users/:username/make-verified | members.verify | Marca el correo como verificado. |
POST | /api/users/:username/make-unverified | members.verify | Lo marca como no verificado. |
DELETE | /api/users/:username | members.delete | Mueve al miembro a la lista de eliminados. |
GET | /api/users/deleted | members.view | Una página de miembros eliminados. |
GET | /api/users/deleted/:username | members.view | Un miembro eliminado. |
POST | /api/users/deleted/:username/restore | members.restore | Restaura uno. |
Coaches y roles
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/coaches | coaches.view | Una página de cuentas del personal (email, name, phone). |
GET | /api/coaches/statistics | coaches.view | Recuentos del personal. |
GET | /api/coaches/management/roles/select | coaches.view o coaches.assign_roles | Los roles que puede elegir un formulario del personal. |
GET | /api/coaches/:id | coaches.view | Una cuenta del personal, por id o nombre de usuario. |
POST | /api/coaches | coaches.create | Crea una. |
PATCH | /api/coaches/:id | coaches.edit | Actualiza una. |
PATCH | /api/coaches/:id/roles | coaches.assign_roles | Fija sus roles. |
DELETE | /api/coaches/:id | coaches.delete | Elimina una. |
GET | /api/roles | roles.view | Los roles (page, page_count, name, guard_name, created_from, created_to); todos los roles sin page_count. |
GET | /api/roles/statistics | roles.view | Recuentos de roles. |
GET | /api/roles/select | roles.view | Los roles para un desplegable. |
GET | /api/roles/permissions | roles.view | Todos los permisos, por módulo. |
GET | /api/roles/:id | roles.view | Un rol con sus permisos. |
POST | /api/roles | roles.create | Crea un rol. |
PUT | /api/roles/:id | roles.edit | La renombra. |
POST | /api/roles/:id/permissions | roles.assign_permissions | Fija sus permisos. |
DELETE | /api/roles/:id | roles.delete | La elimina. |
Ajustes de la aplicación
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/settings | settings.view | Una página de ajustes (search, category, type). |
GET | /api/settings/:key | settings.view | Un ajuste. |
PATCH | /api/settings/:key | settings.edit | Cambia su valor. |
DELETE | /api/settings/:key | settings.edit | La elimina. |
Los datos propios de un miembro
Cada ruta de aquí responde para la cuenta del token y para nadie más. Un token del personal responde 403, porque solo el rol Member tiene fitness.view y fitness.edit. Cada escritura responde con toda la página actualizada.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/fitness/overview | fitness.view | El día del panel: anillos, calorías, sueño, frecuencia cardíaca, entrenamientos, pasos. |
GET | /api/fitness/activity | fitness.view | La página de actividad (granularity days, weeks o months). |
GET | /api/fitness/activity/:slug | fitness.view | Una actividad. |
GET | /api/fitness/nutrition | fitness.view | La página de nutrición. |
POST | /api/fitness/nutrition/meals | fitness.edit | Registra un plato del catálogo en el día de hoy. |
PATCH | /api/fitness/nutrition/hydration | fitness.edit | Fija los vasos de hoy. |
GET | /api/fitness/nutrition/planner | fitness.view | El planificador de un día (date). |
POST | /api/fitness/nutrition/planner | fitness.edit | Registra la comida propia del miembro. |
DELETE | /api/fitness/nutrition/planner/:key | fitness.edit | Elimina una. |
GET | /api/fitness/sleep | fitness.view | La página de sueño. |
POST | /api/fitness/sleep/nights | fitness.edit | Registra una noche. |
DELETE | /api/fitness/sleep/nights/:date | fitness.edit | Elimina una. |
GET | /api/fitness/health | fitness.view | La página de salud. |
POST | /api/fitness/health/readings | fitness.edit | Registra las constantes vitales de un día. |
DELETE | /api/fitness/health/readings/:date | fitness.edit | Las elimina. |
GET | /api/fitness/progress | fitness.view | La página de progreso. |
GET | /api/fitness/progress/photos | fitness.view | La página de fotos (before, after). |
POST | /api/fitness/progress/photos | fitness.edit | Añade un punto de control. |
PATCH | /api/fitness/progress/photos/notes | fitness.edit | Guarda el diario. |
PATCH | /api/fitness/progress/goal | fitness.edit | Fija el objetivo de peso. |
POST | /api/fitness/progress/readings | fitness.edit | Registra una lectura corporal. |
DELETE | /api/fitness/progress/readings/:date | fitness.edit | Elimina una. |
GET | /api/fitness/community | fitness.view | La página de comunidad. |
GET | /api/fitness/community/members/:username | fitness.view | El perfil de un miembro. |
GET | /api/fitness/community/groups/:slug | fitness.view | Un grupo. |
GET | /api/fitness/community/discussions/:slug | fitness.view | Un debate. |
POST | /api/fitness/community/groups/:slug/join | fitness.edit | Se une a un grupo o lo abandona. |
POST | /api/fitness/community/challenges/:slug/join | fitness.edit | Se une a un reto o lo abandona. |
POST | /api/fitness/community/events/:slug/attend | fitness.edit | Asiste a un evento o no. |
POST | /api/fitness/community/groups/:slug/posts | fitness.edit | Escribe una publicación. |
POST | /api/fitness/community/groups/:slug/posts/:postKey/like | fitness.edit | Le da o le quita el me gusta. |
POST | /api/fitness/community/groups/:slug/posts/:postKey/comments | fitness.edit | Comenta. |
POST | /api/fitness/community/discussions/:slug/replies | fitness.edit | Responde. |
GET | /api/fitness/billing | fitness.view | El plan y sus facturas. Solo lectura. |
GET | /api/fitness/settings-hub | settings.view | Las cifras, alertas, privacidad y apariencia de la página de ajustes. |
PATCH | /api/fitness/settings-hub/notifications | fitness.edit | Los cuatro interruptores de alertas. |
PATCH | /api/fitness/settings-hub/privacy | fitness.edit | Compartir la actividad. |
PATCH | /api/fitness/settings-hub/appearance | settings.view | Tema, acento y movimiento. |
GET | /api/fitness/settings-hub/export | fitness.view | Todo lo que registró el miembro, en JSON. |
GET | /api/fitness/devices | fitness.view | Los dispositivos y la conexión de la cuenta a cada uno. |
POST | /api/fitness/devices/:key/toggle | fitness.edit | Conecta o desconecta uno. |
POST | /api/fitness/devices/:key/sync | fitness.edit | Siempre 400 device_sync_unavailable. |
GET | /api/fitness/devices/keys | fitness.view | Las claves de ingesta de la cuenta. |
POST | /api/fitness/devices/keys | fitness.edit | Crea una; la clave completa solo aparece en esta respuesta. |
DELETE | /api/fitness/devices/keys/:id | fitness.edit | Revoca una. |
Entrenamientos, ejercicios y la sesión
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/fitness/workouts | fitness.view | La página del plan. |
GET | /api/fitness/workouts/programs | fitness.view | Los programas y el activo. |
POST | /api/fitness/workouts/programs/:slug/enroll | fitness.edit | Empieza o detiene un programa. |
GET | /api/fitness/workouts/:slug | fitness.view | Un entrenamiento. |
POST | /api/fitness/workouts/:slug/save | fitness.edit | Lo guarda o deja de guardarlo. |
GET | /api/fitness/exercises | fitness.view | La biblioteca (muscle, equipment, difficulty). |
GET | /api/fitness/exercises/:slug | fitness.view | Un movimiento; registra una visualización. |
POST | /api/fitness/exercises/:slug/save | fitness.edit | Lo guarda o deja de guardarlo. |
POST | /api/fitness/exercises/:slug/log-set | fitness.edit | Registra series, repeticiones y peso. |
GET | /api/fitness/workouts/session | fitness.view | La sesión abierta, abierta a partir del plan de hoy cuando no hay ninguna. |
POST | /api/fitness/workouts/session/sets/:set | fitness.edit | Registra una serie (weightKg, reps, rpe). |
POST | /api/fitness/workouts/session/rest/skip | fitness.edit | Salta el descanso. |
PATCH | /api/fitness/workouts/session/notes | fitness.edit | Guarda la nota. |
POST | /api/fitness/workouts/session/exercises | fitness.edit | Añade un movimiento (slug). |
POST | /api/fitness/workouts/session/exercises/:slug/select | fitness.edit | Lo convierte en el actual. |
DELETE | /api/fitness/workouts/session/exercises/:slug | fitness.edit | Lo quita. |
POST | /api/fitness/workouts/session/finish | fitness.edit | Termina la sesión. |
POST | /api/fitness/workouts/session/restart | fitness.edit | La descarta y empieza de nuevo. |
Coaching
Las rutas de la lista de clientes responden para el coach que hace la petición: el cliente de otro coach es un 404.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/fitness/coaching/clients | coaching.clients | La lista de clientes de quien llama. |
GET | /api/fitness/coaching/clients/:username | coaching.clients | Un cliente. |
GET | /api/fitness/coaching/available-members | coaching.clients | Miembros sin coach. |
POST | /api/fitness/coaching/clients | coaching.clients | Acepta a un miembro (username). |
GET | /api/fitness/coaching/workouts | coaching.clients | Los entrenamientos que puede asignar un coach. |
GET | /api/fitness/coaching/roster/assigned-work | coaching.clients | El trabajo de hoy en toda la lista de clientes. |
GET | /api/fitness/coaching/roster/check-ins | coaching.clients | Los check-ins semanales de esta semana, primero los que no tienen respuesta. |
GET | /api/fitness/coaching/clients/:username/plan | coaching.clients | El trabajo asignado de un cliente. |
POST | /api/fitness/coaching/clients/:username/plan | coaching.clients | Asigna un entrenamiento (workoutSlug, startsOn, note). |
DELETE | /api/fitness/coaching/plan/:id | coaching.clients | Quita una asignación. |
GET | /api/fitness/coaching/clients/:username/messages | coaching.clients | El hilo con un cliente. |
POST | /api/fitness/coaching/clients/:username/messages | coaching.clients | Le escribe (body, attachments). |
GET | /api/fitness/coaching/clients/:username/check-ins | coaching.clients | Los check-ins semanales de un cliente. |
POST | /api/fitness/coaching/check-ins/:id/reply | coaching.clients | Responde a uno (body). |
GET | /api/fitness/coaching/my-coach | fitness.view | El coach del miembro, o null. |
GET | /api/fitness/coaching/my-plan | fitness.view | Lo que asignó el coach. |
GET | /api/fitness/coaching/messages | fitness.view | El hilo del miembro. |
POST | /api/fitness/coaching/messages | fitness.edit | Escribe al coach. |
GET | /api/fitness/coaching/check-ins | fitness.view | Los check-ins semanales del miembro. |
POST | /api/fitness/coaching/check-ins | fitness.edit | Envía el de esta semana (energy, weightKg, notes). |
GET | /api/fitness/coaching/coaches | coaching.assign | Las cuentas con el rol Coach, con su número de clientes. |
GET | /api/fitness/coaching/assignments/:username | coaching.assign | Quién entrena a un miembro. |
POST | /api/fitness/coaching/assignments | coaching.assign | Mueve un miembro a un coach (coachUsername, memberUsername). |
DELETE | /api/fitness/coaching/assignments/:username | coaching.assign | Saca a un miembro de todas las listas de clientes. |
Los catálogos de contenido
Cada catálogo responde a las mismas cinco rutas bajo /api/fitness/manage/<catalogue>, y todas necesitan fitness.manage. Los catálogos son exercises, workouts, programs, dishes, groups, events, challenges, achievements y badges.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/fitness/manage/<catalogue> | fitness.manage | Una página de registros (page, page_count, search, order y los filtros propios del catálogo). |
GET | /api/fitness/manage/<catalogue>/:id | fitness.manage | Un registro. |
POST | /api/fitness/manage/<catalogue> | fitness.manage | Crea uno; un slug o una clave que se omite se genera a partir del nombre en inglés. Responde 201. |
PATCH | /api/fitness/manage/<catalogue>/:id | fitness.manage | Cambia los campos enviados; las listas dentro de un registro se sustituyen por completo. |
DELETE | /api/fitness/manage/<catalogue>/:id | fitness.manage | Lo elimina y responde 200, o 409 mientras algo lo siga usando. |
POST | /api/fitness/manage/exercises/:id/feature | fitness.manage | Convierte este movimiento en el destacado. |
Un id desconocido es 404 record_not_found. Los nombres y textos se envían como { "en": "…", "ar": "…" }; las calorías de un plato nunca se envían, se calculan a partir de sus gramos.
Ingesta
La puerta para dispositivos y agregadores. Estas rutas aceptan una clave de ingesta en X-Api-Key, nunca un token bearer, y solo escriben para la cuenta de la clave.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/ingest/whoami | Una clave de ingesta | La cuenta y el nombre de la clave. |
POST | /api/ingest/daily-metrics | Una clave de ingesta | Inserta o actualiza días de cifras de movimiento (days). |
POST | /api/ingest/sessions | Una clave de ingesta | Registra entrenamientos terminados (sessions). |
Búsqueda, subidas, notificaciones y países
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/search | Cualquier cuenta con la sesión iniciada | Resultados de un término en los tipos que puede abrir quien llama (q, locale, limit). |
POST | /api/helpers/upload | Cualquier cuenta con la sesión iniciada | Sube un archivo (file, hasta 150 MB) al bucket; 400 si no hay bucket configurado. |
POST | /api/helpers/upload-chunk | Cualquier cuenta con la sesión iniciada | Una parte de un archivo más grande (hasta 16 MB por parte). |
GET | /api/notifications | Cualquier cuenta con la sesión iniciada | Las notificaciones de quien llama. |
PATCH | /api/notifications/read-all | Cualquier cuenta con la sesión iniciada | Las marca todas como leídas. |
PATCH | /api/notifications/:id/read | Cualquier cuenta con la sesión iniciada | Marca una como leída. |
DELETE | /api/notifications/:id | Cualquier cuenta con la sesión iniciada | Elimina una. |
GET | /api/helpers/countries | Cualquiera | Países para un desplegable, con etiquetas en el idioma de la petición. |
Dos namespaces de Socket.IO en el mismo servidor envían actualizaciones en vivo: /notifications entrega cada notificación nueva, y /auth avisa a un panel con la sesión iniciada de que sus permisos han cambiado. Aceptan los orígenes de FRONTEND_URL, o de CORS_ORIGIN cuando no está configurado.
Asistente de IA
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas de chat, modelo, sugerencias iniciales e historial de chat del asistente.
Servidor MCP
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
La ruta que usa un agente de programación, y la clave que envía.
Rutas del modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas que usa una demostración pública para describirse y dar una cuenta a cada visitante.