Aller à l'article
Aniq-UI

KinoraRéférence de l'API

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 :

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 :

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

Réponse (400)
{
  "success": false,
  "data": null,
  "message": "<the first field's problem>",
  "errors": {
    "email": ["<the problem with email>"]
  }
}
StatutQuand
400Un 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é.
401Le 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.
403Les rôles du compte n'accordent pas la permission de la route : « You need one of these permissions: … ».
404L'enregistrement n'existe pas, ou il n'appartient pas à l'appelant.
409Une suppression qui casserait quelque chose qui utilise encore l'enregistrement, par exemple exercise_in_use.
429Plus 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.
503La vérification de santé avant que la base de données soit prête.
500Un é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 :

Réponse
{
  "success": true,
  "data": { "data": [ ], "page": 1, "limit": 15, "total": 35, "totalPages": 3 },
  "message": ""
}
ListeTaille de page par défaut
Membres, catalogues de contenu15
Coachs, rôles, réglages10

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 contient access_token, un JWT signé avec JWT_SECRET, et le compte avec ses rôles et ses permissions. Envoyez-le sous la forme Authorization: Bearer <token>.
  • Un jeton dure JWT_EXPIRATION, 7d par défaut. Il n'y a pas de route de rafraîchissement : quand un jeton expire, la requête suivante répond 401 et 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, voir TRUST_PROXY (Dépannage).
  1. Se connecter en tant que Head Coach du seed

    Terminal
    curl -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": "..."
    }
  2. Appeler une route protégée avec le jeton

    Terminal
    curl "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éthodeCheminQui peut l'appelerRôle
POST/api/auth/loginN'importe quiConnecte n'importe quel compte. Soumis à une limite de requêtes.
POST/api/auth/registerN'importe quiCré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/meTout compte connectéLe compte avec ses rôles et ses permissions.
POST/api/auth/delete-accountTout compte connectéFerme le compte de l'appelant après vérification de password. Soumis à une limite de requêtes.
PATCH/api/coaches/profileTout compte connectéMet à jour le profil de l'appelant.
PATCH/api/coaches/profile/passwordTout 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éthodeCheminQui peut l'appelerRôle
GET/api/usersmembers.viewUne page de membres (order, search, email, phone, country_id, username, first_name, last_name, from_date, to_date, verified).
GET/api/users/statisticmembers.viewLes nombres de membres pour l'écran Gym.
GET/api/users/:usernamemembers.viewUn membre.
POST/api/usersmembers.createCrée un membre.
PATCH/api/users/:usernamemembers.updateMet à jour un membre.
PATCH/api/users/:username/change-passwordmembers.updateDéfinit le mot de passe d'un membre.
POST/api/users/:username/resend-verification-emailmembers.updateRé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-verifiedmembers.verifyMarque l'e-mail comme vérifié.
POST/api/users/:username/make-unverifiedmembers.verifyLe marque comme non vérifié.
DELETE/api/users/:usernamemembers.deleteDéplace le membre dans la liste des supprimés.
GET/api/users/deletedmembers.viewUne page de membres supprimés.
GET/api/users/deleted/:usernamemembers.viewUn membre supprimé.
POST/api/users/deleted/:username/restoremembers.restoreEn restaure un.

Coachs et rôles

MéthodeCheminQui peut l'appelerRôle
GET/api/coachescoaches.viewUne page de comptes de l'équipe (email, name, phone).
GET/api/coaches/statisticscoaches.viewLes effectifs du personnel.
GET/api/coaches/management/roles/selectcoaches.view ou coaches.assign_rolesLes rôles parmi lesquels un formulaire de l'équipe peut choisir.
GET/api/coaches/:idcoaches.viewUn compte de l'équipe, par identifiant ou nom d'utilisateur.
POST/api/coachescoaches.createEn crée un.
PATCH/api/coaches/:idcoaches.editEn met un à jour.
PATCH/api/coaches/:id/rolescoaches.assign_rolesDéfinit ses rôles.
DELETE/api/coaches/:idcoaches.deleteEn supprime un.
GET/api/rolesroles.viewLes rôles (page, page_count, name, guard_name, created_from, created_to) ; tous les rôles sans page_count.
GET/api/roles/statisticsroles.viewLe nombre de rôles.
GET/api/roles/selectroles.viewLes rôles pour une liste déroulante.
GET/api/roles/permissionsroles.viewChaque permission, par module.
GET/api/roles/:idroles.viewUn rôle avec ses permissions.
POST/api/rolesroles.createCrée un rôle.
PUT/api/roles/:idroles.editLa renomme.
POST/api/roles/:id/permissionsroles.assign_permissionsDéfinit ses permissions.
DELETE/api/roles/:idroles.deleteLa supprime.

