Ir al artículo
Aniq-UI

KinoraReferencia de la API

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:

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:

Terminal
curl http://localhost:8000/api/health
Respuesta
{"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:

Respuesta (400)
{
  "success": false,
  "data": null,
  "message": "<the first field's problem>",
  "errors": {
    "email": ["<the problem with email>"]
  }
}
EstadoCuándo
400Un 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.
401Falta 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.
403Los roles de la cuenta no conceden el permiso de la ruta: "You need one of these permissions: …".
404No existe ese registro, o es un registro que no pertenece a quien llama.
409Una eliminación que rompería algo que todavía usa el registro, como exercise_in_use.
429Má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.
503La comprobación de salud antes de que la base de datos esté lista.
500Un 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:

Respuesta
{
  "success": true,
  "data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
  "message": ""
}
ListaTamaño de página por defecto
Miembros, los catálogos de contenido15
Coaches, roles, ajustes10

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 contiene access_token, un JWT firmado con JWT_SECRET, y la cuenta con sus roles y permisos. Envíalo como Authorization: Bearer <token>.
  • Un token dura JWT_EXPIRATION, 7d por defecto. No hay ruta de renovación: cuando un token caduca, la siguiente petición responde 401 y 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, consulta TRUST_PROXY (Solución de problemas).
  1. Inicia sesión como el Head Coach de los datos de demostración

    Terminal
    curl -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": "..."
    }
  2. Llama a una ruta protegida con el token

    Terminal
    curl "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étodoRutaQuién puede llamarlaQué hace
POST/api/auth/loginCualquieraInicia sesión con cualquier cuenta. Con límite de peticiones.
POST/api/auth/registerCualquieraCrea 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/meCualquier cuenta con la sesión iniciadaLa cuenta con sus roles y permisos.
POST/api/auth/delete-accountCualquier cuenta con la sesión iniciadaCierra la cuenta propia de quien llama después de comprobar password. Con límite de peticiones.
PATCH/api/coaches/profileCualquier cuenta con la sesión iniciadaActualiza el perfil propio de quien llama.
PATCH/api/coaches/profile/passwordCualquier cuenta con la sesión iniciadaCambia 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étodoRutaQuién puede llamarlaQué hace
GET/api/usersmembers.viewUna página de miembros (order, search, email, phone, country_id, username, first_name, last_name, from_date, to_date, verified).
GET/api/users/statisticmembers.viewRecuentos de miembros para la pantalla Gym.
GET/api/users/:usernamemembers.viewUn miembro.
POST/api/usersmembers.createCrea un miembro.
PATCH/api/users/:usernamemembers.updateActualiza un miembro.
PATCH/api/users/:username/change-passwordmembers.updateFija la contraseña de un miembro.
POST/api/users/:username/resend-verification-emailmembers.updateResponde con éxito; no se envía ningún correo, ya que no se incluye transporte de correo.
POST/api/users/:username/make-verifiedmembers.verifyMarca el correo como verificado.
POST/api/users/:username/make-unverifiedmembers.verifyLo marca como no verificado.
DELETE/api/users/:usernamemembers.deleteMueve al miembro a la lista de eliminados.
GET/api/users/deletedmembers.viewUna página de miembros eliminados.
GET/api/users/deleted/:usernamemembers.viewUn miembro eliminado.
POST/api/users/deleted/:username/restoremembers.restoreRestaura uno.

Coaches y roles

