# Course

## Créer une nouvelle session de traitement vidéo

> Ce point de terminaison permet à un \*\*administrateur\*\* (ou sous-admin) d'uploader un \*\*fichier vidéo\*\* pour traitement et de créer une nouvelle ressource "session" \*\*au nom d'un autre utilisateur\*\*. Le serveur renverra un \`session\_id\` qui peut être utilisé pour interroger ou récupérer les détails/résultats de la session.\
> \### Corps de la requête (Multipart/Form-Data)\
> Vous devez fournir les champs suivants :\
> \- \*\*user\_id\*\* \*(string, obligatoire)\* : L'ID de l'utilisateur pour lequel cette session est créée. - \*\*video\*\* \*(fichier, obligatoire)\* : Le fichier vidéo brut à traiter. - \*\*session\_name\*\* \*(string, optionnel)\* : Un nom/lisible pour la session. - \*\*incline\_degree\*\* \*(string ou nombre, optionnel)\* : Valeur numérique représentant le degré d'inclinaison. - \*\*body\_joint\_angles\*\* \*(array\[string], optionnel)\* : Liste de noms d'articulations séparés par des virgules (ex. 'coude, genou, cheville'). Par défaut \['all'] si non fourni.\
> \### Structure de la réponse\
> En cas de succès (HTTP 200), la réponse est un objet JSON avec : - \*\*session\_id\*\* \*(string)\* : Un identifiant unique pour la session créée. - \*\*title\*\* \*(string)\* : Le titre de la session (par défaut une valeur générique si \`session\_name\` n'est pas fourni).\
> \### Workflow\
> 1\. \*\*POST\*\* une requête multipart/form-data contenant les champs obligatoires \`user\_id\` et \`video\`, plus les champs optionnels. 2. Fournir un token API-KEY valide dans l'en-tête \`Authorization\`. 3. L'appelant doit avoir des privilèges admin pour créer une session pour un autre utilisateur. 4. Si réussi, le serveur répond avec \`session\_id\` et \`title\`. 5. En cas d'erreur (champs manquants, permissions insuffisantes), un objet JSON avec une clé \`error\` est retourné.\
> \#### Exemple cURL : \`\`\`bash curl -X POST \\\
> &#x20;    -H 'Content-Type: multipart/form-data' \\\
> &#x20;    -H 'Authorization: API-KEY \<VOTRE\_TOKEN\_ADMIN>' \\\
> &#x20;    -F 'user\_id=someUserId123' \\\
> &#x20;    -F 'video=@/chemin/vers/video.mp4' \\\
> &#x20;    -F 'session\_name=Session Personnalisée' \\\
> &#x20;    -F 'incline\_degree=5' \\\
> &#x20;    -F 'body\_joint\_angles=coude, genou, cheville' \\\
> &#x20;    https\://\<backend-link>/running/management/sessions/\
> \`\`\`<br>

````json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/":{"post":{"operationId":"running_sessions_create","summary":"Créer une nouvelle session de traitement vidéo","description":"Ce point de terminaison permet à un **administrateur** (ou sous-admin) d'uploader un **fichier vidéo** pour traitement et de créer une nouvelle ressource \"session\" **au nom d'un autre utilisateur**. Le serveur renverra un `session_id` qui peut être utilisé pour interroger ou récupérer les détails/résultats de la session.\n### Corps de la requête (Multipart/Form-Data)\nVous devez fournir les champs suivants :\n- **user_id** *(string, obligatoire)* : L'ID de l'utilisateur pour lequel cette session est créée. - **video** *(fichier, obligatoire)* : Le fichier vidéo brut à traiter. - **session_name** *(string, optionnel)* : Un nom/lisible pour la session. - **incline_degree** *(string ou nombre, optionnel)* : Valeur numérique représentant le degré d'inclinaison. - **body_joint_angles** *(array[string], optionnel)* : Liste de noms d'articulations séparés par des virgules (ex. 'coude, genou, cheville'). Par défaut ['all'] si non fourni.\n### Structure de la réponse\nEn cas de succès (HTTP 200), la réponse est un objet JSON avec : - **session_id** *(string)* : Un identifiant unique pour la session créée. - **title** *(string)* : Le titre de la session (par défaut une valeur générique si `session_name` n'est pas fourni).\n### Workflow\n1. **POST** une requête multipart/form-data contenant les champs obligatoires `user_id` et `video`, plus les champs optionnels. 2. Fournir un token API-KEY valide dans l'en-tête `Authorization`. 3. L'appelant doit avoir des privilèges admin pour créer une session pour un autre utilisateur. 4. Si réussi, le serveur répond avec `session_id` et `title`. 5. En cas d'erreur (champs manquants, permissions insuffisantes), un objet JSON avec une clé `error` est retourné.\n#### Exemple cURL : ```bash curl -X POST \\\n     -H 'Content-Type: multipart/form-data' \\\n     -H 'Authorization: API-KEY <VOTRE_TOKEN_ADMIN>' \\\n     -F 'user_id=someUserId123' \\\n     -F 'video=@/chemin/vers/video.mp4' \\\n     -F 'session_name=Session Personnalisée' \\\n     -F 'incline_degree=5' \\\n     -F 'body_joint_angles=coude, genou, cheville' \\\n     https://<backend-link>/running/management/sessions/\n```\n","responses":{"200":{"description":"Session de traitement vidéo créée avec succès (HTTP 200).","content":{"application/json":{"schema":{"required":["session_id","title"],"type":"object","properties":{"session_id":{"description":"L'identifiant unique de la session créée.","type":"string"},"title":{"description":"Le titre de la session (valeur par défaut si non fourni).","type":"string"}}}}}},"400":{"description":"Requête incorrecte - Possiblement due à un `user_id` manquant, une `video` manquante ou des données de formulaire invalides.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant un token manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - L'utilisateur n'a pas la permission admin pour créer des sessions pour d'autres.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant des privilèges insuffisants.","type":"string"}}}}}},"404":{"description":"Non trouvé - Indique des problèmes de logique métier ou des limitations de ressources (ex. limite de sessions).\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur décrivant le problème.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user_id":{"type":"string","description":"**Obligatoire.** L'ID de l'utilisateur pour qui cette session est créée (champ de formulaire : texte).\n"},"video":{"type":"string","description":"**Obligatoire.** Le fichier vidéo brut à traiter (type de champ : fichier).\n"},"session_name":{"type":"string","description":"**Optionnel.** Un nom descriptif pour la session (champ de formulaire : texte)."},"incline_degree":{"type":"string","description":"**Optionnel.** Une chaîne numérique indiquant le degré d'inclinaison (champ de formulaire : texte).\n"},"body_joint_angles":{"type":"array","description":"**Optionnel.** Une liste de noms d'articulations séparés par des virgules. Valeurs disponibles : `'cheville'`, `'genou'`, `'coude'`, `'hanche'`, `'épaule'`. Exemple : `cheville,genou,hanche`\n"}},"required":["user_id","video"]}}}}}}}}
````

## Récupérer les métriques totales

