Référence de l'API
Chaque route servie par l'API, qui peut l'appeler, et comment fonctionnent la connexion, les permissions, les erreurs et la pagination.
Pour le pack Full Stack
URL de base et format des réponses
Chaque route est servie sous le préfixe /api. En local, l'URL de base est http://localhost:8000/api. Sur un serveur, c'est l'adresse de votre API suivie de /api, la même valeur que le tableau de bord lit dans NEXT_PUBLIC_API_BASE_URL (Variables d'environnement).
Les membres et l'équipe utilisent la même connexion et le même jeton ; les rôles du compte décident des routes qui répondent. Les corps de requête sont en JSON, sauf pour les envois de fichiers. Chaque réponse arrive dans la même enveloppe :
{
"success": true,
"data": { },
"message": ""
}data contient le résultat. message est une courte phrase que certaines écritures renseignent, traduite dans la langue de la requête, et vide sinon.
La vérification de santé est la seule route en dehors de l'enveloppe. Elle ne demande aucun jeton et n'est pas soumise à une limite de requêtes :
curl http://localhost:8000/api/health{"status":"ok"}Elle répond 503 avec {"status":"unavailable"} tant que la base de données est injoignable ou ne contient aucune table : une plateforme peut donc l'utiliser comme sonde de disponibilité.
Erreurs
Une requête échouée répond avec le statut HTTP correspondant et la même enveloppe, avec success: false, data: null et, pour la validation, les problèmes par champ :
{
"success": false,
"data": null,
"message": "<the first field's problem>",
"errors": {
"email": ["<the problem with email>"]
}
}| Statut | Quand |
|---|---|
400 | Un champ n'a pas passé la validation, ou le corps contient un champ que la route n'accepte pas : les champs inconnus sont refusés, pas ignorés. C'est aussi le cas d'un envoi de fichier sans bucket configuré. |
401 | Le jeton est manquant ou expiré, une connexion a échoué (une seule réponse, que l'e-mail n'ait pas de compte ou que le mot de passe soit faux), ou une clé d'ingestion est manquante ou inconnue. |
403 | Les rôles du compte n'accordent pas la permission de la route : « You need one of these permissions: … ». |
404 | L'enregistrement n'existe pas, ou il n'appartient pas à l'appelant. |
409 | Une suppression qui casserait quelque chose qui utilise encore l'enregistrement, par exemple exercise_in_use. |
429 | Plus de 10 tentatives en une minute depuis une même adresse sur la route de connexion, d'inscription ou de suppression de compte. L'en-tête Retry-After indique combien de secondes attendre. |
503 | La vérification de santé avant que la base de données soit prête. |
500 | Un échec inattendu. Le message reste générique et les détails vont dans le journal de l'API. |
De nombreuses erreurs portent dans message une clé que le tableau de bord traduit, par exemple member_not_found ou event_full.
Pagination
Les listes acceptent page, à partir de 1, et page_count, la taille de page. Une page contient au plus 100 lignes : une taille plus grande est lue comme 100, une plus petite comme 1, et une taille absente ou illisible revient à la valeur par défaut de la liste. Une liste répond toujours sous la même forme :
{
"success": true,
"data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
"message": ""
}| Liste | Taille de page par défaut |
|---|---|
| Membres, catalogues de contenu | 15 |
| Coachs, rôles, réglages | 10 |
Les listes de contenu sont triées par updated_at, les plus récentes en premier par défaut (order=asc ou desc), avec l'identifiant pour départager, et acceptent search et leurs propres filtres.
Langue
Envoyez la langue du lecteur dans l'en-tête Accept-Language : en ou ar à la livraison. ar-SA compte comme de l'arabe, et toute langue que l'API ne possède pas reçoit une réponse en anglais. Les messages d'erreur et le message d'une écriture réussie sont traduits ; le contenu enregistré dans les deux langues revient sous la forme { "en": "...", "ar": "..." }.
Authentification
- Connectez-vous via
POST /api/auth/login. La réponse contientaccess_token, un JWT signé avecJWT_SECRET, et le compte avec ses rôles et ses permissions. Envoyez-le sous la formeAuthorization: Bearer <token>. - Un jeton dure
JWT_EXPIRATION,7dpar défaut. Il n'y a pas de route de rafraîchissement : quand un jeton expire, la requête suivante répond401et le client se reconnecte. - La connexion, l'inscription et la suppression de compte acceptent 10 tentatives par minute depuis une même adresse, comptées par route, puis répondent
429. Le compteur est gardé en mémoire par l'API : il repart donc de zéro à un redémarrage. Derrière un proxy, voirTRUST_PROXY(Dépannage).
Se connecter en tant que Head Coach du seed
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"headcoach@example.com","password":"Coach@123"}'Réponse{ "success": true, "data": { "access_token": "eyJhbGciOiJIUzI1NiIs...", "token_type": "Bearer", "expires_in": "7d", "account": { "email": "headcoach@example.com", "roles": [ ], "permissions": [ ] } }, "message": "..." }Appeler une route protégée avec le jeton
Terminalcurl "http://localhost:8000/api/users?page=1&page_count=5" \ -H "Authorization: Bearer <access_token>"Résultat attendu: Les cinq premiers membres, au format de liste.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
POST | /api/auth/login | N'importe qui | Connecte n'importe quel compte. Soumis à une limite de requêtes. |
POST | /api/auth/register | N'importe qui | Crée un compte de membre (first_name, last_name, email, password de 8 caractères ou plus, username facultatif) et le connecte. Soumis à une limite de requêtes. |
GET | /api/auth/me | Tout compte connecté | Le compte avec ses rôles et ses permissions. |
POST | /api/auth/delete-account | Tout compte connecté | Ferme le compte de l'appelant après vérification de password. Soumis à une limite de requêtes. |
PATCH | /api/coaches/profile | Tout compte connecté | Met à jour le profil de l'appelant. |
PATCH | /api/coaches/profile/password | Tout compte connecté | Change le mot de passe de l'appelant. |
Il n'existe aucune route de réinitialisation du mot de passe. Les pages de mot de passe oublié et de réinitialisation du tableau de bord ne sont que des écrans : aucune réinitialisation n'est envoyée. Un compte de l'équipe avec members.update définit le mot de passe d'un membre avec PATCH /api/users/:username/change-password.
Changez les mots de passe de démonstration
Les comptes de démo utilisent des mots de passe publiés : Coach@123, Member@123, Trainer@123, staff123 pour les autres membres de l'équipe et password123 pour les autres membres. Changez-les, ou partez de tables vides, avant toute mise en ligne.
Permissions
Une route vérifie d'abord le jeton, puis la permission qu'elle nomme. Un compte détient toutes les permissions de tous ses rôles ; quand une route en nomme plusieurs, une seule suffit. Dans les tableaux ci-dessous, un nom de permission dans Qui peut l'appeler désigne un compte dont les rôles l'accordent.
Les membres
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/users | members.view | Une page de membres (order, search, email, phone, country_id, username, first_name, last_name, from_date, to_date, verified). |
GET | /api/users/statistic | members.view | Les nombres de membres pour l'écran Gym. |
GET | /api/users/:username | members.view | Un membre. |
POST | /api/users | members.create | Crée un membre. |
PATCH | /api/users/:username | members.update | Met à jour un membre. |
PATCH | /api/users/:username/change-password | members.update | Définit le mot de passe d'un membre. |
POST | /api/users/:username/resend-verification-email | members.update | Répond par un succès ; aucun e-mail n'est envoyé, car aucun service d'envoi d'e-mails n'est livré. |
POST | /api/users/:username/make-verified | members.verify | Marque l'e-mail comme vérifié. |
POST | /api/users/:username/make-unverified | members.verify | Le marque comme non vérifié. |
DELETE | /api/users/:username | members.delete | Déplace le membre dans la liste des supprimés. |
GET | /api/users/deleted | members.view | Une page de membres supprimés. |
GET | /api/users/deleted/:username | members.view | Un membre supprimé. |
POST | /api/users/deleted/:username/restore | members.restore | En restaure un. |
Coachs et rôles
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/coaches | coaches.view | Une page de comptes de l'équipe (email, name, phone). |
GET | /api/coaches/statistics | coaches.view | Les effectifs du personnel. |
GET | /api/coaches/management/roles/select | coaches.view ou coaches.assign_roles | Les rôles parmi lesquels un formulaire de l'équipe peut choisir. |
GET | /api/coaches/:id | coaches.view | Un compte de l'équipe, par identifiant ou nom d'utilisateur. |
POST | /api/coaches | coaches.create | En crée un. |
PATCH | /api/coaches/:id | coaches.edit | En met un à jour. |
PATCH | /api/coaches/:id/roles | coaches.assign_roles | Définit ses rôles. |
DELETE | /api/coaches/:id | coaches.delete | En supprime un. |
GET | /api/roles | roles.view | Les rôles (page, page_count, name, guard_name, created_from, created_to) ; tous les rôles sans page_count. |
GET | /api/roles/statistics | roles.view | Le nombre de rôles. |
GET | /api/roles/select | roles.view | Les rôles pour une liste déroulante. |
GET | /api/roles/permissions | roles.view | Chaque permission, par module. |
GET | /api/roles/:id | roles.view | Un rôle avec ses permissions. |
POST | /api/roles | roles.create | Crée un rôle. |
PUT | /api/roles/:id | roles.edit | La renomme. |
POST | /api/roles/:id/permissions | roles.assign_permissions | Définit ses permissions. |
DELETE | /api/roles/:id | roles.delete | La supprime. |
Réglages de l'application
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/settings | settings.view | Une page de réglages (search, category, type). |
GET | /api/settings/:key | settings.view | Un paramètre. |
PATCH | /api/settings/:key | settings.edit | Change sa valeur. |
DELETE | /api/settings/:key | settings.edit | La supprime. |
Les propres données d'un membre
Chaque route ici répond pour le compte du jeton et personne d'autre. Un jeton de l'équipe répond 403, car seul le rôle Member détient fitness.view et fitness.edit. Chaque écriture répond avec toute la page actualisée.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/fitness/overview | fitness.view | La journée du tableau de bord : anneaux, calories, sommeil, fréquence cardiaque, séances d'entraînement, pas. |
GET | /api/fitness/activity | fitness.view | La page d'activité (granularity days, weeks ou months). |
GET | /api/fitness/activity/:slug | fitness.view | Une activité. |
GET | /api/fitness/nutrition | fitness.view | La page de nutrition. |
POST | /api/fitness/nutrition/meals | fitness.edit | Enregistre un plat du catalogue dans la journée. |
PATCH | /api/fitness/nutrition/hydration | fitness.edit | Définit les verres du jour. |
GET | /api/fitness/nutrition/planner | fitness.view | Le planificateur d'une journée (date). |
POST | /api/fitness/nutrition/planner | fitness.edit | Enregistre un repas du membre. |
DELETE | /api/fitness/nutrition/planner/:key | fitness.edit | En supprime une. |
GET | /api/fitness/sleep | fitness.view | La page du sommeil. |
POST | /api/fitness/sleep/nights | fitness.edit | Enregistre une nuit. |
DELETE | /api/fitness/sleep/nights/:date | fitness.edit | En supprime un. |
GET | /api/fitness/health | fitness.view | La page de santé. |
POST | /api/fitness/health/readings | fitness.edit | Enregistre les constantes d'une journée. |
DELETE | /api/fitness/health/readings/:date | fitness.edit | Les supprime. |
GET | /api/fitness/progress | fitness.view | La page des progrès. |
GET | /api/fitness/progress/photos | fitness.view | La page des photos (before, after). |
POST | /api/fitness/progress/photos | fitness.edit | Ajoute une étape. |
PATCH | /api/fitness/progress/photos/notes | fitness.edit | Enregistre le journal. |
PATCH | /api/fitness/progress/goal | fitness.edit | Définit l'objectif de poids. |
POST | /api/fitness/progress/readings | fitness.edit | Enregistre un relevé corporel. |
DELETE | /api/fitness/progress/readings/:date | fitness.edit | En supprime un. |
GET | /api/fitness/community | fitness.view | La page de la communauté. |
GET | /api/fitness/community/members/:username | fitness.view | Le profil d'un membre. |
GET | /api/fitness/community/groups/:slug | fitness.view | Un groupe. |
GET | /api/fitness/community/discussions/:slug | fitness.view | Une discussion. |
POST | /api/fitness/community/groups/:slug/join | fitness.edit | Rejoint ou quitte un groupe. |
POST | /api/fitness/community/challenges/:slug/join | fitness.edit | Rejoint ou quitte un défi. |
POST | /api/fitness/community/events/:slug/attend | fitness.edit | Participe ou non à un événement. |
POST | /api/fitness/community/groups/:slug/posts | fitness.edit | Écrit une publication. |
POST | /api/fitness/community/groups/:slug/posts/:postKey/like | fitness.edit | Ajoute ou retire un j'aime. |
POST | /api/fitness/community/groups/:slug/posts/:postKey/comments | fitness.edit | Commente. |
POST | /api/fitness/community/discussions/:slug/replies | fitness.edit | Répond. |
GET | /api/fitness/billing | fitness.view | L'abonnement et ses factures. En lecture seule. |
GET | /api/fitness/settings-hub | settings.view | Les chiffres, alertes, confidentialité et apparence de la page des réglages. |
PATCH | /api/fitness/settings-hub/notifications | fitness.edit | Les quatre interrupteurs d'alerte. |
PATCH | /api/fitness/settings-hub/privacy | fitness.edit | Le partage de l'activité. |
PATCH | /api/fitness/settings-hub/appearance | settings.view | Thème, accent et animations. |
GET | /api/fitness/settings-hub/export | fitness.view | Tout ce que le membre a enregistré, en JSON. |
GET | /api/fitness/devices | fitness.view | Les appareils et la connexion du compte à chacun. |
POST | /api/fitness/devices/:key/toggle | fitness.edit | En connecte ou en déconnecte un. |
POST | /api/fitness/devices/:key/sync | fitness.edit | Toujours 400 device_sync_unavailable. |
GET | /api/fitness/devices/keys | fitness.view | Les clés d'ingestion du compte. |
POST | /api/fitness/devices/keys | fitness.edit | En crée une ; la clé complète ne figure que dans cette réponse. |
DELETE | /api/fitness/devices/keys/:id | fitness.edit | En révoque une. |
Séances d'entraînement, exercices et séance
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/fitness/workouts | fitness.view | La page du programme. |
GET | /api/fitness/workouts/programs | fitness.view | Les programmes et le programme actif. |
POST | /api/fitness/workouts/programs/:slug/enroll | fitness.edit | Démarre ou arrête un programme. |
GET | /api/fitness/workouts/:slug | fitness.view | Une séance d'entraînement. |
POST | /api/fitness/workouts/:slug/save | fitness.edit | L'ajoute aux favoris ou l'en retire. |
GET | /api/fitness/exercises | fitness.view | La bibliothèque (muscle, equipment, difficulty). |
GET | /api/fitness/exercises/:slug | fitness.view | Un mouvement ; enregistre une consultation. |
POST | /api/fitness/exercises/:slug/save | fitness.edit | L'ajoute aux favoris ou l'en retire. |
POST | /api/fitness/exercises/:slug/log-set | fitness.edit | Enregistre des séries, des répétitions et un poids. |
GET | /api/fitness/workouts/session | fitness.view | La séance ouverte, ouverte à partir du programme du jour quand aucune ne l'est. |
POST | /api/fitness/workouts/session/sets/:set | fitness.edit | Enregistre une série (weightKg, reps, rpe). |
POST | /api/fitness/workouts/session/rest/skip | fitness.edit | Passe le repos. |
PATCH | /api/fitness/workouts/session/notes | fitness.edit | Enregistre la note. |
POST | /api/fitness/workouts/session/exercises | fitness.edit | Ajoute un mouvement (slug). |
POST | /api/fitness/workouts/session/exercises/:slug/select | fitness.edit | En fait le mouvement en cours. |
DELETE | /api/fitness/workouts/session/exercises/:slug | fitness.edit | Le retire. |
POST | /api/fitness/workouts/session/finish | fitness.edit | Termine la séance. |
POST | /api/fitness/workouts/session/restart | fitness.edit | L'abandonne et recommence. |
Coaching
Les routes de liste de clients répondent pour le coach qui fait la requête : le client d'un autre coach renvoie 404.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/fitness/coaching/clients | coaching.clients | La liste de clients de l'appelant. |
GET | /api/fitness/coaching/clients/:username | coaching.clients | Un client. |
GET | /api/fitness/coaching/available-members | coaching.clients | Les membres sans coach. |
POST | /api/fitness/coaching/clients | coaching.clients | Prend un membre en charge (username). |
GET | /api/fitness/coaching/workouts | coaching.clients | Les séances d'entraînement qu'un coach peut attribuer. |
GET | /api/fitness/coaching/roster/assigned-work | coaching.clients | Le travail du jour sur toute la liste de clients. |
GET | /api/fitness/coaching/roster/check-ins | coaching.clients | Les bilans hebdomadaires de la semaine, ceux sans réponse en premier. |
GET | /api/fitness/coaching/clients/:username/plan | coaching.clients | Le travail attribué à un client. |
POST | /api/fitness/coaching/clients/:username/plan | coaching.clients | Attribue une séance d'entraînement (workoutSlug, startsOn, note). |
DELETE | /api/fitness/coaching/plan/:id | coaching.clients | Retire une attribution. |
GET | /api/fitness/coaching/clients/:username/messages | coaching.clients | Le fil avec un client. |
POST | /api/fitness/coaching/clients/:username/messages | coaching.clients | Lui écrit (body, attachments). |
GET | /api/fitness/coaching/clients/:username/check-ins | coaching.clients | Les bilans hebdomadaires d'un client. |
POST | /api/fitness/coaching/check-ins/:id/reply | coaching.clients | Répond à l'un d'eux (body). |
GET | /api/fitness/coaching/my-coach | fitness.view | Le coach du membre, ou null. |
GET | /api/fitness/coaching/my-plan | fitness.view | Ce que le coach a attribué. |
GET | /api/fitness/coaching/messages | fitness.view | Le fil du membre. |
POST | /api/fitness/coaching/messages | fitness.edit | Écrit au coach. |
GET | /api/fitness/coaching/check-ins | fitness.view | Les bilans hebdomadaires du membre. |
POST | /api/fitness/coaching/check-ins | fitness.edit | Remplit celui de la semaine (energy, weightKg, notes). |
GET | /api/fitness/coaching/coaches | coaching.assign | Les comptes qui détiennent le rôle Coach, avec leur nombre de clients. |
GET | /api/fitness/coaching/assignments/:username | coaching.assign | Qui coache un membre. |
POST | /api/fitness/coaching/assignments | coaching.assign | Affecte un membre à un coach (coachUsername, memberUsername). |
DELETE | /api/fitness/coaching/assignments/:username | coaching.assign | Retire un membre de toutes les listes de clients. |
Les catalogues de contenu
Chaque catalogue répond aux cinq mêmes routes sous /api/fitness/manage/<catalogue>, et chacune demande fitness.manage. Les catalogues sont exercises, workouts, programs, dishes, groups, events, challenges, achievements et badges.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/fitness/manage/<catalogue> | fitness.manage | Une page d'enregistrements (page, page_count, search, order et les filtres propres au catalogue). |
GET | /api/fitness/manage/<catalogue>/:id | fitness.manage | Un enregistrement. |
POST | /api/fitness/manage/<catalogue> | fitness.manage | En crée un ; un slug ou une clé omis est construit à partir du nom anglais. Répond 201. |
PATCH | /api/fitness/manage/<catalogue>/:id | fitness.manage | Modifie les champs envoyés ; les listes à l'intérieur d'un enregistrement sont remplacées entièrement. |
DELETE | /api/fitness/manage/<catalogue>/:id | fitness.manage | Le supprime et répond 200, ou 409 tant que quelque chose l'utilise encore. |
POST | /api/fitness/manage/exercises/:id/feature | fitness.manage | Fait de ce mouvement le mouvement mis en avant. |
Un identifiant inconnu renvoie 404 record_not_found. Les noms et les textes sont envoyés sous la forme { "en": "…", "ar": "…" } ; les calories d'un plat ne sont jamais envoyées, elles sont calculées à partir de ses grammes.
Ingestion
La porte d'entrée des appareils et des agrégateurs. Ces routes prennent une clé d'ingestion dans X-Api-Key, jamais un jeton bearer, et n'écrivent que pour le compte de la clé.
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/ingest/whoami | Une clé d'ingestion | Le compte et le nom de la clé. |
POST | /api/ingest/daily-metrics | Une clé d'ingestion | Crée ou met à jour des journées de chiffres d'activité (days). |
POST | /api/ingest/sessions | Une clé d'ingestion | Enregistre des séances d'entraînement terminées (sessions). |
Recherche, envois de fichiers, notifications et pays
| Méthode | Chemin | Qui peut l'appeler | Rôle |
|---|---|---|---|
GET | /api/search | Tout compte connecté | Les résultats d'un terme parmi les types que l'appelant peut ouvrir (q, locale, limit). |
POST | /api/helpers/upload | Tout compte connecté | Envoie un fichier (file, jusqu'à 150 Mo) vers le bucket ; 400 sans bucket configuré. |
POST | /api/helpers/upload-chunk | Tout compte connecté | Une partie d'un fichier plus gros (jusqu'à 16 Mo par partie). |
GET | /api/notifications | Tout compte connecté | Les notifications de l'appelant. |
PATCH | /api/notifications/read-all | Tout compte connecté | Les marque toutes comme lues. |
PATCH | /api/notifications/:id/read | Tout compte connecté | En marque une comme lue. |
DELETE | /api/notifications/:id | Tout compte connecté | En supprime un. |
GET | /api/helpers/countries | N'importe qui | Les pays pour une liste déroulante, libellés dans la langue de la requête. |
Deux namespaces Socket.IO sur le même serveur envoient des mises à jour en direct : /notifications transmet chaque nouvelle notification, et /auth signale à un tableau de bord connecté que ses permissions ont changé. Ils acceptent les origines de FRONTEND_URL, ou de CORS_ORIGIN quand il n'est pas défini.
Assistant IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes du chat de l'assistant, des modèles, des suggestions d'ouverture et de l'historique des conversations.
Serveur MCP
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
La route qu'utilise un agent de code, et la clé qu'il envoie.
Routes du mode démo
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Les routes qu'utilise une démo publique pour se décrire et donner un compte à chaque visiteur.