MétodoRutaQuién puede llamarlaQué hace
GET/api/coachescoaches.viewUna página de cuentas del personal (email, name, phone).
GET/api/coaches/statisticscoaches.viewRecuentos del personal.
GET/api/coaches/management/roles/selectcoaches.view o coaches.assign_rolesLos roles que puede elegir un formulario del personal.
GET/api/coaches/:idcoaches.viewUna cuenta del personal, por id o nombre de usuario.
POST/api/coachescoaches.createCrea una.
PATCH/api/coaches/:idcoaches.editActualiza una.
PATCH/api/coaches/:id/rolescoaches.assign_rolesFija sus roles.
DELETE/api/coaches/:idcoaches.deleteElimina una.
GET/api/rolesroles.viewLos roles (page, page_count, name, guard_name, created_from, created_to); todos los roles sin page_count.
GET/api/roles/statisticsroles.viewRecuentos de roles.
GET/api/roles/selectroles.viewLos roles para un desplegable.
GET/api/roles/permissionsroles.viewTodos los permisos, por módulo.
GET/api/roles/:idroles.viewUn rol con sus permisos.
POST/api/rolesroles.createCrea un rol.
PUT/api/roles/:idroles.editLa renombra.
POST/api/roles/:id/permissionsroles.assign_permissionsFija sus permisos.
DELETE/api/roles/:idroles.deleteLa elimina.

Ajustes de la aplicación

MétodoRutaQuién puede llamarlaQué hace
GET/api/settingssettings.viewUna página de ajustes (search, category, type).
GET/api/settings/:keysettings.viewUn ajuste.
PATCH/api/settings/:keysettings.editCambia su valor.
DELETE/api/settings/:keysettings.editLa 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étodoRutaQuién puede llamarlaQué hace
GET/api/fitness/overviewfitness.viewEl día del panel: anillos, calorías, sueño, frecuencia cardíaca, entrenamientos, pasos.
GET/api/fitness/activityfitness.viewLa página de actividad (granularity days, weeks o months).
GET/api/fitness/activity/:slugfitness.viewUna actividad.
GET/api/fitness/nutritionfitness.viewLa página de nutrición.
POST/api/fitness/nutrition/mealsfitness.editRegistra un plato del catálogo en el día de hoy.
PATCH/api/fitness/nutrition/hydrationfitness.editFija los vasos de hoy.
GET/api/fitness/nutrition/plannerfitness.viewEl planificador de un día (date).
POST/api/fitness/nutrition/plannerfitness.editRegistra la comida propia del miembro.
DELETE/api/fitness/nutrition/planner/:keyfitness.editElimina una.
GET/api/fitness/sleepfitness.viewLa página de sueño.
POST/api/fitness/sleep/nightsfitness.editRegistra una noche.
DELETE/api/fitness/sleep/nights/:datefitness.editElimina una.
GET/api/fitness/healthfitness.viewLa página de salud.
POST/api/fitness/health/readingsfitness.editRegistra las constantes vitales de un día.
DELETE/api/fitness/health/readings/:datefitness.editLas elimina.
GET/api/fitness/progressfitness.viewLa página de progreso.
GET/api/fitness/progress/photosfitness.viewLa página de fotos (before, after).
POST/api/fitness/progress/photosfitness.editAñade un punto de control.
PATCH/api/fitness/progress/photos/notesfitness.editGuarda el diario.
PATCH/api/fitness/progress/goalfitness.editFija el objetivo de peso.
POST/api/fitness/progress/readingsfitness.editRegistra una lectura corporal.
DELETE/api/fitness/progress/readings/:datefitness.editElimina una.
GET/api/fitness/communityfitness.viewLa página de comunidad.
GET/api/fitness/community/members/:usernamefitness.viewEl perfil de un miembro.
GET/api/fitness/community/groups/:slugfitness.viewUn grupo.
GET/api/fitness/community/discussions/:slugfitness.viewUn debate.
POST/api/fitness/community/groups/:slug/joinfitness.editSe une a un grupo o lo abandona.
POST/api/fitness/community/challenges/:slug/joinfitness.editSe une a un reto o lo abandona.
POST/api/fitness/community/events/:slug/attendfitness.editAsiste a un evento o no.
POST/api/fitness/community/groups/:slug/postsfitness.editEscribe una publicación.
POST/api/fitness/community/groups/:slug/posts/:postKey/likefitness.editLe da o le quita el me gusta.
POST/api/fitness/community/groups/:slug/posts/:postKey/commentsfitness.editComenta.
POST/api/fitness/community/discussions/:slug/repliesfitness.editResponde.
GET/api/fitness/billingfitness.viewEl plan y sus facturas. Solo lectura.
GET/api/fitness/settings-hubsettings.viewLas cifras, alertas, privacidad y apariencia de la página de ajustes.
PATCH/api/fitness/settings-hub/notificationsfitness.editLos cuatro interruptores de alertas.
PATCH/api/fitness/settings-hub/privacyfitness.editCompartir la actividad.
PATCH/api/fitness/settings-hub/appearancesettings.viewTema, acento y movimiento.
GET/api/fitness/settings-hub/exportfitness.viewTodo lo que registró el miembro, en JSON.
GET/api/fitness/devicesfitness.viewLos dispositivos y la conexión de la cuenta a cada uno.
POST/api/fitness/devices/:key/togglefitness.editConecta o desconecta uno.
POST/api/fitness/devices/:key/syncfitness.editSiempre 400 device_sync_unavailable.
GET/api/fitness/devices/keysfitness.viewLas claves de ingesta de la cuenta.
POST/api/fitness/devices/keysfitness.editCrea una; la clave completa solo aparece en esta respuesta.
DELETE/api/fitness/devices/keys/:idfitness.editRevoca una.