> Calcule et retourne les métriques moyennes pour toutes les sessions de course de l'utilisateur admin, ainsi que les métriques détaillées et le timestamp de création de la session la plus récente.\
> \### Structure de la réponse (HTTP 200)\
> La réponse est un objet JSON avec la structure suivante :\
> \- \*\*avg\_metrics\*\* \*(object)\* : Contient les valeurs moyennes calculées sur toutes les sessions.\
> &#x20; \- \*\*avg\_speed\*\* \*(number)\* : Vitesse moyenne.\
> &#x20; \- \*\*avg\_power\*\* \*(number)\* : Puissance moyenne.\
> &#x20; \- \*\*avg\_cadence\*\* \*(number)\* : Cadence moyenne.\
> &#x20; \- \*\*avg\_flight\_time\*\* \*(number)\* : Temps de vol moyen.\
> \
> \- \*\*last\_session\_metrics\*\* \*(object)\* : Contient les métriques détaillées de la session la plus récente.\
> &#x20; \- \*\*speed\*\* \*(object)\* : Métriques de vitesse avec :\
> &#x20;     \- \*\*avg\*\* \*(number)\* : Vitesse moyenne.\
> &#x20;     \- \*\*min\*\* \*(number)\* : Vitesse minimale.\
> &#x20;     \- \*\*max\*\* \*(number)\* : Vitesse maximale.\
> &#x20; \- \*\*normalized\_power\*\* \*(object)\* : Métriques de puissance normalisée avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*cadence\*\* \*(object)\* : Métriques de cadence avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*total\_distance\*\* \*(number)\* : Distance totale.\
> &#x20; \- \*\*power\*\* \*(object)\* : Métriques de puissance avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*stride\_time\*\* \*(object)\* : Métriques de temps de foulée avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*total\_time\*\* \*(number)\* : Temps total de la session.\
> &#x20; \- \*\*contact\_time\*\* \*(object)\* : Métriques de temps de contact avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*contact\_angle\*\* \*(object)\* : Métriques d'angle de contact avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*incline\*\* \*(object)\* : Métriques d'inclinaison avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*pace\*\* \*(object)\* : Métriques d'allure avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*stride\_length\*\* \*(object)\* : Métriques de longueur de foulée avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*rbalance\*\* \*(object)\* : Métriques d'équilibre avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*flight\_time\*\* \*(object)\* : Métriques de temps de vol avec clés \`avg\`, \`min\`, \`max\`.\
> &#x20; \- \*\*footstrike\*\* \*(string)\* : Le type de footstrike (ex. 'midfoot').\
> \
> \- \*\*last\_session\_created\_at\*\* \*(object)\* : Le timestamp de création de la session la plus récente, contenant :\
> &#x20; \- \*\*date\*\* \*(string)\* : Date au format DD/MM/YYYY.\
> &#x20; \- \*\*time\*\* \*(string)\* : Heure au format HH:MM AM/PM.\
> \
> \### Gestion des erreurs\
> \- \*\*400 Mauvaise requête\*\* : Paramètres invalides (ex. UID admin invalide). - \*\*401 Non autorisé\*\* : Token d'accès manquant ou invalide. - \*\*403 Interdit\*\* : Privilèges insuffisants pour récupérer les métriques totales. - \*\*404 Non trouvé\*\* : Aucune session trouvée ou métriques indisponibles. - \*\*500 Erreur interne du serveur\*\* : Une erreur inattendue s'est produite.\
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.<br>

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/metrics/total/":{"get":{"operationId":"running_sessions_metrics_total_list","summary":"Récupérer les métriques totales","description":"Calcule et retourne les métriques moyennes pour toutes les sessions de course de l'utilisateur admin, ainsi que les métriques détaillées et le timestamp de création de la session la plus récente.\n### Structure de la réponse (HTTP 200)\nLa réponse est un objet JSON avec la structure suivante :\n- **avg_metrics** *(object)* : Contient les valeurs moyennes calculées sur toutes les sessions.\n  - **avg_speed** *(number)* : Vitesse moyenne.\n  - **avg_power** *(number)* : Puissance moyenne.\n  - **avg_cadence** *(number)* : Cadence moyenne.\n  - **avg_flight_time** *(number)* : Temps de vol moyen.\n\n- **last_session_metrics** *(object)* : Contient les métriques détaillées de la session la plus récente.\n  - **speed** *(object)* : Métriques de vitesse avec :\n      - **avg** *(number)* : Vitesse moyenne.\n      - **min** *(number)* : Vitesse minimale.\n      - **max** *(number)* : Vitesse maximale.\n  - **normalized_power** *(object)* : Métriques de puissance normalisée avec clés `avg`, `min`, `max`.\n  - **cadence** *(object)* : Métriques de cadence avec clés `avg`, `min`, `max`.\n  - **total_distance** *(number)* : Distance totale.\n  - **power** *(object)* : Métriques de puissance avec clés `avg`, `min`, `max`.\n  - **stride_time** *(object)* : Métriques de temps de foulée avec clés `avg`, `min`, `max`.\n  - **total_time** *(number)* : Temps total de la session.\n  - **contact_time** *(object)* : Métriques de temps de contact avec clés `avg`, `min`, `max`.\n  - **contact_angle** *(object)* : Métriques d'angle de contact avec clés `avg`, `min`, `max`.\n  - **incline** *(object)* : Métriques d'inclinaison avec clés `avg`, `min`, `max`.\n  - **pace** *(object)* : Métriques d'allure avec clés `avg`, `min`, `max`.\n  - **stride_length** *(object)* : Métriques de longueur de foulée avec clés `avg`, `min`, `max`.\n  - **rbalance** *(object)* : Métriques d'équilibre avec clés `avg`, `min`, `max`.\n  - **flight_time** *(object)* : Métriques de temps de vol avec clés `avg`, `min`, `max`.\n  - **footstrike** *(string)* : Le type de footstrike (ex. 'midfoot').\n\n- **last_session_created_at** *(object)* : Le timestamp de création de la session la plus récente, contenant :\n  - **date** *(string)* : Date au format DD/MM/YYYY.\n  - **time** *(string)* : Heure au format HH:MM AM/PM.\n\n### Gestion des erreurs\n- **400 Mauvaise requête** : Paramètres invalides (ex. UID admin invalide). - **401 Non autorisé** : Token d'accès manquant ou invalide. - **403 Interdit** : Privilèges insuffisants pour récupérer les métriques totales. - **404 Non trouvé** : Aucune session trouvée ou métriques indisponibles. - **500 Erreur interne du serveur** : Une erreur inattendue s'est produite.\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.\n","responses":{"200":{"description":"Métriques totales récupérées avec succès.","content":{"application/json":{"schema":{"required":["avg_metrics","last_session_metrics","last_session_created_at"],"type":"object","properties":{"avg_metrics":{"description":"Métriques moyennes sur toutes les sessions.","required":["avg_speed","avg_power","avg_cadence","avg_flight_time"],"type":"object","properties":{"avg_speed":{"description":"Vitesse moyenne.","type":"number"},"avg_power":{"description":"Puissance moyenne.","type":"number"},"avg_cadence":{"description":"Cadence moyenne.","type":"number"},"avg_flight_time":{"description":"Temps de vol moyen.","type":"number"}}},"last_session_metrics":{"description":"Métriques détaillées de la session la plus récente.","required":["speed","normalized_power","cadence","total_distance","power","stride_time","total_time","contact_time","contact_angle","incline","pace","stride_length","rbalance","flight_time","footstrike"],"type":"object","properties":{"speed":{"description":"Métriques de vitesse.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Vitesse moyenne.","type":"number"},"min":{"description":"Vitesse minimale.","type":"number"},"max":{"description":"Vitesse maximale.","type":"number"}}},"normalized_power":{"description":"Métriques de puissance normalisée.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Puissance normalisée moyenne.","type":"number"},"min":{"description":"Puissance normalisée minimale.","type":"number"},"max":{"description":"Puissance normalisée maximale.","type":"number"}}},"cadence":{"description":"Métriques de cadence.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Cadence moyenne.","type":"number"},"min":{"description":"Cadence minimale.","type":"number"},"max":{"description":"Cadence maximale.","type":"number"}}},"total_distance":{"description":"Distance totale parcourue dans la session.","type":"number"},"power":{"description":"Métriques de puissance.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Puissance moyenne.","type":"number"},"min":{"description":"Puissance minimale.","type":"number"},"max":{"description":"Puissance maximale.","type":"number"}}},"stride_time":{"description":"Métriques de temps de foulée.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Temps de foulée moyen.","type":"number"},"min":{"description":"Temps de foulée minimal.","type":"number"},"max":{"description":"Temps de foulée maximal.","type":"number"}}},"total_time":{"description":"Temps total de la session.","type":"number"},"contact_time":{"description":"Métriques de temps de contact.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Temps de contact moyen.","type":"number"},"min":{"description":"Temps de contact minimal.","type":"number"},"max":{"description":"Temps de contact maximal.","type":"number"}}},"contact_angle":{"description":"Métriques d'angle de contact.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Angle de contact moyen.","type":"number"},"min":{"description":"Angle de contact minimal.","type":"number"},"max":{"description":"Angle de contact maximal.","type":"number"}}},"incline":{"description":"Métriques d'inclinaison.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Inclinaison moyenne.","type":"number"},"min":{"description":"Inclinaison minimale.","type":"number"},"max":{"description":"Inclinaison maximale.","type":"number"}}},"pace":{"description":"Métriques d'allure.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Allure moyenne.","type":"number"},"min":{"description":"Allure minimale.","type":"number"},"max":{"description":"Allure maximale.","type":"number"}}},"stride_length":{"description":"Métriques de longueur de foulée.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Longueur de foulée moyenne.","type":"number"},"min":{"description":"Longueur de foulée minimale.","type":"number"},"max":{"description":"Longueur de foulée maximale.","type":"number"}}},"rbalance":{"description":"Métriques d'équilibre.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Équilibre moyen.","type":"number"},"min":{"description":"Équilibre minimal.","type":"number"},"max":{"description":"Équilibre maximal.","type":"number"}}},"flight_time":{"description":"Métriques de temps de vol.","required":["avg","min","max"],"type":"object","properties":{"avg":{"description":"Temps de vol moyen.","type":"number"},"min":{"description":"Temps de vol minimal.","type":"number"},"max":{"description":"Temps de vol maximal.","type":"number"}}},"footstrike":{"description":"Le type de footstrike (ex. 'midfoot').","type":"string"}}},"last_session_created_at":{"description":"Timestamp de création de la session la plus récente.","required":["date","time"],"type":"object","properties":{"date":{"description":"Date de création au format DD/MM/YYYY.","type":"string"},"time":{"description":"Heure de création au format HH:MM AM/PM.","type":"string"}}}}}}}},"400":{"description":"Mauvaise requête - Paramètres invalides (ex. UID admin invalide).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé expliquant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant qu'un token API-KEY valide n'a pas été fourni.","type":"string"}}}}}},"403":{"description":"Interdit - L'utilisateur n'a pas les privilèges suffisants pour récupérer les métriques totales.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant des permissions insuffisantes.","type":"string"}}}}}},"404":{"description":"Non trouvé - Aucune session trouvée ou métriques indisponibles.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant qu'aucune session ou métrique n'a été trouvée.\n","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Récupérer les détails d'une session de course