Réglages de l'application

MéthodeCheminQui peut l'appelerRôle
GET/api/settingssettings.viewUne page de réglages (search, category, type).
GET/api/settings/:keysettings.viewUn paramètre.
PATCH/api/settings/:keysettings.editChange sa valeur.
DELETE/api/settings/:keysettings.editLa 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éthodeCheminQui peut l'appelerRôle
GET/api/fitness/overviewfitness.viewLa journée du tableau de bord : anneaux, calories, sommeil, fréquence cardiaque, séances d'entraînement, pas.
GET/api/fitness/activityfitness.viewLa page d'activité (granularity days, weeks ou months).
GET/api/fitness/activity/:slugfitness.viewUne activité.
GET/api/fitness/nutritionfitness.viewLa page de nutrition.
POST/api/fitness/nutrition/mealsfitness.editEnregistre un plat du catalogue dans la journée.
PATCH/api/fitness/nutrition/hydrationfitness.editDéfinit les verres du jour.
GET/api/fitness/nutrition/plannerfitness.viewLe planificateur d'une journée (date).
POST/api/fitness/nutrition/plannerfitness.editEnregistre un repas du membre.
DELETE/api/fitness/nutrition/planner/:keyfitness.editEn supprime une.
GET/api/fitness/sleepfitness.viewLa page du sommeil.
POST/api/fitness/sleep/nightsfitness.editEnregistre une nuit.
DELETE/api/fitness/sleep/nights/:datefitness.editEn supprime un.
GET/api/fitness/healthfitness.viewLa page de santé.
POST/api/fitness/health/readingsfitness.editEnregistre les constantes d'une journée.
DELETE/api/fitness/health/readings/:datefitness.editLes supprime.
GET/api/fitness/progressfitness.viewLa page des progrès.
GET/api/fitness/progress/photosfitness.viewLa page des photos (before, after).
POST/api/fitness/progress/photosfitness.editAjoute une étape.
PATCH/api/fitness/progress/photos/notesfitness.editEnregistre le journal.
PATCH/api/fitness/progress/goalfitness.editDéfinit l'objectif de poids.
POST/api/fitness/progress/readingsfitness.editEnregistre un relevé corporel.
DELETE/api/fitness/progress/readings/:datefitness.editEn supprime un.
GET/api/fitness/communityfitness.viewLa page de la communauté.
GET/api/fitness/community/members/:usernamefitness.viewLe profil d'un membre.
GET/api/fitness/community/groups/:slugfitness.viewUn groupe.
GET/api/fitness/community/discussions/:slugfitness.viewUne discussion.
POST/api/fitness/community/groups/:slug/joinfitness.editRejoint ou quitte un groupe.
POST/api/fitness/community/challenges/:slug/joinfitness.editRejoint ou quitte un défi.
POST/api/fitness/community/events/:slug/attendfitness.editParticipe ou non à un événement.
POST/api/fitness/community/groups/:slug/postsfitness.editÉcrit une publication.
POST/api/fitness/community/groups/:slug/posts/:postKey/likefitness.editAjoute ou retire un j'aime.
POST/api/fitness/community/groups/:slug/posts/:postKey/commentsfitness.editCommente.
POST/api/fitness/community/discussions/:slug/repliesfitness.editRépond.
GET/api/fitness/billingfitness.viewL'abonnement et ses factures. En lecture seule.
GET/api/fitness/settings-hubsettings.viewLes chiffres, alertes, confidentialité et apparence de la page des réglages.
PATCH/api/fitness/settings-hub/notificationsfitness.editLes quatre interrupteurs d'alerte.
PATCH/api/fitness/settings-hub/privacyfitness.editLe partage de l'activité.
PATCH/api/fitness/settings-hub/appearancesettings.viewThème, accent et animations.
GET/api/fitness/settings-hub/exportfitness.viewTout ce que le membre a enregistré, en JSON.
GET/api/fitness/devicesfitness.viewLes appareils et la connexion du compte à chacun.
POST/api/fitness/devices/:key/togglefitness.editEn connecte ou en déconnecte un.
POST/api/fitness/devices/:key/syncfitness.editToujours 400 device_sync_unavailable.
GET/api/fitness/devices/keysfitness.viewLes clés d'ingestion du compte.
POST/api/fitness/devices/keysfitness.editEn crée une ; la clé complète ne figure que dans cette réponse.
DELETE/api/fitness/devices/keys/:idfitness.editEn révoque une.

