{"openapi":"3.1.0","info":{"title":"STRIP","description":"Plateforme de streaming vidéo et messagerie temps réel","version":"1.0.2"},"paths":{"/api/feed/random":{"get":{"summary":"Get Random Videos","description":"API endpoint pour récupérer des vidéos aléatoires","operationId":"get_random_videos_api_feed_random_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feed/next":{"get":{"summary":"Get Next Videos","description":"API endpoint pour charger plus de vidéos (scroll infini)","operationId":"get_next_videos_api_feed_next_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/token":{"post":{"summary":"Login Api","operationId":"login_api_api_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_api_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/register":{"post":{"summary":"Register Api","description":"API d'inscription","operationId":"register_api_api_users_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me":{"get":{"summary":"Get My Profile","operationId":"get_my_profile_api_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"summary":"Update Profile","operationId":"update_profile_api_users_me_put","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_update_profile_api_users_me_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/{user_id}":{"get":{"summary":"Get User Profile","operationId":"get_user_profile_api_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/level":{"get":{"summary":"Get My Level","description":"Niveau / rang de l'utilisateur connecté, basé sur ses likes et commentaires reçus.","operationId":"get_my_level_api_users_me_level_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/{user_id}/level":{"get":{"summary":"Get User Level","description":"Niveau / rang d'un utilisateur donné, basé sur ses likes et commentaires reçus.","operationId":"get_user_level_api_users__user_id__level_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/levels":{"get":{"summary":"Get Levels Table","description":"Retourne la grille complète des rangs disponibles (pour affichage front-end).","operationId":"get_levels_table_api_levels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/users/me/card":{"get":{"summary":"Get My Card","description":"Carte de profil complète (badge Iddet Plus, style, crédits, niveau/score).","operationId":"get_my_card_api_users_me_card_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/{user_id}/card":{"get":{"summary":"Get User Card","description":"Carte de profil publique d'un utilisateur (sans le solde de crédits, privé).","operationId":"get_user_card_api_users__user_id__card_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/card/style":{"put":{"summary":"Update Card Style","description":"Change le style visuel de la carte. Les styles premium exigent Iddet Plus actif.","operationId":"update_card_style_api_users_me_card_style_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CardStyleUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/iddet-plus":{"get":{"summary":"Get My Iddet Plus Status","description":"Statut détaillé de l'abonnement Iddet Plus + historique récent.","operationId":"get_my_iddet_plus_status_api_users_me_iddet_plus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/credits/me":{"get":{"summary":"Get My Credits","description":"Solde de crédits + dernières transactions.","operationId":"get_my_credits_api_credits_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/credits/spend":{"post":{"summary":"Spend Credits","description":"Débite des crédits du compte de l'utilisateur courant (usage générique interne à l'app).","operationId":"spend_credits_api_credits_spend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditSpend"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/iddet-plus/checkout":{"post":{"summary":"Create Iddet Plus Checkout","description":"Démarre un paiement Iddet Plus via chariow : crée (ou réutilise) le produit\ncorrespondant au prix/devise, ouvre une intention de paiement avec une\nréférence unique, et retourne le lien de paiement à ouvrir côté client.\n\n⚠️ Le produit \"Iddet Plus\" est publié sur chariow avec un prix fixe dans\nune devise donnée (actuellement 2800 CDF — Franc Congolais). Le montant\nréellement facturé au client est celui configuré sur ce produit chariow,\npas celui envoyé ici : ce endpoint sert à afficher/enregistrer le bon\nmontant côté application (historique, reçus, statistiques) et DOIT donc\nrester cohérent avec le prix réel du produit chariow.\n\n⚠️ On n'appelle plus l'API chariow POST /v1/checkout depuis le serveur :\ncet endpoint renvoyait systématiquement 422 (téléphone requis, puis\nindicatif pays \"243\" refusé par chariow). À la place, on se contente de :\n  1. créer une intention \"pending\" en base (pour le webhook et le polling),\n  2. renvoyer au client les infos nécessaires pour afficher le WIDGET\n     chariow (product_id + store_domain) directement dans l'app/le site.\nLe widget ouvre lui-même la fenêtre de paiement chariow (carte, mobile\nmoney...), et chariow nous notifie le résultat via /api/webhooks/chariow,\nqui active Iddet Plus si le paiement est confirmé.","operationId":"create_iddet_plus_checkout_api_iddet_plus_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IddetPlusCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/iddet-plus/checkout/{reference}/status":{"get":{"summary":"Get Iddet Plus Checkout Status","description":"Permet au front-end de vérifier si le paiement a déjà été confirmé (polling en complément du webhook).","operationId":"get_iddet_plus_checkout_status_api_iddet_plus_checkout__reference__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string","title":"Reference"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/chariow":{"post":{"summary":"Chariow Webhook","description":"Point d'entrée appelé par chariow à chaque événement de vente.\nVérifie la signature HMAC, retrouve l'intention via la référence transmise\nà la création du lien de paiement, puis active Iddet Plus si la vente est\nconfirmée. Idempotent via chariow_sale_id.","operationId":"chariow_webhook_api_webhooks_chariow_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/users/me/verify":{"post":{"summary":"Request Verification","description":"Déclenche secure.self().verify pour l'utilisateur connecté.\n\nCritères vérifiés côté serveur :\n  • Profil complet (username, avatar, bio, email, téléphone)\n  • Au moins une vidéo avec son original (has_original_sound = true)\n  • ≥ 10 000 abonnés\n  • ≥ 100 000 vues cumulées\n  • Âge ≥ 18 ans (selon birth_date fourni)\n\nEn cas de succès :\n  • Le badge is_verified est activé en BDD\n  • Le signe astrologique est calculé et renvoyé\n  • Les avantages badge sont listés dans la réponse","operationId":"request_verification_api_users_me_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationCriteria"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/verification-status":{"get":{"summary":"Get Verification Status","description":"Retourne le statut de vérification de l'utilisateur connecté.","operationId":"get_verification_status_api_users_me_verification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/feed":{"get":{"summary":"Get Feed","description":"Algorithme de Feed Avancé \"Pour Toi\" (Style TikTok)\nMélange Récence (en descendant), Popularité (Vues/Likes) et Découverte (Aléatoire).","operationId":"get_feed_api_feed_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/{video_id}/view":{"post":{"summary":"Increment View","operationId":"increment_view_api_videos__video_id__view_post","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/videos/upload":{"post":{"summary":"Upload Video","operationId":"upload_video_api_videos_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_video_api_videos_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/videos/{video_id}/like":{"post":{"summary":"Like Video","operationId":"like_video_api_videos__video_id__like_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/categories":{"get":{"summary":"Get Categories","description":"Liste des catégories disponibles pour les actfiles","operationId":"get_categories_api_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/users/me/categories":{"get":{"summary":"Get My Categories","operationId":"get_my_categories_api_users_me_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"summary":"Update My Categories","description":"Met à jour les catégories préférées de l'utilisateur pour personnaliser sa découverte","operationId":"update_my_categories_api_users_me_categories_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCategoriesUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/actfile":{"post":{"summary":"Create Actfile","description":"Publier un nouveau texte Markdown avec catégorie, optionnellement dans une communauté/salon","operationId":"create_actfile_api_actfile_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActFileCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Actfiles","description":"Fil de découverte des actfiles, personnalisé selon les catégories préférées.\nBoost 1.5x sur les catégories choisies dans les paramètres, tri aléatoire pondéré\npour éviter de retomber sur les mêmes publications à chaque appel.","operationId":"get_actfiles_api_actfile_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"username","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre : ne renvoie que les actfiles de cet auteur (page de profil).","title":"Username"},"description":"Filtre : ne renvoie que les actfiles de cet auteur (page de profil)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}":{"delete":{"summary":"Delete Actfile","description":"Supprime une publication (actfile) — uniquement par son auteur.","operationId":"delete_actfile_api_actfile__actfile_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Single Actfile","description":"Récupère une publication (actfile) unique par son ID — utilisé par la\npage web de détail /actfile/{id} (lien permanent, partage direct).","operationId":"get_single_actfile_api_actfile__actfile_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}/ads":{"post":{"summary":"Create Actfile Ad","description":"Publie une actfile comme Ads — géré ENTIÈREMENT ici, en local. La\ncampagne est activée immédiatement : `is_sponsored` passe à True tout de\nsuite et le badge \"Sponsorisé\" apparaît partout où l'actfile est\naffichée. Pas de budget requis pour l'instant.","operationId":"create_actfile_ad_api_actfile__actfile_id__ads_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdCampaignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Actfile Ad Status","description":"Statut de la campagne (locale) d'une actfile.","operationId":"get_actfile_ad_status_api_actfile__actfile_id__ads_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Cancel Actfile Ad","description":"Retire le statut sponsorisé (campagne locale).","operationId":"cancel_actfile_ad_api_actfile__actfile_id__ads_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}/view":{"post":{"summary":"Increment Actfile View","description":"Incrémenter le nombre de vues (à appeler quand l'utilisateur scrolle sur le post ou l'ouvre)","operationId":"increment_actfile_view_api_actfile__actfile_id__view_post","parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}/like":{"post":{"summary":"Like Actfile","description":"Liker ou Unliker une publication Markdown","operationId":"like_actfile_api_actfile__actfile_id__like_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}/comment":{"post":{"summary":"Comment Actfile","description":"Ajouter un commentaire à une publication","operationId":"comment_actfile_api_actfile__actfile_id__comment_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActFileCommentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/actfile/{actfile_id}/comments":{"get":{"summary":"Get Actfile Comments","description":"Récupérer les commentaires d'une publication","operationId":"get_actfile_comments_api_actfile__actfile_id__comments_get","parameters":[{"name":"actfile_id","in":"path","required":true,"schema":{"type":"string","title":"Actfile Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/conversations":{"get":{"summary":"Get Conversations","operationId":"get_conversations_api_messages_conversations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/messages/{user_id}":{"get":{"summary":"Get Messages","operationId":"get_messages_api_messages__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{user_id}/status":{"get":{"summary":"Get Conversation Status","description":"Statut de présence/lecture pour une conversation, façon WhatsApp :\n- is_online : l'autre personne a une activité récente (< 5 min)\n- last_seen : dernière fois vue active\n- last_message_from_me_read / read_at : si MON dernier message envoyé a\n  été lu (coche bleue), et quand — permet d'afficher \"en ligne mais n'a\n  pas encore lu ton message\" côté client (is_online=true ET\n  last_message_from_me_read=false).","operationId":"get_conversation_status_api_messages__user_id__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/send":{"post":{"summary":"Send Message","operationId":"send_message_api_messages_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/messages/{message_id}":{"delete":{"summary":"Delete Message","description":"Supprime un message — uniquement par son expéditeur.","operationId":"delete_message_api_messages__message_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{message_id}/react":{"post":{"summary":"React To Message","description":"Réaction rapide (emoji) sur un message. Un seul emoji actif par\nutilisateur et par message : renvoyer le même emoji la retire,\nen envoyer un différent la remplace.","operationId":"react_to_message_api_messages__message_id__react_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageReactionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{message_id}/reactions":{"get":{"summary":"Get Message Reactions","description":"Récupère les réactions groupées par emoji pour un message.","operationId":"get_message_reactions_api_messages__message_id__reactions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/devices/register":{"post":{"summary":"Register Device","description":"À appeler par l'app à chaque login ET à chaque onNewToken() de FCM.\nUn jeton appartient à UN seul compte : on le réassigne si l'appareil change d'utilisateur.","operationId":"register_device_api_devices_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/devices/unregister":{"post":{"summary":"Unregister Device","description":"À appeler au logout, pour ne plus recevoir les appels du compte déconnecté.","operationId":"unregister_device_api_devices_unregister_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceRegister"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calls/start":{"post":{"summary":"Start Call","description":"Démarre un appel vocal. Le flux audio transitera entièrement par notre\nserveur via /ws/call-audio/{call_id} — aucun WebRTC, aucun service tiers.","operationId":"start_call_api_calls_start_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_start_call_api_calls_start_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calls/incoming":{"get":{"summary":"Incoming Calls","description":"Appels qui sonnent actuellement pour moi. À interroger toutes les ~2 s\npar l'app Kotlin tant que le WebSocket n'est pas connecté (et au retour\nau premier plan / à la réception d'une notification FCM).","operationId":"incoming_calls_api_calls_incoming_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/calls/{call_id}/status":{"get":{"summary":"Call Status","description":"État courant d'un appel (ringing | accepted | declined | missed | ended).\nC'est la route que l'app interroge pour savoir si l'autre a décroché.","operationId":"call_status_api_calls__call_id__status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calls/{call_id}/accept":{"post":{"summary":"Accept Call","operationId":"accept_call_api_calls__call_id__accept_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calls/{call_id}/decline":{"post":{"summary":"Decline Call","operationId":"decline_call_api_calls__call_id__decline_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calls/{call_id}/end":{"post":{"summary":"End Call","operationId":"end_call_api_calls__call_id__end_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stories":{"get":{"summary":"Get Active Stories","description":"Récupère toutes les stories actives (publiées il y a moins de 24 heures).","operationId":"get_active_stories_api_stories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Story","description":"Publie une story avec des effets avancés OpenCV, puis stockage sur GitHub.","operationId":"create_story_api_stories_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_story_api_stories_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/stories/{story_id}":{"delete":{"summary":"Delete Story","description":"Supprime une story — uniquement par son auteur.","operationId":"delete_story_api_stories__story_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"story_id","in":"path","required":true,"schema":{"type":"string","title":"Story Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/live/create":{"post":{"summary":"Create Live","description":"Crée un flux live Cloudflare et l'enregistre en BDD pour l'utilisateur","operationId":"create_live_api_live_create_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/live/{input_id}/status":{"get":{"summary":"Get Live Status","description":"Vérifie si le flux est actif (en train de streamer)","operationId":"get_live_status_api_live__input_id__status_get","parameters":[{"name":"input_id","in":"path","required":true,"schema":{"type":"string","title":"Input Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/live/{input_id}/playback":{"get":{"summary":"Get Live Playback","description":"Récupère les liens de lecture pour le lecteur vidéo du front-end","operationId":"get_live_playback_api_live__input_id__playback_get","parameters":[{"name":"input_id","in":"path","required":true,"schema":{"type":"string","title":"Input Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lives/start":{"post":{"summary":"Start Live","operationId":"start_live_api_lives_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveStreamCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/lives/{live_id}/stop":{"post":{"summary":"Stop Live","operationId":"stop_live_api_lives__live_id__stop_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"live_id","in":"path","required":true,"schema":{"type":"string","title":"Live Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lives/active":{"get":{"summary":"Get Active Lives","operationId":"get_active_lives_api_lives_active_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications":{"get":{"summary":"Get Notifications","operationId":"get_notifications_api_notifications_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connected-apps":{"get":{"summary":"List Connected Apps","description":"Apps clientes MCP connectées à mon compte (nom + icône), façon\n'Authorized OAuth Apps' GitHub / apps intégrées Shopify.","operationId":"list_connected_apps_api_connected_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/connected-apps/{app_id}":{"delete":{"summary":"Remove Connected App","description":"Révoque une app cliente MCP connectée.","operationId":"remove_connected_app_api_connected_apps__app_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/{user_id}/follow":{"post":{"summary":"Follow User","operationId":"follow_user_api_users__user_id__follow_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/location":{"post":{"summary":"Update My Location","description":"Met à jour ma position GPS (façon Snap Map). Calcule ma vitesse depuis la\ndernière position connue — utilisée aussi par le détecteur d'embouteillage.","operationId":"update_my_location_api_location_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"delete":{"summary":"Stop Sharing Location","description":"Coupe le partage de position (n'apparaît plus sur la Snap Map des amis).","operationId":"stop_sharing_location_api_location_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/country":{"put":{"summary":"Set My Country","description":"Règle le pays natal/actuel à la main. Ce réglage est prioritaire :\nla détection automatique via GPS (POST /api/location) ne l'écrasera\nplus, jusqu'à un appel explicite à POST /api/users/me/country/auto.","operationId":"set_my_country_api_users_me_country_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/country/auto":{"post":{"summary":"Redetect My Country","description":"Repasse en détection automatique et la relance immédiatement à partir\nde la dernière position GPS connue (hors ligne, aucun service externe).","operationId":"redetect_my_country_api_users_me_country_auto_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/friends/nearby":{"get":{"summary":"Get Nearby Friends","description":"Snap Map : liste les amis (abonnements mutuels) qui partagent leur position\nrécente, triés du plus proche au plus loin. Nécessite d'avoir soi-même\npartagé une position récente via POST /api/location.","operationId":"get_nearby_friends_api_friends_nearby_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects":{"get":{"summary":"Get User Projects","description":"Récupérer la liste des projets audio de l'utilisateur","operationId":"get_user_projects_api_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"summary":"Create Project","description":"Créer un nouveau projet audio (ou initier un remix)","operationId":"create_project_api_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/projects/{project_id}/collaborators":{"post":{"summary":"Add Project Collaborator","description":"Inviter un utilisateur à collaborer avec vérification des permissions","operationId":"add_project_collaborator_api_projects__project_id__collaborators_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollaboratorAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/playlists/{playlist_id}/items":{"post":{"summary":"Add Sound To Playlist","description":"Ajouter un son à une playlist collaborative","operationId":"add_sound_to_playlist_api_playlists__playlist_id__items_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"playlist_id","in":"path","required":true,"schema":{"type":"string","title":"Playlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistItemAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities":{"post":{"summary":"Create Community","description":"Crée une communauté. Le créateur devient admin + membre, avec un salon #general par défaut.","operationId":"create_community_api_communities_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Communities","description":"Liste / recherche les communautés, triées par popularité, récence ou alphabétiquement.","operationId":"list_communities_api_communities_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(popular|recent|alpha)$","default":"popular","title":"Sort"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/communities":{"get":{"summary":"Get My Communities","description":"Liste les communautés dont l'utilisateur connecté est membre.","operationId":"get_my_communities_api_users_me_communities_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(member|moderator|admin)$"},{"type":"null"}],"title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}":{"get":{"summary":"Get Community","description":"Détails d'une communauté par son slug.","operationId":"get_community_api_communities__slug__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Community","description":"Modifie une communauté — réservé aux admins/modérateurs.","operationId":"update_community_api_communities__slug__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Community","description":"Supprime une communauté — réservé au créateur.","operationId":"delete_community_api_communities__slug__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/verify":{"post":{"summary":"Verify Community","description":"Accorde le badge de vérification à une communauté (blanc — distinct du\nbadge bleu des comptes utilisateurs). Réservé aux administrateurs de la\nplateforme (liste blanche MCP_ADMIN_USERNAMES). Chaque vérification est\njournalisée dans `community_verifications` (base de vérification).","operationId":"verify_community_api_communities__slug__verify_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_community_api_communities__slug__verify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Unverify Community","description":"Révoque le badge de vérification d'une communauté. Réservé aux\nadministrateurs — impossible sur les communautés officielles vérifiées\nà vie (`iddet`, `mshop`).","operationId":"unverify_community_api_communities__slug__verify_delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/icon":{"put":{"summary":"Update Community Icon","description":"Met à jour l'icône (avatar) d'une communauté — réservé aux admins/modérateurs.","operationId":"update_community_icon_api_communities__slug__icon_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_update_community_icon_api_communities__slug__icon_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/join":{"post":{"summary":"Join Or Leave Community","description":"Rejoint ou quitte une communauté (toggle).","operationId":"join_or_leave_community_api_communities__slug__join_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/members/{user_id}/role":{"put":{"summary":"Update Member Role","description":"Change le rôle d'un membre — réservé au créateur de la communauté.","operationId":"update_member_role_api_communities__slug__members__user_id__role_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/members":{"get":{"summary":"List Community Members","description":"Liste les membres d'une communauté avec leur profil propre à cette communauté (pseudo/avatar).","operationId":"list_community_members_api_communities__slug__members_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/members/me/profile":{"put":{"summary":"Update My Community Profile","description":"Définit MON pseudo/avatar propres à cette communauté (comme un pseudo de\nserveur Discord) — n'affecte pas mon profil global sur le reste d'IDDET.","operationId":"update_my_community_profile_api_communities__slug__members_me_profile_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityMemberProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/ban":{"post":{"summary":"Ban Community Member","description":"Bannit un membre — réservé aux admins/modérateurs.","operationId":"ban_community_member_api_communities__slug__ban_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityBanCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/bots":{"post":{"summary":"Create Community Bot","description":"Crée un bot de modération pour la communauté. Réservé aux admins/modérateurs.\nLe token n'est retourné qu'une seule fois — il faut le stocker côté client du bot.","operationId":"create_community_bot_api_communities__slug__bots_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityBotCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Community Bots","description":"Liste les bots de modération de la communauté (sans les tokens). Réservé aux admins/modérateurs.","operationId":"list_community_bots_api_communities__slug__bots_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/bots/{bot_id}":{"put":{"summary":"Update Community Bot","description":"Met à jour la configuration d'un bot (mots interdits, seuil de ban auto, message d'accueil, actif/inactif).","operationId":"update_community_bot_api_communities__slug__bots__bot_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommunityBotUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Community Bot","description":"Supprime un bot de modération. Réservé aux admins/modérateurs.","operationId":"delete_community_bot_api_communities__slug__bots__bot_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/bots/{bot_id}/actions":{"post":{"summary":"Perform Bot Mod Action","description":"Action de modération exécutée par le bot lui-même (authentifié par son\ntoken, pas par un JWT utilisateur). Envoyer le token dans l'en-tête\n`X-Bot-Token`. Actions supportées : delete_post, ban, mute, warn.","operationId":"perform_bot_mod_action_api_communities__slug__bots__bot_id__actions_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}},{"name":"X-Bot-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Bot-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BotModAction"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/mod-actions":{"get":{"summary":"Get Community Mod Actions","description":"Journal d'audit des actions de modération (manuelles et automatiques). Réservé aux admins/modérateurs.","operationId":"get_community_mod_actions_api_communities__slug__mod_actions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/posts":{"get":{"summary":"Get Community Posts","description":"Liste les publications (actfiles) postées dans une communauté, optionnellement filtrées par salon.","operationId":"get_community_posts_api_communities__slug__posts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"channel_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/channels":{"get":{"summary":"List Community Channels","description":"Liste les salons (#salon) d'une communauté, avec compteur de non-lus par salon.","operationId":"list_community_channels_api_communities__slug__channels_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Community Channel","description":"Crée un nouveau salon dans une communauté — réservé aux admins/modérateurs.","operationId":"create_community_channel_api_communities__slug__channels_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/channels/{channel_id}":{"put":{"summary":"Update Community Channel","description":"Modifie un salon (nom, description, type, position) — réservé aux admins/modérateurs.","operationId":"update_community_channel_api_communities__slug__channels__channel_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Community Channel","description":"Supprime un salon — réservé aux admins/modérateurs. Le salon par défaut ne peut pas être supprimé.","operationId":"delete_community_channel_api_communities__slug__channels__channel_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/communities/{slug}/channels/{channel_id}/read":{"post":{"summary":"Mark Channel Read","description":"Marque un salon comme lu par l'utilisateur courant (remet son compteur de non-lus à zéro).","operationId":"mark_channel_read_api_communities__slug__channels__channel_id__read_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"summary":"Search","description":"API de recherche globale avec filtrage NLP et signature Agent","operationId":"search_api_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","pattern":"^(users|videos|sounds)$","default":"users","title":"Type"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"summary":"Get Stats","operationId":"get_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sounds/upload":{"post":{"summary":"Upload Sound","operationId":"upload_sound_api_sounds_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_sound_api_sounds_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/sounds/recommendations":{"get":{"summary":"Get Recommended Sounds","operationId":"get_recommended_sounds_api_sounds_recommendations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/comments/count":{"get":{"summary":"Get Sound Comments Count","description":"Récupère le nombre total de commentaires.\nIntègre l'algorithme : is_identifier_count_id_and_name_is_verified()","operationId":"get_sound_comments_count_api_sounds__sound_id__comments_count_get","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}":{"get":{"summary":"Get Sound Details","operationId":"get_sound_details_api_sounds__sound_id__get","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/short":{"get":{"summary":"Get Sound Short Format","description":"Récupère les métadonnées au format Short (TikTok/Spotlight/Spotify).\nFonctionne même pour les sons pas encore disponibles (bientôt dispo / aperçu).","operationId":"get_sound_short_format_api_sounds__sound_id__short_get","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/short/stream":{"get":{"summary":"Stream Sound Short Audio Endpoint","description":"Diffuse le flux audio du short limité à 40s sans vidéo.","operationId":"stream_sound_short_audio_endpoint_api_sounds__sound_id__short_stream_get","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/play":{"post":{"summary":"Increment Sound Play","description":"Incrémente le compteur d'écoutes d'un son (peut être appelé par n'importe qui)","operationId":"increment_sound_play_api_sounds__sound_id__play_post","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/like":{"post":{"summary":"Like Sound","description":"Liker ou Unliker un son","operationId":"like_sound_api_sounds__sound_id__like_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/comment":{"post":{"summary":"Comment Sound","description":"Ajouter un commentaire à un son","operationId":"comment_sound_api_sounds__sound_id__comment_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoundCommentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/comments":{"get":{"summary":"Get Sound Comments","description":"Récupérer les commentaires d'un son","operationId":"get_sound_comments_api_sounds__sound_id__comments_get","parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/{sound_id}/likes/count":{"get":{"summary":"Get Sound Likes Count","description":"Récupère le nombre total de likes d'un son.\nVérifie également si l'utilisateur actuel a déjà liké (limite de 1 like par personne).","operationId":"get_sound_likes_count_api_sounds__sound_id__likes_count_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sound_id","in":"path","required":true,"schema":{"type":"string","title":"Sound Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sounds/category/{category_name}":{"get":{"summary":"Get Sounds By Category","description":"Récupérer les top sons d'une catégorie spécifique (ex: Amapiano, Rumba)","operationId":"get_sounds_by_category_api_sounds_category__category_name__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category_name","in":"path","required":true,"schema":{"type":"string","title":"Category Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/{user_id}/sounds":{"get":{"summary":"Get User Sounds","description":"Récupérer tous les sons publiés par un utilisateur précis (pour son profil STRIP)","operationId":"get_user_sounds_api_users__user_id__sounds_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/profile/{user_id}/full":{"get":{"summary":"Get Full User Profile","description":"Récupère le profil complet de l'utilisateur avec ses statistiques STRIP et Audio","operationId":"get_full_user_profile_api_profile__user_id__full_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/profile/{user_id}/wings":{"get":{"summary":"Get User Wings","description":"Récupère les 'Wings' (Vidéos/Publications) de l'utilisateur.\nC'est la route appelée par défaut quand on navigue sur un profil.","operationId":"get_user_wings_api_profile__user_id__wings_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":15,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActFileCommentCreate":{"properties":{"content":{"type":"string","maxLength":2000,"minLength":1,"title":"Content"}},"type":"object","required":["content"],"title":"ActFileCommentCreate"},"ActFileCreate":{"properties":{"content":{"type":"string","maxLength":15000,"minLength":1,"title":"Content"},"category":{"type":"string","title":"Category","default":"Autres"},"community_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community Slug","description":"Publier dans c/comm, sinon feed public"},"channel_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Slug","description":"Publier dans #salon d'une communauté"}},"type":"object","required":["content"],"title":"ActFileCreate"},"AdCampaignRequest":{"properties":{"budget_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Budget Amount"},"currency":{"type":"string","title":"Currency","default":"USD"},"daily":{"type":"boolean","title":"Daily","default":true},"target_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Country"}},"type":"object","title":"AdCampaignRequest"},"Body_create_story_api_stories_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effect"}},"type":"object","required":["file"],"title":"Body_create_story_api_stories_post"},"Body_login_api_api_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_api_token_post"},"Body_start_call_api_calls_start_post":{"properties":{"receiver_id":{"type":"string","title":"Receiver Id"}},"type":"object","required":["receiver_id"],"title":"Body_start_call_api_calls_start_post"},"Body_update_community_icon_api_communities__slug__icon_put":{"properties":{"icon":{"type":"string","contentMediaType":"application/octet-stream","title":"Icon"}},"type":"object","required":["icon"],"title":"Body_update_community_icon_api_communities__slug__icon_put"},"Body_update_profile_api_users_me_put":{"properties":{"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"avatar":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Avatar"}},"type":"object","title":"Body_update_profile_api_users_me_put"},"Body_upload_sound_api_sounds_upload_post":{"properties":{"audio_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Audio File"},"cover_file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Cover File"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description","default":""},"category":{"type":"string","title":"Category"}},"type":"object","required":["audio_file","title","category"],"title":"Body_upload_sound_api_sounds_upload_post"},"Body_upload_video_api_videos_upload_post":{"properties":{"video":{"type":"string","contentMediaType":"application/octet-stream","title":"Video"},"description":{"type":"string","title":"Description","default":""},"is_public":{"type":"boolean","title":"Is Public","default":true},"has_original_sound":{"type":"boolean","title":"Has Original Sound","default":false},"sound_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sound Id"}},"type":"object","required":["video"],"title":"Body_upload_video_api_videos_upload_post"},"Body_verify_community_api_communities__slug__verify_post":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"Body_verify_community_api_communities__slug__verify_post"},"BotModAction":{"properties":{"action_type":{"type":"string","title":"Action Type","description":"delete_post | ban | mute | warn"},"target_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target User Id"},"target_actfile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Actfile Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["action_type"],"title":"BotModAction"},"CardStyleUpdate":{"properties":{"style":{"type":"string","title":"Style","description":"Style de carte souhaité"}},"type":"object","required":["style"],"title":"CardStyleUpdate"},"ChannelCreate":{"properties":{"slug":{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9-]+$","title":"Slug","description":"Identifiant unique dans la communauté, ex: 'general' pour #general"},"name":{"type":"string","maxLength":100,"minLength":2,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"type":{"type":"string","pattern":"^(text|announcement)$","title":"Type","description":"'text' (discussion libre) ou 'announcement' (annonces, écriture réservée aux admins/mods)","default":"text"}},"type":"object","required":["slug","name"],"title":"ChannelCreate"},"ChannelUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":2},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string","pattern":"^(text|announcement)$"},{"type":"null"}],"title":"Type"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"ChannelUpdate"},"CollaboratorAdd":{"properties":{"user_id":{"type":"string","title":"User Id"},"role":{"type":"string","pattern":"^(admin|editor|viewer|contributor)$","title":"Role","default":"editor"}},"type":"object","required":["user_id"],"title":"CollaboratorAdd"},"CommunityBanCreate":{"properties":{"user_id":{"type":"string","title":"User Id"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["user_id"],"title":"CommunityBanCreate"},"CommunityBotCreate":{"properties":{"name":{"type":"string","maxLength":50,"minLength":1,"title":"Name"},"banned_words":{"items":{"type":"string"},"type":"array","title":"Banned Words"},"auto_ban_threshold":{"type":"integer","minimum":0.0,"title":"Auto Ban Threshold","description":"0 = pas de ban automatique","default":0},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"}},"type":"object","required":["name"],"title":"CommunityBotCreate"},"CommunityBotUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"banned_words":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Banned Words"},"auto_ban_threshold":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Auto Ban Threshold"},"welcome_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Message"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"CommunityBotUpdate"},"CommunityCreate":{"properties":{"slug":{"type":"string","maxLength":50,"minLength":3,"pattern":"^[a-z0-9_]+$","title":"Slug","description":"Identifiant unique, ex: 'gaming' pour c/gaming"},"name":{"type":"string","maxLength":100,"minLength":3,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"type":"string","title":"Category","description":"Catégorie de la communauté","default":"Autres"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["slug","name"],"title":"CommunityCreate"},"CommunityMemberProfileUpdate":{"properties":{"nickname":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Nickname"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"}},"type":"object","title":"CommunityMemberProfileUpdate"},"CommunityUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":3},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"}},"type":"object","title":"CommunityUpdate"},"CountryUpdate":{"properties":{"country":{"type":"string","maxLength":2,"minLength":2,"title":"Country","description":"Code pays ISO 3166-1 alpha-2, ex: 'CD', 'FR'"}},"type":"object","required":["country"],"title":"CountryUpdate"},"CreditSpend":{"properties":{"amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount","description":"Nombre de crédits à dépenser"},"reason":{"type":"string","maxLength":80,"minLength":1,"title":"Reason"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"}},"type":"object","required":["amount","reason"],"title":"CreditSpend"},"DeviceRegister":{"properties":{"token":{"type":"string","maxLength":4096,"minLength":20,"title":"Token"},"platform":{"type":"string","title":"Platform","default":"android"}},"type":"object","required":["token"],"title":"DeviceRegister"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IddetPlusCheckoutRequest":{"properties":{"currency":{"type":"string","title":"Currency","description":"Devise souhaitée. Devises supportées : CDF, USD.","default":"CDF"}},"type":"object","title":"IddetPlusCheckoutRequest"},"LiveStreamCreate":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_private":{"type":"boolean","title":"Is Private","default":false}},"type":"object","required":["title"],"title":"LiveStreamCreate"},"LocationUpdate":{"properties":{"latitude":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Latitude"},"longitude":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Longitude"},"is_sharing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Sharing"},"detect_country":{"type":"boolean","title":"Detect Country","default":true}},"type":"object","required":["latitude","longitude"],"title":"LocationUpdate"},"MemberRoleUpdate":{"properties":{"role":{"type":"string","pattern":"^(member|moderator|admin)$","title":"Role"}},"type":"object","required":["role"],"title":"MemberRoleUpdate"},"MessageCreate":{"properties":{"content":{"type":"string","maxLength":5000,"minLength":0,"title":"Content"},"receiver_id":{"type":"string","title":"Receiver Id"},"type":{"type":"string","maxLength":20,"title":"Type","default":"text"}},"type":"object","required":["content","receiver_id"],"title":"MessageCreate"},"MessageReactionCreate":{"properties":{"emoji":{"type":"string","maxLength":10,"minLength":1,"title":"Emoji"}},"type":"object","required":["emoji"],"title":"MessageReactionCreate"},"PlaylistItemAdd":{"properties":{"sound_id":{"type":"string","title":"Sound Id"}},"type":"object","required":["sound_id"],"title":"PlaylistItemAdd"},"ProjectCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"original_sound_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Sound Id"}},"type":"object","required":["title"],"title":"ProjectCreate"},"SoundCommentCreate":{"properties":{"content":{"type":"string","maxLength":1000,"minLength":1,"title":"Content","description":"Commentaire sur le son"}},"type":"object","required":["content"],"title":"SoundCommentCreate"},"UserCategoriesUpdate":{"properties":{"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Liste des catégories préférées de l'utilisateur"}},"type":"object","required":["categories"],"title":"UserCategoriesUpdate"},"UserCreate":{"properties":{"username":{"type":"string","maxLength":50,"minLength":3,"pattern":"^[a-zA-Z0-9_.]+$","title":"Username"},"password":{"type":"string","maxLength":100,"minLength":6,"title":"Password"},"email":{"anyOf":[{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$"},{"type":"null"}],"title":"Email"},"phone_number":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Phone Number"}},"type":"object","required":["username","password"],"title":"UserCreate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerificationCriteria":{"properties":{"birth_date":{"type":"string","title":"Birth Date","description":"Date de naissance au format YYYY-MM-DD"}},"type":"object","required":["birth_date"],"title":"VerificationCriteria","description":"Critères envoyés par le front-end pour demander la vérification."},"VerificationResult":{"properties":{"verified":{"type":"boolean","title":"Verified"},"badge":{"type":"boolean","title":"Badge"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"zodiac_sign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zodiac Sign"},"advantages":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Advantages"}},"type":"object","required":["verified","badge"],"title":"VerificationResult"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/token"}}}}}}