> Récupère les informations détaillées pour une session de course spécifique identifiée par le \`session\_id\`.\
> \### Paramètre de chemin\
> \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session à récupérer.\
> \### Paramètre de requête\
> \- \*\*demo\*\* \*(boolean, optionnel)\* : Définir à \`true\` pour récupérer les données de démo au lieu d'une session réelle.\
> \### Structure de la réponse\
> En cas de succès (HTTP 200), la réponse est un objet JSON contenant les champs suivants :\
> \- \*\*metrics\*\* \*(object)\* : Un dictionnaire de tableaux de métriques (ex. vitesse, cadence, distance). Chaque clé correspond à un tableau de nombres. - \*\*angles\*\* \*(object)\* : Un dictionnaire de tableaux d'angles (ex. lhip\_angle, rsho\_angle). Chaque clé correspond à un tableau de nombres. - \*\*all\_timestamps\*\* \*(array\[number])\* : Une liste de timestamps (en secondes) pour les données de la session. - \*\*analyzed\_video\_url\*\* \*(string, URI)\* : L'URL de la vidéo analysée (avec superposition de keypoints). - \*\*video\_url\*\* \*(string, URI)\* : L'URL de la vidéo originale uploadée. - \*\*segments\*\* \*(integer)\* : Le nombre de segments traités. - \*\*created\_at\*\* \*(object)\* : Un objet contenant :\
> &#x20;   \- \*\*date\*\* \*(string)\* : La date de création au format DD/MM/YYYY.\
> &#x20;   \- \*\*time\*\* \*(string)\* : L'heure de création au format HH:MM AM/PM.\
> \- \*\*user\_name\*\* \*(string)\* : Le nom de l'utilisateur associé à la session. - \*\*activity\*\* \*(string)\* : Le type d'activité (ex. 'Course'). - \*\*title\*\* \*(string)\* : Le titre de la session. - \*\*calculated\_metrics\*\* \*(object)\* : Un dictionnaire contenant des statistiques calculées (moyennes, minima, maxima) pour diverses métriques. - \*\*summary\*\* \*(string)\* : Un résumé textuel optionnel de la session.\
> \### Gestion des erreurs\
> \- \*\*400 Mauvaise requête\*\* : Paramètres invalides (ex. UID admin invalide). - \*\*401 Non autorisé\*\* : Token d'accès manquant ou invalide. - \*\*403 Interdit\*\* : L'utilisateur n'a pas les privilèges suffisants pour accéder à la session. - \*\*404 Non trouvé\*\* : La session n'existe pas ou n'est pas valide pour l'activité spécifiée. - \*\*500 Erreur interne du serveur\*\* : Une erreur inattendue côté serveur.\
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.<br>

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/":{"get":{"operationId":"running_sessions_read","summary":"Récupérer les détails d'une session de course","description":"Récupère les informations détaillées pour une session de course spécifique identifiée par le `session_id`.\n### Paramètre de chemin\n- **session_id** *(string, obligatoire)* : L'identifiant unique de la session à récupérer.\n### Paramètre de requête\n- **demo** *(boolean, optionnel)* : Définir à `true` pour récupérer les données de démo au lieu d'une session réelle.\n### Structure de la réponse\nEn cas de succès (HTTP 200), la réponse est un objet JSON contenant les champs suivants :\n- **metrics** *(object)* : Un dictionnaire de tableaux de métriques (ex. vitesse, cadence, distance). Chaque clé correspond à un tableau de nombres. - **angles** *(object)* : Un dictionnaire de tableaux d'angles (ex. lhip_angle, rsho_angle). Chaque clé correspond à un tableau de nombres. - **all_timestamps** *(array[number])* : Une liste de timestamps (en secondes) pour les données de la session. - **analyzed_video_url** *(string, URI)* : L'URL de la vidéo analysée (avec superposition de keypoints). - **video_url** *(string, URI)* : L'URL de la vidéo originale uploadée. - **segments** *(integer)* : Le nombre de segments traités. - **created_at** *(object)* : Un objet contenant :\n    - **date** *(string)* : La date de création au format DD/MM/YYYY.\n    - **time** *(string)* : L'heure de création au format HH:MM AM/PM.\n- **user_name** *(string)* : Le nom de l'utilisateur associé à la session. - **activity** *(string)* : Le type d'activité (ex. 'Course'). - **title** *(string)* : Le titre de la session. - **calculated_metrics** *(object)* : Un dictionnaire contenant des statistiques calculées (moyennes, minima, maxima) pour diverses métriques. - **summary** *(string)* : Un résumé textuel optionnel de la session.\n### Gestion des erreurs\n- **400 Mauvaise requête** : Paramètres invalides (ex. UID admin invalide). - **401 Non autorisé** : Token d'accès manquant ou invalide. - **403 Interdit** : L'utilisateur n'a pas les privilèges suffisants pour accéder à la session. - **404 Non trouvé** : La session n'existe pas ou n'est pas valide pour l'activité spécifiée. - **500 Erreur interne du serveur** : Une erreur inattendue côté serveur.\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.\n","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Définir à `true` pour récupérer les données de démo au lieu d'une session réelle.\n","required":false}],"responses":{"200":{"description":"Données de session récupérées avec succès.","content":{"application/json":{"schema":{"required":["metrics","angles","all_timestamps","activity"],"type":"object","properties":{"metrics":{"description":"Un dictionnaire de tableaux de métriques.","type":"object","additionalProperties":{"type":"number"}},"angles":{"description":"Un dictionnaire de tableaux d'angles.","type":"object","additionalProperties":{"type":"number"}},"all_timestamps":{"description":"Liste de timestamps associés à la session.","type":"array","items":{"type":"number"}},"analyzed_video_url":{"description":"L'URL publique de la vidéo analysée.","type":"string","format":"uri"},"video_url":{"description":"L'URL publique de la vidéo originale.","type":"string","format":"uri"},"segments":{"description":"Le nombre de segments traités.","type":"integer"},"created_at":{"description":"Timestamp de création de la session.","type":"object","properties":{"date":{"description":"Date de création au format DD/MM/YYYY.","type":"string"},"time":{"description":"Heure de création au format HH:MM AM/PM.","type":"string"}}},"user_name":{"description":"Le nom de l'utilisateur associé à cette session.","type":"string"},"activity":{"description":"Le type d'activité (ex. 'Course').","type":"string"},"title":{"description":"Le titre de la session.","type":"string"},"calculated_metrics":{"description":"Métriques calculées (moyennes, min, max) pour la session.","type":"object","additionalProperties":{"type":"number"}},"summary":{"description":"Un résumé optionnel de la session.","type":"string"}}}}}},"400":{"description":"Mauvaise requête - Paramètres invalides ou UID admin invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé expliquant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant qu'un token API-KEY valide n'a pas été fourni.","type":"string"}}}}}},"403":{"description":"Interdit - L'utilisateur n'est pas autorisé à accéder à cette session.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant des permissions insuffisantes pour accéder aux données de session.\n","type":"string"}}}}}},"404":{"description":"Non trouvé - La session demandée n'existe pas ou l'activité n'est pas 'Course'.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Exporter les données d'une session de course

> Récupère les données détaillées d'une session pour exporter une session de course spécifique identifiée par le \`session\_id\`.\
> \
> \### Paramètre de chemin\
> \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session à exporter.\
> \
> \### Paramètre de requête\
> \- \*\*demo\*\* \*(booléen, optionnel)\* : Définir à \`true\` pour récupérer une session de démonstration pré-générée au lieu d'une réelle.\
> \
> \### Structure de la réponse (HTTP 200)\
> La réponse est un objet JSON qui inclut :\
> \
> \- \*\*metrics\*\* \*(object)\* : Un dictionnaire où chaque clé représente une métrique (ex : 'speed', 'cadence') et sa valeur est un tableau de nombres.\
> \- \*\*keypoints\*\* \*(object)\* : Un dictionnaire où chaque clé représente un point clé (ex : 'lknev', 'ltoev') et sa valeur est un tableau de nombres.\
> \- \*\*angles\*\* \*(object)\* : Un dictionnaire où chaque clé représente un angle (ex : 'lelb\_angle', 'lhip\_angle') et sa valeur est un tableau de nombres.\
> \- \*\*all\_timestamps\*\* \*(array\[number])\* : Un tableau d'horodatages (en secondes) correspondant aux points de données.\
> \- \*\*contact\*\* \*(array\[booléen])\* : Un tableau de valeurs booléennes indiquant le statut de contact.\
> \- \*\*activity\*\* \*(string)\* : Le type d'activité (ex : 'Running').\
> \
> \### Gestion des erreurs\
> \- \*\*400 Bad Request\*\* : Les paramètres de la requête sont invalides (ex : un UID admin invalide).\
> \- \*\*401 Unauthorized\*\* : Le token d'accès est manquant ou invalide.\
> \- \*\*403 Forbidden\*\* : L'utilisateur n'a pas les privilèges suffisants pour accéder à ces données de session.\
> \- \*\*404 Not Found\*\* : La session demandée n'existe pas ou n'est pas valide pour l'activité.\
> \- \*\*500 Internal Server Error\*\* : Une erreur serveur inattendue est survenue.\
> \
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/export/":{"get":{"operationId":"running_sessions_export_list","summary":"Exporter les données d'une session de course","description":"Récupère les données détaillées d'une session pour exporter une session de course spécifique identifiée par le `session_id`.\n\n### Paramètre de chemin\n- **session_id** *(string, obligatoire)* : L'identifiant unique de la session à exporter.\n\n### Paramètre de requête\n- **demo** *(booléen, optionnel)* : Définir à `true` pour récupérer une session de démonstration pré-générée au lieu d'une réelle.\n\n### Structure de la réponse (HTTP 200)\nLa réponse est un objet JSON qui inclut :\n\n- **metrics** *(object)* : Un dictionnaire où chaque clé représente une métrique (ex : 'speed', 'cadence') et sa valeur est un tableau de nombres.\n- **keypoints** *(object)* : Un dictionnaire où chaque clé représente un point clé (ex : 'lknev', 'ltoev') et sa valeur est un tableau de nombres.\n- **angles** *(object)* : Un dictionnaire où chaque clé représente un angle (ex : 'lelb_angle', 'lhip_angle') et sa valeur est un tableau de nombres.\n- **all_timestamps** *(array[number])* : Un tableau d'horodatages (en secondes) correspondant aux points de données.\n- **contact** *(array[booléen])* : Un tableau de valeurs booléennes indiquant le statut de contact.\n- **activity** *(string)* : Le type d'activité (ex : 'Running').\n\n### Gestion des erreurs\n- **400 Bad Request** : Les paramètres de la requête sont invalides (ex : un UID admin invalide).\n- **401 Unauthorized** : Le token d'accès est manquant ou invalide.\n- **403 Forbidden** : L'utilisateur n'a pas les privilèges suffisants pour accéder à ces données de session.\n- **404 Not Found** : La session demandée n'existe pas ou n'est pas valide pour l'activité.\n- **500 Internal Server Error** : Une erreur serveur inattendue est survenue.\n\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Définir à `true` pour récupérer une session de démonstration pré-générée au lieu d'une réelle.","required":false}],"responses":{"200":{"description":"Données de session exportées avec succès.","content":{"application/json":{"schema":{"required":["metrics","keypoints","angles","all_timestamps","contact","activity"],"type":"object","properties":{"metrics":{"description":"Un dictionnaire de tableaux de métriques (ex : vitesse, cadence, etc.).","type":"object","additionalProperties":{"type":"number"}},"keypoints":{"description":"Un dictionnaire de tableaux de points clés.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"angles":{"description":"Un dictionnaire de tableaux d'angles.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"all_timestamps":{"description":"Liste d'horodatages (en secondes).","type":"array","items":{"type":"number"}},"contact":{"description":"Tableau indiquant le statut de contact (true/false).","type":"array","items":{"type":"boolean"}},"activity":{"description":"Le type d'activité (ex : 'Running').","type":"string"}}}}}},"400":{"description":"Requête invalide - Les paramètres de la requête sont invalides (ex : UID admin invalide).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé expliquant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token d'accès est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - L'utilisateur n'a pas les privilèges suffisants pour accéder à ces données de session.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant des permissions insuffisantes.","type":"string"}}}}}},"404":{"description":"Non trouvé - La session demandée n'existe pas ou l'activité n'est pas valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne - Une erreur inattendue est survenue sur le serveur.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Rapport d'analyse de la forme de course

> Récupère un rapport détaillé d'analyse de la forme de course pour une session donnée. Ce point de terminaison nécessite que l'utilisateur ait un token admin valide et un abonnement actif (Pro, Premium, Enterprise ou Standard).\
> \
> \### Requête\
> \- \*\*Paramètre de chemin\*\* :\
> &#x20; \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session pour laquelle le rapport d'analyse est demandé.\
> \
> \- \*\*Paramètre de requête\*\* :\
> &#x20; \- \*\*demo\*\* \*(booléen, optionnel)\* : Définir à \`true\` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.\
> \
> \### Structure de la réponse (HTTP 200)\
> La réponse est un objet JSON contenant :\
> \
> \- \*\*metrics\*\* \*(object)\* : Valeurs moyennes par foulée telles que \`speed\`, \`balance\`, \`cadence\`, \`contact\_angle\`, \`eversion\_velocity\`, \`knee\_flexion\`, \`posture\_angle\`, \`ankle\_angle\`, \`com\_oscillation\`, \`stride\_angle\`, \`mean\_h\`.\
> \- \*\*images\*\* \*(object)\* : Trois instantanés représentatifs avec les clés \`contact\_angle\`, \`push\_angle\`, \`knee\_ankle\` ; chaque valeur est une URL publique d'image.\
> \- \*\*user\_info\*\* \*(object)\* : Informations sur l'utilisateur ayant soumis la session, incluant :\
> &#x20; \- \*\*age\*\* \*(integer)\*\
> &#x20; \- \*\*gender\*\* \*(string)\*\
> &#x20; \- \*\*height\*\* \*(number, cm)\*\
> &#x20; \- \*\*weight\*\* \*(number, kg)\*\
> &#x20; \- \*\*email\*\* \*(string, email)\*\
> &#x20; \- \*\*uid\*\*, \*\*display\_name\*\*, \*\*admin\_name\*\*, \*\*last\_session\*\*, \*\*phone\*\*, \*\*brand\*\*, \*\*shoeModel\*\*, \*\*shoeSize\*\*, \*\*leg\_length\*\*, \*\*ycom\*\* \*(divers types)\*\
> \
> \- \*\*form\_comments\*\* \*(object, optionnel)\* : Recommandations GenAI pour les blocs \`contact\_angle\`, \`hip\_extension\_at\_foot\_takeoff\`, \`foot\_contact\_angle\_and\_torso\_lean\`.\
> \- \*\*date\*\* \*(string)\* : La date de génération du rapport au format JJ/MM/AAAA.\
> \
> \### Gestion des erreurs\
> \- \*\*400 Bad Request\*\* : Token ou paramètres invalides.\
> \- \*\*401 Unauthorized\*\* : Le token est manquant ou invalide.\
> \- \*\*403 Forbidden\*\* : Un accès admin est requis.\
> \- \*\*404 Not Found\*\* : La session n'a pas été trouvée ou l'utilisateur n'a pas un plan de paiement valide.\
> \- \*\*500 Internal Server Error\*\* : Une erreur inattendue est survenue sur le serveur.\
> \
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/form-analysis/":{"post":{"operationId":"running_sessions_form-analysis_create","summary":"Rapport d'analyse de la forme de course","description":"Récupère un rapport détaillé d'analyse de la forme de course pour une session donnée. Ce point de terminaison nécessite que l'utilisateur ait un token admin valide et un abonnement actif (Pro, Premium, Enterprise ou Standard).\n\n### Requête\n- **Paramètre de chemin** :\n  - **session_id** *(string, obligatoire)* : L'identifiant unique de la session pour laquelle le rapport d'analyse est demandé.\n\n- **Paramètre de requête** :\n  - **demo** *(booléen, optionnel)* : Définir à `true` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.\n\n### Structure de la réponse (HTTP 200)\nLa réponse est un objet JSON contenant :\n\n- **metrics** *(object)* : Valeurs moyennes par foulée telles que `speed`, `balance`, `cadence`, `contact_angle`, `eversion_velocity`, `knee_flexion`, `posture_angle`, `ankle_angle`, `com_oscillation`, `stride_angle`, `mean_h`.\n- **images** *(object)* : Trois instantanés représentatifs avec les clés `contact_angle`, `push_angle`, `knee_ankle` ; chaque valeur est une URL publique d'image.\n- **user_info** *(object)* : Informations sur l'utilisateur ayant soumis la session, incluant :\n  - **age** *(integer)*\n  - **gender** *(string)*\n  - **height** *(number, cm)*\n  - **weight** *(number, kg)*\n  - **email** *(string, email)*\n  - **uid**, **display_name**, **admin_name**, **last_session**, **phone**, **brand**, **shoeModel**, **shoeSize**, **leg_length**, **ycom** *(divers types)*\n\n- **form_comments** *(object, optionnel)* : Recommandations GenAI pour les blocs `contact_angle`, `hip_extension_at_foot_takeoff`, `foot_contact_angle_and_torso_lean`.\n- **date** *(string)* : La date de génération du rapport au format JJ/MM/AAAA.\n\n### Gestion des erreurs\n- **400 Bad Request** : Token ou paramètres invalides.\n- **401 Unauthorized** : Le token est manquant ou invalide.\n- **403 Forbidden** : Un accès admin est requis.\n- **404 Not Found** : La session n'a pas été trouvée ou l'utilisateur n'a pas un plan de paiement valide.\n- **500 Internal Server Error** : Une erreur inattendue est survenue sur le serveur.\n\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session pour laquelle le rapport d'analyse de la forme de course est demandé.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Définir à `true` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.","required":false}],"responses":{"200":{"description":"Rapport d'analyse de la forme de course récupéré avec succès.","content":{"application/json":{"schema":{"required":["metrics","images","user_info","date"],"type":"object","properties":{"metrics":{"description":"Métriques moyennes par foulée.","required":["speed","balance","cadence","contact_angle","eversion_velocity","knee_flexion","posture_angle","ankle_angle","com_oscillation","stride_angle","mean_h"],"type":"object","properties":{"speed":{"type":"number"},"balance":{"type":"number"},"cadence":{"type":"number"},"contact_angle":{"type":"number"},"eversion_velocity":{"type":"number"},"knee_flexion":{"type":"number"},"posture_angle":{"type":"number"},"ankle_angle":{"type":"number"},"com_oscillation":{"type":"number"},"stride_angle":{"type":"number"},"mean_h":{"type":"number"}}},"images":{"description":"URLs de trois images représentatives.","type":"object","additionalProperties":{"type":"string","format":"uri"}},"user_info":{"description":"Informations utilisateur associées à la session.","required":["age","height","weight","email","uid"],"type":"object","properties":{"age":{"type":"integer"},"gender":{"type":"string"},"height":{"type":"number"},"weight":{"type":"number"},"email":{"type":"string","format":"email"},"uid":{"type":"string"},"display_name":{"type":"string"},"admin_name":{"type":"string"},"last_session":{"type":"string"},"phone":{"type":"string"},"brand":{"type":"string"},"shoeModel":{"type":"string"},"shoeSize":{"type":"integer"},"leg_length":{"type":"number"},"ycom":{"type":"number"}}},"form_comments":{"description":"(Optionnel) Recommandations par bloc.","type":"object","additionalProperties":{"type":"string"}},"date":{"description":"Date du rapport au format JJ/MM/AAAA.","type":"string"}}}}}},"400":{"description":"Requête invalide - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Le token est invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Un accès admin est requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges admin sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session non trouvée ou l'utilisateur n'a pas un plan de paiement valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que le plan de paiement est invalide.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Créer des fils de discussion pour les recommandations de forme

> Génère des fils de discussion GenAI produisant des commentaires personnalisés pour chaque bloc d'analyse de la forme de course (angle de contact, extension de hanche au décollage du pied, angle de contact du pied & inclinaison du torse) \*\*plus\*\* une recommandation globale. Retourne un mappage des clés de bloc aux IDs de fils.\
> \
> \### Requête\
> \- \*\*session\_id\*\* (paramètre de chemin, obligatoire) : L'ID de la session de course pour laquelle générer les fils de discussion.\
> \
> \### Réponse (201)\
> Un objet JSON mappant chaque clé de bloc à son ID de fil GenAI correspondant :\
> \- \*\*contact\_angle\*\* : ID de fil pour le bloc angle de contact.\
> \- \*\*push\_angle\*\* : ID de fil pour le bloc angle de poussée.\
> \- \*\*knee\_ankle\*\* : ID de fil pour le bloc genou-cheville.\
> \- \*\*general\_form\_recommendation\*\* : ID de fil pour la recommandation globale de forme.\
> \
> \### Gestion des erreurs\
> \- \*\*403 Forbidden\*\* : L'utilisateur n'a pas de plan de paiement valide.\
> \- \*\*404 Not Found\*\* : Session non trouvée ou erreur de récupération.\
> \- \*\*500 Internal Server Error\*\* : Erreur serveur inattendue.\
> \
> \### Sécurité\
> Requiert un token API-KEY valide ou une clé API dans les en-têtes de la requête.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/form-recommendations/":{"post":{"operationId":"running_sessions_form-recommendations_create","summary":"Créer des fils de discussion pour les recommandations de forme","description":"Génère des fils de discussion GenAI produisant des commentaires personnalisés pour chaque bloc d'analyse de la forme de course (angle de contact, extension de hanche au décollage du pied, angle de contact du pied & inclinaison du torse) **plus** une recommandation globale. Retourne un mappage des clés de bloc aux IDs de fils.\n\n### Requête\n- **session_id** (paramètre de chemin, obligatoire) : L'ID de la session de course pour laquelle générer les fils de discussion.\n\n### Réponse (201)\nUn objet JSON mappant chaque clé de bloc à son ID de fil GenAI correspondant :\n- **contact_angle** : ID de fil pour le bloc angle de contact.\n- **push_angle** : ID de fil pour le bloc angle de poussée.\n- **knee_ankle** : ID de fil pour le bloc genou-cheville.\n- **general_form_recommendation** : ID de fil pour la recommandation globale de forme.\n\n### Gestion des erreurs\n- **403 Forbidden** : L'utilisateur n'a pas de plan de paiement valide.\n- **404 Not Found** : Session non trouvée ou erreur de récupération.\n- **500 Internal Server Error** : Erreur serveur inattendue.\n\n### Sécurité\nRequiert un token API-KEY valide ou une clé API dans les en-têtes de la requête.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"ID de session cible","required":true}],"responses":{"201":{"description":"Fils créés avec succès","content":{"application/json":{"schema":{"description":"Mappage des clés de bloc aux IDs de fils GenAI.","required":["contact_angle","push_angle","knee_ankle","general_form_recommendation"],"type":"object","properties":{"contact_angle":{"description":"ID de fil pour le bloc angle de contact.","type":"string"},"push_angle":{"description":"ID de fil pour le bloc angle de poussée.","type":"string"},"knee_ankle":{"description":"ID de fil pour le bloc genou-cheville.","type":"string"},"general_form_recommendation":{"description":"ID de fil pour la recommandation globale de forme.","type":"string"}}}}}},"403":{"description":"L'utilisateur n'a pas de plan de paiement valide","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Session non trouvée ou autre erreur de récupération","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Erreur serveur inattendue","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"tags":["running"]}}}}
```