Entrenamientos, ejercicios y la sesión

MétodoRutaQuién puede llamarlaQué hace
GET/api/fitness/workoutsfitness.viewLa página del plan.
GET/api/fitness/workouts/programsfitness.viewLos programas y el activo.
POST/api/fitness/workouts/programs/:slug/enrollfitness.editEmpieza o detiene un programa.
GET/api/fitness/workouts/:slugfitness.viewUn entrenamiento.
POST/api/fitness/workouts/:slug/savefitness.editLo guarda o deja de guardarlo.
GET/api/fitness/exercisesfitness.viewLa biblioteca (muscle, equipment, difficulty).
GET/api/fitness/exercises/:slugfitness.viewUn movimiento; registra una visualización.
POST/api/fitness/exercises/:slug/savefitness.editLo guarda o deja de guardarlo.
POST/api/fitness/exercises/:slug/log-setfitness.editRegistra series, repeticiones y peso.
GET/api/fitness/workouts/sessionfitness.viewLa sesión abierta, abierta a partir del plan de hoy cuando no hay ninguna.
POST/api/fitness/workouts/session/sets/:setfitness.editRegistra una serie (weightKg, reps, rpe).
POST/api/fitness/workouts/session/rest/skipfitness.editSalta el descanso.
PATCH/api/fitness/workouts/session/notesfitness.editGuarda la nota.
POST/api/fitness/workouts/session/exercisesfitness.editAñade un movimiento (slug).
POST/api/fitness/workouts/session/exercises/:slug/selectfitness.editLo convierte en el actual.
DELETE/api/fitness/workouts/session/exercises/:slugfitness.editLo quita.
POST/api/fitness/workouts/session/finishfitness.editTermina la sesión.
POST/api/fitness/workouts/session/restartfitness.editLa 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étodoRutaQuién puede llamarlaQué hace
GET/api/fitness/coaching/clientscoaching.clientsLa lista de clientes de quien llama.
GET/api/fitness/coaching/clients/:usernamecoaching.clientsUn cliente.
GET/api/fitness/coaching/available-memberscoaching.clientsMiembros sin coach.
POST/api/fitness/coaching/clientscoaching.clientsAcepta a un miembro (username).
GET/api/fitness/coaching/workoutscoaching.clientsLos entrenamientos que puede asignar un coach.
GET/api/fitness/coaching/roster/assigned-workcoaching.clientsEl trabajo de hoy en toda la lista de clientes.
GET/api/fitness/coaching/roster/check-inscoaching.clientsLos check-ins semanales de esta semana, primero los que no tienen respuesta.
GET/api/fitness/coaching/clients/:username/plancoaching.clientsEl trabajo asignado de un cliente.
POST/api/fitness/coaching/clients/:username/plancoaching.clientsAsigna un entrenamiento (workoutSlug, startsOn, note).
DELETE/api/fitness/coaching/plan/:idcoaching.clientsQuita una asignación.
GET/api/fitness/coaching/clients/:username/messagescoaching.clientsEl hilo con un cliente.
POST/api/fitness/coaching/clients/:username/messagescoaching.clientsLe escribe (body, attachments).
GET/api/fitness/coaching/clients/:username/check-inscoaching.clientsLos check-ins semanales de un cliente.
POST/api/fitness/coaching/check-ins/:id/replycoaching.clientsResponde a uno (body).
GET/api/fitness/coaching/my-coachfitness.viewEl coach del miembro, o null.
GET/api/fitness/coaching/my-planfitness.viewLo que asignó el coach.
GET/api/fitness/coaching/messagesfitness.viewEl hilo del miembro.
POST/api/fitness/coaching/messagesfitness.editEscribe al coach.
GET/api/fitness/coaching/check-insfitness.viewLos check-ins semanales del miembro.
POST/api/fitness/coaching/check-insfitness.editEnvía el de esta semana (energy, weightKg, notes).
GET/api/fitness/coaching/coachescoaching.assignLas cuentas con el rol Coach, con su número de clientes.
GET/api/fitness/coaching/assignments/:usernamecoaching.assignQuién entrena a un miembro.
POST/api/fitness/coaching/assignmentscoaching.assignMueve un miembro a un coach (coachUsername, memberUsername).
DELETE/api/fitness/coaching/assignments/:usernamecoaching.assignSaca 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étodoRutaQuién puede llamarlaQué hace
GET/api/fitness/manage/<catalogue>fitness.manageUna página de registros (page, page_count, search, order y los filtros propios del catálogo).
GET/api/fitness/manage/<catalogue>/:idfitness.manageUn registro.
POST/api/fitness/manage/<catalogue>fitness.manageCrea 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>/:idfitness.manageCambia los campos enviados; las listas dentro de un registro se sustituyen por completo.
DELETE/api/fitness/manage/<catalogue>/:idfitness.manageLo elimina y responde 200, o 409 mientras algo lo siga usando.
POST/api/fitness/manage/exercises/:id/featurefitness.manageConvierte 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étodoRutaQuién puede llamarlaQué hace
GET/api/ingest/whoamiUna clave de ingestaLa cuenta y el nombre de la clave.
POST/api/ingest/daily-metricsUna clave de ingestaInserta o actualiza días de cifras de movimiento (days).
POST/api/ingest/sessionsUna clave de ingestaRegistra entrenamientos terminados (sessions).

Búsqueda, subidas, notificaciones y países

MétodoRutaQuién puede llamarlaQué hace
GET/api/searchCualquier cuenta con la sesión iniciadaResultados de un término en los tipos que puede abrir quien llama (q, locale, limit).
POST/api/helpers/uploadCualquier cuenta con la sesión iniciadaSube un archivo (file, hasta 150 MB) al bucket; 400 si no hay bucket configurado.
POST/api/helpers/upload-chunkCualquier cuenta con la sesión iniciadaUna parte de un archivo más grande (hasta 16 MB por parte).
GET/api/notificationsCualquier cuenta con la sesión iniciadaLas notificaciones de quien llama.
PATCH/api/notifications/read-allCualquier cuenta con la sesión iniciadaLas marca todas como leídas.
PATCH/api/notifications/:id/readCualquier cuenta con la sesión iniciadaMarca una como leída.
DELETE/api/notifications/:idCualquier cuenta con la sesión iniciadaElimina una.
GET/api/helpers/countriesCualquieraPaí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.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.