Séances d'entraînement, exercices et séance

MéthodeCheminQui peut l'appelerRôle
GET/api/fitness/workoutsfitness.viewLa page du programme.
GET/api/fitness/workouts/programsfitness.viewLes programmes et le programme actif.
POST/api/fitness/workouts/programs/:slug/enrollfitness.editDémarre ou arrête un programme.
GET/api/fitness/workouts/:slugfitness.viewUne séance d'entraînement.
POST/api/fitness/workouts/:slug/savefitness.editL'ajoute aux favoris ou l'en retire.
GET/api/fitness/exercisesfitness.viewLa bibliothèque (muscle, equipment, difficulty).
GET/api/fitness/exercises/:slugfitness.viewUn mouvement ; enregistre une consultation.
POST/api/fitness/exercises/:slug/savefitness.editL'ajoute aux favoris ou l'en retire.
POST/api/fitness/exercises/:slug/log-setfitness.editEnregistre des séries, des répétitions et un poids.
GET/api/fitness/workouts/sessionfitness.viewLa séance ouverte, ouverte à partir du programme du jour quand aucune ne l'est.
POST/api/fitness/workouts/session/sets/:setfitness.editEnregistre une série (weightKg, reps, rpe).
POST/api/fitness/workouts/session/rest/skipfitness.editPasse le repos.
PATCH/api/fitness/workouts/session/notesfitness.editEnregistre la note.
POST/api/fitness/workouts/session/exercisesfitness.editAjoute un mouvement (slug).
POST/api/fitness/workouts/session/exercises/:slug/selectfitness.editEn fait le mouvement en cours.
DELETE/api/fitness/workouts/session/exercises/:slugfitness.editLe retire.
POST/api/fitness/workouts/session/finishfitness.editTermine la séance.
POST/api/fitness/workouts/session/restartfitness.editL'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éthodeCheminQui peut l'appelerRôle
GET/api/fitness/coaching/clientscoaching.clientsLa liste de clients de l'appelant.
GET/api/fitness/coaching/clients/:usernamecoaching.clientsUn client.
GET/api/fitness/coaching/available-memberscoaching.clientsLes membres sans coach.
POST/api/fitness/coaching/clientscoaching.clientsPrend un membre en charge (username).
GET/api/fitness/coaching/workoutscoaching.clientsLes séances d'entraînement qu'un coach peut attribuer.
GET/api/fitness/coaching/roster/assigned-workcoaching.clientsLe travail du jour sur toute la liste de clients.
GET/api/fitness/coaching/roster/check-inscoaching.clientsLes bilans hebdomadaires de la semaine, ceux sans réponse en premier.
GET/api/fitness/coaching/clients/:username/plancoaching.clientsLe travail attribué à un client.
POST/api/fitness/coaching/clients/:username/plancoaching.clientsAttribue une séance d'entraînement (workoutSlug, startsOn, note).
DELETE/api/fitness/coaching/plan/:idcoaching.clientsRetire une attribution.
GET/api/fitness/coaching/clients/:username/messagescoaching.clientsLe fil avec un client.
POST/api/fitness/coaching/clients/:username/messagescoaching.clientsLui écrit (body, attachments).
GET/api/fitness/coaching/clients/:username/check-inscoaching.clientsLes bilans hebdomadaires d'un client.
POST/api/fitness/coaching/check-ins/:id/replycoaching.clientsRépond à l'un d'eux (body).
GET/api/fitness/coaching/my-coachfitness.viewLe coach du membre, ou null.
GET/api/fitness/coaching/my-planfitness.viewCe que le coach a attribué.
GET/api/fitness/coaching/messagesfitness.viewLe fil du membre.
POST/api/fitness/coaching/messagesfitness.editÉcrit au coach.
GET/api/fitness/coaching/check-insfitness.viewLes bilans hebdomadaires du membre.
POST/api/fitness/coaching/check-insfitness.editRemplit celui de la semaine (energy, weightKg, notes).
GET/api/fitness/coaching/coachescoaching.assignLes comptes qui détiennent le rôle Coach, avec leur nombre de clients.
GET/api/fitness/coaching/assignments/:usernamecoaching.assignQui coache un membre.
POST/api/fitness/coaching/assignmentscoaching.assignAffecte un membre à un coach (coachUsername, memberUsername).
DELETE/api/fitness/coaching/assignments/:usernamecoaching.assignRetire 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éthodeCheminQui peut l'appelerRôle
GET/api/fitness/manage/<catalogue>fitness.manageUne page d'enregistrements (page, page_count, search, order et les filtres propres au catalogue).
GET/api/fitness/manage/<catalogue>/:idfitness.manageUn enregistrement.
POST/api/fitness/manage/<catalogue>fitness.manageEn crée un ; un slug ou une clé omis est construit à partir du nom anglais. Répond 201.
PATCH/api/fitness/manage/<catalogue>/:idfitness.manageModifie les champs envoyés ; les listes à l'intérieur d'un enregistrement sont remplacées entièrement.
DELETE/api/fitness/manage/<catalogue>/:idfitness.manageLe supprime et répond 200, ou 409 tant que quelque chose l'utilise encore.
POST/api/fitness/manage/exercises/:id/featurefitness.manageFait 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éthodeCheminQui peut l'appelerRôle
GET/api/ingest/whoamiUne clé d'ingestionLe compte et le nom de la clé.
POST/api/ingest/daily-metricsUne clé d'ingestionCrée ou met à jour des journées de chiffres d'activité (days).
POST/api/ingest/sessionsUne clé d'ingestionEnregistre des séances d'entraînement terminées (sessions).

Recherche, envois de fichiers, notifications et pays

MéthodeCheminQui peut l'appelerRôle
GET/api/searchTout compte connectéLes résultats d'un terme parmi les types que l'appelant peut ouvrir (q, locale, limit).
POST/api/helpers/uploadTout compte connectéEnvoie un fichier (file, jusqu'à 150 Mo) vers le bucket ; 400 sans bucket configuré.
POST/api/helpers/upload-chunkTout compte connectéUne partie d'un fichier plus gros (jusqu'à 16 Mo par partie).
GET/api/notificationsTout compte connectéLes notifications de l'appelant.
PATCH/api/notifications/read-allTout compte connectéLes marque toutes comme lues.
PATCH/api/notifications/:id/readTout compte connectéEn marque une comme lue.
DELETE/api/notifications/:idTout compte connectéEn supprime un.
GET/api/helpers/countriesN'importe quiLes 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.

Bloqué sur une étape ?

Trouvez une solution avant de tout recommencer.

Dépannage

Préférences des Cookies

Nous utilisons des cookies pour améliorer votre expérience de navigation, analyser le trafic du site et personnaliser le contenu. En cliquant sur "Accepter Tout", vous consentez à notre utilisation des cookies pour l'analyse et la publicité personnalisée.