## Rapport d'analyse de la foulée

> Récupère un rapport détaillé d'analyse de la foulée pour une session donnée. Ce point de terminaison nécessite que l'utilisateur ait un token admin valide et un abonnement actif (Pro, Premium, Enterprise ou Standard).\
> \
> \### Requête\
> \- \*\*Paramètre de chemin\*\* :\
> &#x20; \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session pour laquelle le rapport d'analyse est demandé.\
> \
> \- \*\*Paramètre de requête\*\* :\
> &#x20; \- \*\*demo\*\* \*(booléen, optionnel)\* : Définir à \`true\` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.\
> \
> \### Structure de la réponse (HTTP 200)\
> La réponse est un objet JSON contenant :\
> \
> \- \*\*left\*\* \*(object)\* et \*\*right\*\* \*(object)\* : Chaque côté contient des données d'analyse de foulée avec les champs suivants :\
> &#x20; \- \*\*peak\_time\*\* \*(number)\* : La valeur de temps de pic identifiée dans l'analyse.\
> &#x20; \- \*\*initiator\*\* \*(string)\* : Indique quel côté a initié le cycle de foulée.\
> &#x20; \- \*\*phases\*\* \*(object)\* : Un objet avec des phases nommées (ex : \`flight\`, \`takeoff\`, \`mid\_stance\`, \`strike\`, \`new\_strike\`), où chaque phase contient :\
> &#x20;   \- \*\*video\_frame\*\* \*(integer)\* : L'image vidéo correspondante.\
> &#x20;   \- \*\*graph\_phase\*\* \*(integer)\* : La valeur de phase utilisée dans les graphiques.\
> &#x20;   \- \*\*video\_phase\*\* \*(integer)\* : La valeur de phase dans la timeline vidéo.\
> &#x20;   \- \*\*image\_url\*\* \*(string, URI)\* : URL publique de l'image instantanée de la phase.\
> &#x20; \- \*\*angles\*\* \*(object)\* : Mesures d'angle pour les articulations comme \`posture\_angle\`, \`lhip\_angle\`, etc. Chaque inclut :\
> &#x20;   \- \*\*current\*\* \*(array\[number])\* : Valeurs d'angle de l'image courante.\
> &#x20;   \- \*\*next\*\* \*(array\[number])\* : Valeurs prédites suivantes.\
> &#x20;   \- \*\*std\_dev\*\* \*(array\[number])\* : Valeurs d'écart type.\
> &#x20; \- \*\*graph\_timestamps\*\* \*(array\[number])\* : Horodatages (ms) alignés avec les données graphiques.\
> \
> \- \*\*user\_info\*\* \*(object)\* : Informations sur l'utilisateur ayant soumis la session, incluant :\
> &#x20; \- \*\*age\*\* \*(integer)\*\
> &#x20; \- \*\*gender\*\* \*(string)\*\
> &#x20; \- \*\*height\*\* \*(number, cm)\*\
> &#x20; \- \*\*weight\*\* \*(number, kg)\*\
> &#x20; \- \*\*email\*\* \*(string, email)\*\
> &#x20; \- \*\*uid\*\*, \*\*display\_name\*\*, \*\*admin\_name\*\*, \*\*last\_session\*\*, \*\*session\_count\*\*, \*\*phone\*\*, \*\*brand\*\*, \*\*shoeModel\*\*, \*\*shoeSize\*\*, \*\*leg\_length\*\*, \*\*ycom\*\* \*(divers types)\*\
> \
> \- \*\*report\_comments\*\* \*(object, optionnel)\* : Suggestions ou notes pour les angles comme \`right\_posture\_angle\`, \`left\_knee\_angle\`, etc.\
> \- \*\*date\*\* \*(string)\* : La date de génération du rapport au format JJ/MM/AAAA.\
> \
> \### Gestion des erreurs\
> \- \*\*400 Bad Request\*\* : Token ou paramètres invalides.\
> \- \*\*401 Unauthorized\*\* : Le token est manquant ou invalide.\
> \- \*\*403 Forbidden\*\* : Un accès admin est requis.\
> \- \*\*404 Not Found\*\* : La session n'a pas été trouvée ou l'utilisateur n'a pas un plan de paiement valide.\
> \- \*\*500 Internal Server Error\*\* : Une erreur inattendue est survenue sur le serveur.\
> \
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/gait-analysis/":{"post":{"operationId":"running_sessions_gait-analysis_create","summary":"Rapport d'analyse de la foulée","description":"Récupère un rapport détaillé d'analyse de la foulée pour une session donnée. Ce point de terminaison nécessite que l'utilisateur ait un token admin valide et un abonnement actif (Pro, Premium, Enterprise ou Standard).\n\n### Requête\n- **Paramètre de chemin** :\n  - **session_id** *(string, obligatoire)* : L'identifiant unique de la session pour laquelle le rapport d'analyse est demandé.\n\n- **Paramètre de requête** :\n  - **demo** *(booléen, optionnel)* : Définir à `true` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.\n\n### Structure de la réponse (HTTP 200)\nLa réponse est un objet JSON contenant :\n\n- **left** *(object)* et **right** *(object)* : Chaque côté contient des données d'analyse de foulée avec les champs suivants :\n  - **peak_time** *(number)* : La valeur de temps de pic identifiée dans l'analyse.\n  - **initiator** *(string)* : Indique quel côté a initié le cycle de foulée.\n  - **phases** *(object)* : Un objet avec des phases nommées (ex : `flight`, `takeoff`, `mid_stance`, `strike`, `new_strike`), où chaque phase contient :\n    - **video_frame** *(integer)* : L'image vidéo correspondante.\n    - **graph_phase** *(integer)* : La valeur de phase utilisée dans les graphiques.\n    - **video_phase** *(integer)* : La valeur de phase dans la timeline vidéo.\n    - **image_url** *(string, URI)* : URL publique de l'image instantanée de la phase.\n  - **angles** *(object)* : Mesures d'angle pour les articulations comme `posture_angle`, `lhip_angle`, etc. Chaque inclut :\n    - **current** *(array[number])* : Valeurs d'angle de l'image courante.\n    - **next** *(array[number])* : Valeurs prédites suivantes.\n    - **std_dev** *(array[number])* : Valeurs d'écart type.\n  - **graph_timestamps** *(array[number])* : Horodatages (ms) alignés avec les données graphiques.\n\n- **user_info** *(object)* : Informations sur l'utilisateur ayant soumis la session, incluant :\n  - **age** *(integer)*\n  - **gender** *(string)*\n  - **height** *(number, cm)*\n  - **weight** *(number, kg)*\n  - **email** *(string, email)*\n  - **uid**, **display_name**, **admin_name**, **last_session**, **session_count**, **phone**, **brand**, **shoeModel**, **shoeSize**, **leg_length**, **ycom** *(divers types)*\n\n- **report_comments** *(object, optionnel)* : Suggestions ou notes pour les angles comme `right_posture_angle`, `left_knee_angle`, etc.\n- **date** *(string)* : La date de génération du rapport au format JJ/MM/AAAA.\n\n### Gestion des erreurs\n- **400 Bad Request** : Token ou paramètres invalides.\n- **401 Unauthorized** : Le token est manquant ou invalide.\n- **403 Forbidden** : Un accès admin est requis.\n- **404 Not Found** : La session n'a pas été trouvée ou l'utilisateur n'a pas un plan de paiement valide.\n- **500 Internal Server Error** : Une erreur inattendue est survenue sur le serveur.\n\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session pour laquelle le rapport d'analyse de la foulée est demandé.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Définir à `true` pour récupérer un rapport d'analyse de démonstration pré-généré au lieu d'un réel.","required":false}],"responses":{"200":{"description":"Rapport d'analyse de la foulée récupéré avec succès.","content":{"application/json":{"schema":{"required":["left","right","user_info","date"],"type":"object","properties":{"left":{"description":"Données d'analyse de la foulée pour le côté gauche.","required":["peak_time","phases","initiator","angles","graph_timestamps"],"type":"object","properties":{"peak_time":{"type":"number"},"phases":{"description":"Phases du cycle de foulée avec données vidéo et graphiques.","type":"object","properties":{"flight":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"takeoff":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"mid_stance":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"new_strike":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"strike":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}}}},"initiator":{"type":"string"},"angles":{"type":"object"},"graph_timestamps":{"type":"array","items":{"type":"number"}}}},"right":{"description":"Données d'analyse de la foulée pour le côté droit.","required":["peak_time","phases","initiator","angles","graph_timestamps"],"type":"object","properties":{"peak_time":{"type":"number"},"phases":{"description":"Phases du cycle de foulée avec données vidéo et graphiques.","type":"object","properties":{"flight":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"takeoff":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"mid_stance":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"new_strike":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}},"strike":{"required":["video_frame","graph_phase","video_phase","image_url"],"type":"object","properties":{"video_frame":{"type":"integer"},"graph_phase":{"type":"integer"},"video_phase":{"type":"integer"},"image_url":{"type":"string","format":"uri"}}}}},"initiator":{"type":"string"},"angles":{"type":"object"},"graph_timestamps":{"type":"array","items":{"type":"number"}}}},"user_info":{"description":"Informations utilisateur associées à la session.","required":["age","height","weight","email","uid"],"type":"object","properties":{"age":{"type":"integer"},"gender":{"type":"string"},"height":{"type":"number"},"weight":{"type":"number"},"email":{"type":"string","format":"email"},"uid":{"type":"string"},"display_name":{"type":"string"},"admin_name":{"type":"string"},"last_session":{"type":"string"},"session_count":{"type":"number"},"phone":{"type":"string"},"brand":{"type":"string"},"shoeModel":{"type":"string"},"shoeSize":{"type":"integer"},"leg_length":{"type":"number"},"ycom":{"type":"number"}}},"report_comments":{"description":"(Optionnel) Recommandations pour les angles articulaires.","type":"object"},"date":{"description":"La date du rapport d'analyse de la foulée au format JJ/MM/AAAA.","type":"string"}}}}}},"400":{"description":"Requête invalide - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Le token est invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Un accès admin est requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges admin sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session non trouvée ou l'utilisateur n'a pas un plan de paiement valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que le plan de paiement est invalide.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Créer des fils de recommandations d'analyse de la foulée

> \### Créer des fils de recommandations d'analyse de la foulée\
> Ce point de terminaison génère des fils de recommandations personnalisés pour une session spécifique basée sur l'analyse de la foulée de course de l'utilisateur. Chaque fil propose des insights biomécaniques, des conseils de posture et des recommandations d'entraînement pour différents angles articulaires.\
> \*\*Exemple d'utilisation :\*\*\
> Envoyez une requête \`POST\` à \`/running/sessions/{session\_id}/recommendation/\` où \`{session\_id}\` est l'identifiant unique de la session.\
> \*\*Paramètres :\*\*\
> \- \`session\_id\` \*(string, obligatoire)\* : L'ID unique de la session pour laquelle générer les fils.\
> \*\*Structure de réponse (HTTP 201) :\*\*\
> Retourne un objet JSON associant chaque métrique d'angle de foulée à un ID de fil, incluant les côtés gauche et droit :\
> \- \*\*left\_posture\_angle\*\*, \*\*left\_hip\_angle\*\*, \*\*left\_knee\_angle\*\*, \*\*left\_ankle\_angle\*\*\
> \- \*\*right\_posture\_angle\*\*, \*\*right\_hip\_angle\*\*, \*\*right\_knee\_angle\*\*, \*\*right\_ankle\_angle\*\*\
> \*\*Notes :\*\*\
> \- La session doit être valide et correspondre à un rapport d'analyse de foulée. - Nécessite un plan de paiement actif (Pro, Premium, Enterprise ou Standard).

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/recommendation/":{"post":{"operationId":"running_sessions_recommendation_create","summary":"Créer des fils de recommandations d'analyse de la foulée","description":"### Créer des fils de recommandations d'analyse de la foulée\nCe point de terminaison génère des fils de recommandations personnalisés pour une session spécifique basée sur l'analyse de la foulée de course de l'utilisateur. Chaque fil propose des insights biomécaniques, des conseils de posture et des recommandations d'entraînement pour différents angles articulaires.\n**Exemple d'utilisation :**\nEnvoyez une requête `POST` à `/running/sessions/{session_id}/recommendation/` où `{session_id}` est l'identifiant unique de la session.\n**Paramètres :**\n- `session_id` *(string, obligatoire)* : L'ID unique de la session pour laquelle générer les fils.\n**Structure de réponse (HTTP 201) :**\nRetourne un objet JSON associant chaque métrique d'angle de foulée à un ID de fil, incluant les côtés gauche et droit :\n- **left_posture_angle**, **left_hip_angle**, **left_knee_angle**, **left_ankle_angle**\n- **right_posture_angle**, **right_hip_angle**, **right_knee_angle**, **right_ankle_angle**\n**Notes :**\n- La session doit être valide et correspondre à un rapport d'analyse de foulée. - Nécessite un plan de paiement actif (Pro, Premium, Enterprise ou Standard).","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session.","required":true}],"responses":{"201":{"description":"Fils créés avec succès.","content":{"application/json":{"schema":{"description":"Un dictionnaire associant les métriques d'analyse de foulée aux IDs de fils.","required":["left_hip_angle","left_posture_angle","left_ankle_angle","left_knee_angle","right_posture_angle","right_knee_angle","right_hip_angle","right_ankle_angle"],"type":"object","properties":{"left_hip_angle":{"description":"ID du fil pour les recommandations d'angle de hanche gauche.","type":"string"},"left_posture_angle":{"description":"ID du fil pour les recommandations d'angle de posture gauche.","type":"string"},"left_ankle_angle":{"description":"ID du fil pour les recommandations d'angle de cheville gauche.","type":"string"},"left_knee_angle":{"description":"ID du fil pour les recommandations d'angle de genou gauche.","type":"string"},"right_posture_angle":{"description":"ID du fil pour les recommandations d'angle de posture droite.","type":"string"},"right_knee_angle":{"description":"ID du fil pour les recommandations d'angle de genou droit.","type":"string"},"right_hip_angle":{"description":"ID du fil pour les recommandations d'angle de hanche droite.","type":"string"},"right_ankle_angle":{"description":"ID du fil pour les recommandations d'angle de cheville droite.","type":"string"}}}}}},"400":{"description":"Requête incorrecte - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Accès administrateur requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges d'administrateur sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session introuvable ou l'utilisateur n'a pas de plan de paiement valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que le plan de paiement est invalide.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Obtenir le résumé d'une session de course

> Récupère un résumé détaillé d'une session de course en utilisant son identifiant unique \`session\_id\`. Ce résumé inclut à la fois des métriques de performance quantitatives et un résumé qualitatif généré par GenAI si disponible.\
> \*\*Instructions d'utilisation :\*\*\
> 1\. Envoyez une requête GET avec le \`session\_id\` dans le paramètre de chemin. 2. Le point de terminaison retournera un objet JSON incluant diverses sections du résumé de session.\
> \### Paramètre de requête\
> \- \*\*demo\*\* \*(booléen, optionnel)\* : Définissez à \`true\` pour récupérer un résumé de démonstration pré-généré pour cette session de course.\
> \*\*Structure de réponse :\*\*\
> \- \*\*summary\_text\*\* \*(objet, optionnel)\* : Contient un commentaire généré par GenAI si disponible.\
> &#x20;   \- \*\*balance\_and\_posture\*\* : Commentaires sur l'équilibre et la posture de l'athlète.\
> &#x20;   \- \*\*performance\_metrics\*\* : Commentaires sur les performances globales.\
> &#x20;   \- \*\*running\_mechanics\*\* : Observations sur la mécanique de course.\
> &#x20;   \- \*\*final\_summary\*\* : Une évaluation globale résumant la performance de la session.\
> &#x20;   \- \*\*distance\_and\_duration\*\* : Commentaires sur la distance totale et la durée.\
> \
> \- \*\*performance\_metrics\*\* \*(objet)\* : Métriques de performance agrégées.\
> &#x20;   \- \*\*vitesse\*\* (en m/s)\
> &#x20;   \- \*\*allure\*\* (en min/km)\
> &#x20;   \- \*\*cadence\*\* (pas/min)\
> &#x20;   \- \*\*puissance\*\* (en Watts)\
> &#x20;   \- \*\*puissance\_normalisée\*\* (en W/kg)\
> \
> \- \*\*running\_mechanics\*\* \*(objet)\* : Données de mécanique de course.\
> &#x20;   \- \*\*temps\_contact\*\* (en secondes)\
> &#x20;   \- \*\*temps\_vol\*\* (en secondes)\
> &#x20;   \- \*\*temps\_foulée\*\* (en secondes)\
> &#x20;   \- \*\*longueur\_foulée\*\* (en mètres)\
> &#x20;   \- \*\*attaque\_pied\*\* : Type d'attaque du pied (ex : 'avant-pied').\
> \
> \- \*\*balance\_and\_posture\*\* \*(objet)\* : Métriques d'équilibre et posture.\
> &#x20;   \- \*\*balance\*\* : Scores d'équilibre.\
> &#x20;   \- \*\*angle\_contact\*\* : Angles de contact (en degrés).\
> \
> \- \*\*distance\_and\_duration\*\* \*(objet)\* :\
> &#x20;   \- \*\*distance\_totale\*\* (en mètres)\
> &#x20;   \- \*\*temps\_total\*\* (en secondes)\
> \
> \- \*\*user\_information\*\* \*(objet)\* : Informations détaillées de l'utilisateur.\
> &#x20;   \- \*\*ycom\*\*, \*\*poids\*\*, \*\*âge\*\*, \*\*taille\*\*, etc.\
> \
> \- \*\*session\_date\*\* \*(string)\* : Date de la session (ex : 'DD/MM/YYYY').\
> \*\*Note :\*\* Le champ \`summary\_text\` n'est présent que si des commentaires générés par GenAI ont été enregistrés pour la session.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/summary/":{"get":{"operationId":"running_sessions_summary_list","summary":"Obtenir le résumé d'une session de course","description":"Récupère un résumé détaillé d'une session de course en utilisant son identifiant unique `session_id`. Ce résumé inclut à la fois des métriques de performance quantitatives et un résumé qualitatif généré par GenAI si disponible.\n**Instructions d'utilisation :**\n1. Envoyez une requête GET avec le `session_id` dans le paramètre de chemin. 2. Le point de terminaison retournera un objet JSON incluant diverses sections du résumé de session.\n### Paramètre de requête\n- **demo** *(booléen, optionnel)* : Définissez à `true` pour récupérer un résumé de démonstration pré-généré pour cette session de course.\n**Structure de réponse :**\n- **summary_text** *(objet, optionnel)* : Contient un commentaire généré par GenAI si disponible.\n    - **balance_and_posture** : Commentaires sur l'équilibre et la posture de l'athlète.\n    - **performance_metrics** : Commentaires sur les performances globales.\n    - **running_mechanics** : Observations sur la mécanique de course.\n    - **final_summary** : Une évaluation globale résumant la performance de la session.\n    - **distance_and_duration** : Commentaires sur la distance totale et la durée.\n\n- **performance_metrics** *(objet)* : Métriques de performance agrégées.\n    - **vitesse** (en m/s)\n    - **allure** (en min/km)\n    - **cadence** (pas/min)\n    - **puissance** (en Watts)\n    - **puissance_normalisée** (en W/kg)\n\n- **running_mechanics** *(objet)* : Données de mécanique de course.\n    - **temps_contact** (en secondes)\n    - **temps_vol** (en secondes)\n    - **temps_foulée** (en secondes)\n    - **longueur_foulée** (en mètres)\n    - **attaque_pied** : Type d'attaque du pied (ex : 'avant-pied').\n\n- **balance_and_posture** *(objet)* : Métriques d'équilibre et posture.\n    - **balance** : Scores d'équilibre.\n    - **angle_contact** : Angles de contact (en degrés).\n\n- **distance_and_duration** *(objet)* :\n    - **distance_totale** (en mètres)\n    - **temps_total** (en secondes)\n\n- **user_information** *(objet)* : Informations détaillées de l'utilisateur.\n    - **ycom**, **poids**, **âge**, **taille**, etc.\n\n- **session_date** *(string)* : Date de la session (ex : 'DD/MM/YYYY').\n**Note :** Le champ `summary_text` n'est présent que si des commentaires générés par GenAI ont été enregistrés pour la session.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Définissez à `true` pour récupérer un résumé de démonstration pré-généré.","required":false}],"responses":{"200":{"description":"Résumé de session récupéré avec succès","content":{"application/json":{"schema":{"required":["summary_text","performance_metrics","running_mechanics","balance_and_posture","distance_and_duration","user_information","session_date"],"type":"object","properties":{"summary_text":{"description":"Résumé textuel optionnel de la session (uniquement si des commentaires GenAI sont disponibles).","type":"object","properties":{"balance_and_posture":{"description":"Commentaires sur l'équilibre et la posture de l'athlète.","type":"string"},"performance_metrics":{"description":"Commentaires sur les performances.","type":"string"},"running_mechanics":{"description":"Commentaires sur la mécanique de course.","type":"string"},"final_summary":{"description":"Résumé global de la session.","type":"string"},"distance_and_duration":{"description":"Commentaires sur la distance et la durée.","type":"string"}}},"performance_metrics":{"type":"object","properties":{"speed":{"type":"object","properties":{"min":{"description":"Vitesse minimale (m/s)","type":"number"},"max":{"description":"Vitesse maximale (m/s)","type":"number"},"avg":{"description":"Vitesse moyenne (m/s)","type":"number"},"values":{"description":"Tableau des valeurs de vitesse","type":"array","items":{"type":"number"}}}},"pace":{"type":"object","properties":{"min":{"description":"Allure minimale (min/km)","type":"number"},"max":{"description":"Allure maximale (min/km)","type":"number"},"avg":{"description":"Allure moyenne (min/km)","type":"number"},"values":{"description":"Tableau des valeurs d'allure","type":"array","items":{"type":"number"}}}},"cadence":{"type":"object","properties":{"min":{"description":"Cadence minimale (pas/min)","type":"number"},"max":{"description":"Cadence maximale (pas/min)","type":"number"},"avg":{"description":"Cadence moyenne (pas/min)","type":"number"},"values":{"description":"Tableau des valeurs de cadence","type":"array","items":{"type":"number"}}}},"power":{"type":"object","properties":{"min":{"description":"Puissance minimale (W)","type":"number"},"max":{"description":"Puissance maximale (W)","type":"number"},"avg":{"description":"Puissance moyenne (W)","type":"number"},"values":{"description":"Tableau des valeurs de puissance","type":"array","items":{"type":"number"}}}},"normalized_power":{"type":"object","properties":{"min":{"description":"Puissance normalisée minimale (W/kg)","type":"number"},"max":{"description":"Puissance normalisée maximale (W/kg)","type":"number"},"avg":{"description":"Puissance normalisée moyenne (W/kg)","type":"number"},"values":{"description":"Tableau des valeurs de puissance normalisée","type":"array","items":{"type":"number"}}}}}},"running_mechanics":{"type":"object","properties":{"contact_time":{"type":"object","properties":{"min":{"description":"Temps de contact minimal (s)","type":"number"},"max":{"description":"Temps de contact maximal (s)","type":"number"},"avg":{"description":"Temps de contact moyen (s)","type":"number"},"values":{"description":"Tableau des temps de contact","type":"array","items":{"type":"number"}}}},"flight_time":{"type":"object","properties":{"min":{"description":"Temps de vol minimal (s)","type":"number"},"max":{"description":"Temps de vol maximal (s)","type":"number"},"avg":{"description":"Temps de vol moyen (s)","type":"number"},"values":{"description":"Tableau des temps de vol","type":"array","items":{"type":"number"}}}},"stride_time":{"type":"object","properties":{"min":{"description":"Temps de foulée minimal (s)","type":"number"},"max":{"description":"Temps de foulée maximal (s)","type":"number"},"avg":{"description":"Temps de foulée moyen (s)","type":"number"},"values":{"description":"Tableau des temps de foulée","type":"array","items":{"type":"number"}}}},"stride_length":{"type":"object","properties":{"min":{"description":"Longueur de foulée minimale (m)","type":"number"},"max":{"description":"Longueur de foulée maximale (m)","type":"number"},"avg":{"description":"Longueur de foulée moyenne (m)","type":"number"},"values":{"description":"Tableau des longueurs de foulée","type":"array","items":{"type":"number"}}}},"footstrike":{"description":"Type d'attaque du pied le plus fréquent (ex : 'avant-pied')","type":"string"}}},"balance_and_posture":{"type":"object","properties":{"balance":{"type":"object","properties":{"min":{"description":"Score d'équilibre minimal","type":"number"},"max":{"description":"Score d'équilibre maximal","type":"number"},"avg":{"description":"Score d'équilibre moyen","type":"number"},"values":{"description":"Tableau des scores d'équilibre","type":"array","items":{"type":"number"}}}},"contact_angle":{"type":"object","properties":{"min":{"description":"Angle de contact minimal (degrés)","type":"number"},"max":{"description":"Angle de contact maximal (degrés)","type":"number"},"avg":{"description":"Angle de contact moyen (degrés)","type":"number"},"values":{"description":"Tableau des angles de contact","type":"array","items":{"type":"number"}}}}}},"distance_and_duration":{"type":"object","properties":{"total_distance":{"description":"Distance totale parcourue (m)","type":"number"},"total_time":{"description":"Durée totale de la session (s)","type":"number"}}},"user_information":{"description":"Informations détaillées de l'utilisateur.","type":"object","properties":{"ycom":{"description":"Valeur YCOM de l'utilisateur","type":"number"},"weight":{"description":"Poids de l'utilisateur (kg)","type":"number"},"age":{"description":"Âge de l'utilisateur","type":"string"},"height":{"description":"Taille de l'utilisateur (cm)","type":"number"},"leg_length":{"description":"Longueur de jambe de l'utilisateur (m)","type":"number"},"shoeSize":{"description":"Pointure de l'utilisateur","type":"number"},"gender":{"description":"Genre de l'utilisateur","type":"string"},"user":{"description":"Identifiant unique de l'utilisateur","type":"string"},"brand":{"description":"Marque de chaussure préférée (si disponible)","type":"string"},"shoeModel":{"description":"Modèle de chaussure (si disponible)","type":"string"},"email":{"description":"Adresse email de l'utilisateur","type":"string"},"display_name":{"description":"Nom d'affichage de l'utilisateur","type":"string"}}},"session_date":{"description":"Date de la session formatée (ex : '07/04/2025')","type":"string"}}}}}},"400":{"description":"Requête incorrecte - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Accès administrateur requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges d'administrateur sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session introuvable ou l'utilisateur n'a pas de plan de paiement valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que le plan de paiement est invalide.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```

## Générer un résumé pour une session de course

> Déclenche la génération de fils de résumé pour une session de course. Ce point de terminaison crée des fils de résumé séparés pour chaque bloc basé sur les métriques de session, y compris les performances, la mécanique de course, l'équilibre/posture, et la distance/durée, ainsi qu'un résumé global. Retourne un objet JSON contenant les IDs de fils pour chaque bloc.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/running/sessions/{session_id}/summary/":{"post":{"operationId":"running_sessions_summary_create","summary":"Générer un résumé pour une session de course","description":"Déclenche la génération de fils de résumé pour une session de course. Ce point de terminaison crée des fils de résumé séparés pour chaque bloc basé sur les métriques de session, y compris les performances, la mécanique de course, l'équilibre/posture, et la distance/durée, ainsi qu'un résumé global. Retourne un objet JSON contenant les IDs de fils pour chaque bloc.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session","required":true},{"schema":{"type":"string","enum":["metric","imperial"]},"name":"measurement_system","in":"query","description":"Système de mesure : 'métrique' ou 'impérial'","required":false}],"responses":{"201":{"description":"Fils de résumé générés avec succès.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"description":"ID de fil correspondant à un bloc de résumé","type":"string"}}}}},"400":{"description":"Requête incorrecte - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Accès administrateur requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges d'administrateur sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session introuvable ou l'utilisateur n'a pas de plan de paiement valide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que le plan de paiement est invalide.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue s'est produite.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Un message d'erreur détaillé indiquant une défaillance côté serveur.","type":"string"}}}}}}},"tags":["running"]}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aikynetix.app/fr/api-documentation/developer-resources-and-api-reference/api-reference/running.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
