{"openapi":"3.1.0","info":{"title":"API Aive Vidéo AEO/GEO","version":"1.1.0","description":"**API Vidéo AEO/GEO — En production**\n\n48 endpoints sécurisés pour les articles, analyses vidéo, Content Graphs, Clips, Relance, complétion multiréseau des descriptions, jobs, webhooks et l’agent Sina. Chaque clé est liée à un workspace, des scopes et des limites de débit. Les opérations longues sont idempotentes ou asynchrones. Aucune route de publication YouTube n’est exposée.","contact":{"name":"Aive Support","url":"https://aive.tech/support/portal"},"license":{"name":"Proprietary — © Aive 2026"},"x-status":"production","x-endpoint-count":48},"servers":[{"url":"https://api.aive.tech/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Use `aive_live_xxx` (production) or `aive_test_xxx` (sandbox)"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_key"},"message":{"type":"string","example":"Invalid API key."},"details":{"type":"object"}}}},"example":{"error":{"code":"invalid_key","message":"Invalid API key. Please check your Authorization header."}}}}},"paths":{"/me":{"get":{"summary":"Consulter le workspace","description":"Consulter le workspace. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `*`","tags":["Fondation"],"responses":{"200":{"description":"Workspace info","content":{"application/json":{"example":{"data":{"workspace":{"id":"uuid","name":"Aive Default Workspace","plan":"enterprise","creditsTotal":10000,"creditsUsed":247,"rateLimitPerMin":300},"apiKey":{"scopes":["*"],"environment":"production"}}}}}}},"x-required-scopes":["*"]}},"/usage":{"get":{"summary":"Consulter l’utilisation de l’API","description":"Consulter l’utilisation de l’API. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `usage:read`","tags":["Fondation"],"responses":{"200":{"description":"Usage stats","content":{"application/json":{"example":{"data":{"totalApiCalls":1247,"totalCreditsConsumed":89,"averageResponseMs":142,"plan":"enterprise"}}}}}},"x-required-scopes":["usage:read"]}},"/credits":{"get":{"summary":"Consulter le solde de crédits","description":"Consulter le solde de crédits. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `credits:read`","tags":["Fondation"],"responses":{"200":{"description":"Credits balance","content":{"application/json":{"example":{"data":{"balance":9753,"total":10000,"used":247,"plan":"enterprise"}}}}}},"x-required-scopes":["credits:read"]}},"/keys":{"get":{"summary":"Lister les clés API","description":"Lister les clés API. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `keys:admin`","tags":["Fondation"],"responses":{"200":{"description":"API keys","content":{"application/json":{"example":{"data":[{"id":"uuid","name":"Client XYZ","keyPrefix":"aive_live_","scopes":["articles:read"],"environment":"production","active":true}]}}}}},"x-required-scopes":["keys:admin"]},"post":{"summary":"Créer une clé API","description":"Créer une clé API. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `keys:admin`","tags":["Fondation"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Client XYZ Integration"},"scopes":{"type":"array","minItems":1,"uniqueItems":true,"description":"Sous-ensemble des scopes détenus par la clé parente. Seule une clé wildcard peut créer une autre wildcard.","items":{"type":"string","enum":["articles:read","articles:create","exports:read","videos:read","analyses:read","analyses:create","clips:create","jobs:read","jobs:write","webhooks:admin","usage:read","credits:read","keys:admin","agent:use","production:read","revival:read","revival:create","*"]}},"environment":{"type":"string","enum":["production","sandbox"],"default":"production"},"expiresInDays":{"type":"integer","example":90}},"additionalProperties":false}}}},"responses":{"201":{"description":"Key created (shown once)","content":{"application/json":{"example":{"data":{"key":"aive_live_a81727fe...","name":"Client XYZ","scopes":["articles:read"]},"_warning":"Store this key securely. It will not be shown again."}}}}},"x-required-scopes":["keys:admin"]}},"/articles":{"get":{"summary":"Lister les articles","description":"Lister les articles. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Articles"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100},"description":"Results per page"},{"name":"offset","in":"query","schema":{"type":"integer","default":0},"description":"Pagination offset"}],"responses":{"200":{"description":"Articles list","content":{"application/json":{"example":{"data":[{"id":42,"title":"JT 20h — Édition du 25 mai 2026","original_title":"Comment l'IA transforme le marketing vidéo en 2026","custom_name":"JT 20h — Édition du 25 mai 2026","language":"fr","writing_style":"journalistic","aeo_score":78,"geo_score":85,"media_id":3,"created_at":"2026-05-25T10:30:00Z"}],"pagination":{"limit":20,"offset":0,"has_more":true}}}}}},"x-required-scopes":["articles:read"]}},"/articles/{id}":{"get":{"summary":"Consulter un article","description":"Consulter un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"responses":{"200":{"description":"Article detail","content":{"application/json":{"example":{"data":{"id":42,"title":"JT 20h — Édition du 25 mai 2026","original_title":"Comment l'IA transforme le marketing vidéo en 2026","custom_name":"JT 20h — Édition du 25 mai 2026","keywords_primary":["IA vidéo","marketing digital"],"language":"fr","writing_style":"journalistic","aeo_score":78,"geo_score":85,"media_id":3,"has_content_graph":true,"has_transcript_intelligence":true,"has_transcript":true},"_links":{"scores":"/v1/articles/42/scores","graph":"/v1/articles/42/graph","export_html":"/v1/articles/42/export/html"}}}}},"404":{"description":"Article not found"}},"x-required-scopes":["articles:read"]},"put":{"summary":"Mettre à jour un article","description":"Mettre à jour un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:create`","tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"custom_name":{"type":"string","example":"JT 20h — Édition du 25 mai","description":"Custom display name (replaces the LLM-generated title in the portal)"},"media_id":{"type":"integer","example":3,"description":"ID of the media to associate this article with"}}}}}},"responses":{"200":{"description":"Article updated","content":{"application/json":{"example":{"data":{"id":42,"updated":true}}}}},"404":{"description":"Article not found"}},"x-required-scopes":["articles:create"]}},"/articles/{id}/scores":{"get":{"summary":"Consulter les scores AEO/GEO","description":"Consulter les scores AEO/GEO. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"responses":{"200":{"description":"Scores","content":{"application/json":{"example":{"data":{"article_id":42,"aeo_score":78,"geo_score":85,"composite_score":82,"geo_summary":{"main_entities":["Aive","IA","Marketing"],"main_topics":["Intelligence artificielle","Production vidéo"],"user_intents_answered":["Comment l'IA améliore la production vidéo ?","Quels sont les avantages de l'IA pour le marketing ?"],"key_facts":["L'IA réduit le temps de production de 60%","3 entreprises sur 4 utilisent l'IA en 2026"]}}}}}},"404":{"description":"Article not found"}},"x-required-scopes":["articles:read"]}},"/articles/{id}/graph":{"get":{"summary":"Consulter le Content Graph","description":"Consulter le Content Graph. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"responses":{"200":{"description":"Content Graph","content":{"application/json":{"example":{"data":{"claims":[{"id":"c1","text":"L'IA réduit le temps de production vidéo de 60%","confidence":92,"startMs":45000}],"entities":[{"id":"e1","name":"Aive","type":"organization","mentions":12}],"searchIntents":[{"query":"Comment l'IA améliore ma stratégie vidéo ?","relevance":95}],"clipMoments":[{"title":"Démonstration live","startMs":120000,"endMs":180000,"geoScore":88}],"summary":{"geoReadinessScore":82}}}}}},"404":{"description":"Content Graph not yet generated. Use POST /v1/videos/:id/analyze"}},"x-required-scopes":["articles:read"]}},"/articles/{id}/export/{format}":{"get":{"summary":"Exporter un article","description":"Exporter un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `exports:read`","tags":["Exports"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42},{"name":"format","in":"path","required":true,"schema":{"type":"string","enum":["html","markdown","json","schema","opengraph","txt"]},"example":"markdown"}],"responses":{"200":{"description":"Export content"},"404":{"description":"Article not found"}},"x-required-scopes":["exports:read"]}},"/articles/{id}/translate":{"post":{"summary":"Traduire un article","description":"Traduire un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:create`","tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["target_language"],"properties":{"target_language":{"type":"string","example":"en","description":"ISO 639-1 code: en, de, es, it, pt, nl"},"webhook_url":{"type":"string","example":"https://your-app.com/webhooks/aive"}}}}}},"responses":{"202":{"description":"Translation job created","content":{"application/json":{"example":{"data":{"job_id":"uuid","status":"pending","target_language":"en"}}}}}},"x-required-scopes":["articles:create"]}},"/videos/{id}/analyze":{"post":{"summary":"Analyser une vidéo","description":"Analyser une vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:create`","tags":["Vidéos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"outputs":{"type":"object","properties":{"article":{"type":"boolean","default":true},"transcript":{"type":"boolean","default":false},"chapters":{"type":"boolean","default":false}}},"writing_style":{"type":"string","enum":["auto","journalistic","narrative","analytical","tutorial","conversational","documentary","interview"],"default":"auto"},"analysis_mode":{"type":"string","enum":["standard","behavioral"],"default":"standard","description":"Visual analysis mode. 'standard' = factual scene description (objects, actions, text on screen). 'behavioral' = behavioral analysis (gestures, postures, facial expressions, gaze direction, laterality left/right, proxemics, rhythm).\n\n**FR** Mode d'analyse visuelle. 'standard' = description factuelle des scènes. 'behavioral' = analyse comportementale (gestuelle, postures, expressions faciales, direction du regard, latéralité gauche/droite, proxemique, rythme)."},"quality_profile":{"type":"string","enum":["standard","premium"],"default":"standard","description":"Quality profile. 'standard' = Gemini Flash (fast, cost-effective). 'premium' = Gemini Pro (better narrative understanding).\n\n**FR** Profil qualité. 'standard' = Gemini Flash (rapide). 'premium' = Gemini Pro (meilleure compréhension narrative)."},"language":{"type":"string","example":"fr","default":"fr"},"webhook_url":{"type":"string","example":"https://your-app.com/webhooks/aive"}}}}}},"responses":{"202":{"description":"Analysis job created","content":{"application/json":{"example":{"data":{"job_id":"uuid","status":"pending","type":"analyze","estimated_duration_seconds":120}}}}}},"x-required-scopes":["analyses:create"]}},"/jobs/{id}":{"get":{"summary":"Consulter l’état d’un traitement","description":"Consulter l’état d’un traitement. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `jobs:read`","tags":["Traitements"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Job status","content":{"application/json":{"examples":{"running":{"summary":"Job in progress","value":{"data":{"id":"uuid","type":"generate_article","status":"running","progress":65,"step":"Rédaction de l'article (passe 3/3)...","article_id":null,"error_message":null,"created_at":"2026-05-27T10:28:00Z"}}},"completed":{"summary":"Job completed","value":{"data":{"id":"uuid","type":"generate_article","status":"completed","progress":100,"step":"Terminé !","article_id":42,"error_message":null,"created_at":"2026-05-27T10:28:00Z"}}},"failed":{"summary":"Job failed","value":{"data":{"id":"uuid","type":"generate_article","status":"failed","progress":45,"step":"Passe 2 — Synthèse","article_id":null,"error_message":"LLM timeout after 30s. Retry the job.","created_at":"2026-05-27T10:28:00Z"}}}}}}},"404":{"description":"Job not found"}},"x-required-scopes":["jobs:read"]},"delete":{"summary":"Annuler un traitement","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Annuler un traitement. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `jobs:write`","tags":["Traitements"],"x-required-scopes":["jobs:write"]}},"/webhooks":{"post":{"summary":"Créer un webhook","description":"Enregistre une destination HTTPS publique. Les adresses locales, privées, link-local et de métadonnées sont refusées après résolution DNS. Les payloads sont signés dans X-Aive-Signature au format sha256=<hex>.\n\n**Scope requis:** `webhooks:admin`","tags":["Webhooks"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://"},"events":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["video.uploaded","video.analyzed","article.generated","article.translated","clip.generated","export.ready","job.completed","job.failed","credits.low"]}}},"additionalProperties":false}}}},"responses":{"201":{"description":"Webhook created (secret shown once)","content":{"application/json":{"example":{"data":{"id":"uuid","url":"https://...","secret":"whsec_xxx","events":["article.generated"]},"_warning":"Store the webhook secret securely."}}}}},"x-required-scopes":["webhooks:admin"]},"get":{"summary":"Lister les webhooks","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"description":"Lister les webhooks. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `webhooks:admin`","tags":["Webhooks"],"x-required-scopes":["webhooks:admin"]}},"/medias":{"get":{"summary":"Lister les médias","description":"Lister les médias. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Médias"],"responses":{"200":{"description":"List of medias","content":{"application/json":{"example":{"data":[{"id":1,"name":"BFM TV","description":null,"category":null,"language":"fr","createdAt":"2026-05-01T00:00:00Z"}]}}}}},"x-required-scopes":["articles:read"]},"post":{"summary":"Créer un média","description":"Créer un média. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:create`","tags":["Médias"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"BFM TV"}}}}}},"responses":{"200":{"description":"Media created","content":{"application/json":{"example":{"data":{"id":1,"name":"BFM TV"}}}}},"400":{"description":"name is required"}},"x-required-scopes":["articles:create"]}},"/jobs":{"get":{"summary":"Lister les traitements asynchrones","description":"Lister les traitements asynchrones. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `jobs:read`","tags":["Traitements"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100},"description":"Number of jobs to return"}],"responses":{"200":{"description":"List of jobs","content":{"application/json":{"example":{"data":[{"id":"uuid","status":"done","progress":100,"step":"Terminé","articleId":42,"createdAt":1716800000000}]}}}}},"x-required-scopes":["jobs:read"]}},"/usage/llm":{"get":{"summary":"Consulter l’usage des opérations","description":"Retourne des noms d’opérations compréhensibles et l’usage en tokens. Les modèles fournisseurs, coûts réels et marges ne sont jamais exposés.\n\n**Scope requis:** `usage:read`","tags":["Utilisation"],"responses":{"200":{"description":"LLM usage summary","content":{"application/json":{}}}},"x-required-scopes":["usage:read"]}},"/articles/{id}/regenerate":{"post":{"summary":"Régénérer un article","description":"Régénérer un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:create`","tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"example":42}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"writing_style":{"type":"string","enum":["auto","journalistic","narrative","analytical","tutorial","conversational"],"default":"auto"},"language":{"type":"string","example":"fr"},"webhook_url":{"type":"string","example":"https://your-app.com/webhooks/aive"}}}}}},"responses":{"202":{"description":"Regeneration job created","content":{"application/json":{"example":{"data":{"job_id":"uuid","status":"pending","type":"regenerate_article","compute_billing":{"enabled":true,"estimated_credits":30}}}}}},"402":{"description":"Insufficient credits (compute billing enabled)"}},"x-required-scopes":["articles:create"]}},"/monitoring":{"get":{"summary":"Consulter les métriques de supervision","description":"Consulter les métriques de supervision. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `usage:read`","tags":["Supervision"],"responses":{"200":{"description":"Monitoring metrics with alerts","content":{"application/json":{"example":{"data":{"workspace":{"plan":"enterprise","creditsRemaining":9500,"creditsPct":95},"last1h":{"totalCalls":142,"errorRate":2,"avgLatencyMs":180},"last24h":{"totalCalls":3200,"errorRate":1,"creditsConsumed":450},"jobs":{"pending":2,"running":1,"completed24h":45,"failed24h":1},"alerts":[]}}}}}},"x-required-scopes":["usage:read"]}},"/monitoring/alerts":{"get":{"summary":"Consulter les alertes actives","description":"Consulter les alertes actives. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `usage:read`","tags":["Supervision"],"responses":{"200":{"description":"Active alerts","content":{"application/json":{"example":{"data":[{"type":"credits_low","severity":"warning","message":"Credits running low: 85 remaining (8%)","value":85,"threshold":100}],"has_alerts":true,"critical_count":0}}}}},"x-required-scopes":["usage:read"]}},"/videos":{"get":{"summary":"Lister les vidéos","description":"Lister les vidéos. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `videos:read`","tags":["Vidéos"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Videos list with metadata"}},"x-required-scopes":["videos:read"]}},"/videos/{id}":{"get":{"summary":"Consulter une vidéo","description":"Consulter une vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `videos:read`","tags":["Vidéos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Video details"},"404":{"description":"Video not found"}},"x-required-scopes":["videos:read"]}},"/videos/{id}/claims":{"get":{"summary":"Consulter les affirmations vidéo","description":"Consulter les affirmations vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Claims array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/entities":{"get":{"summary":"Consulter les entités vidéo","description":"Consulter les entités vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Entities array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/intents":{"get":{"summary":"Consulter les intentions de recherche","description":"Consulter les intentions de recherche. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Intents array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/moments":{"get":{"summary":"Consulter les moments clés","description":"Consulter les moments clés. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Moments array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/narrative":{"get":{"summary":"Consulter la structure narrative","description":"Consulter la structure narrative. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Narrative structure"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/topics":{"get":{"summary":"Consulter les sujets vidéo","description":"Consulter les sujets vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Topics array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/visual-elements":{"get":{"summary":"Consulter les éléments visuels","description":"Consulter les éléments visuels. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Visual elements array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/audio-elements":{"get":{"summary":"Consulter les éléments audio","description":"Consulter les éléments audio. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Audio elements array"}},"x-required-scopes":["analyses:read"]}},"/videos/{id}/clips":{"post":{"summary":"Générer un clip vidéo","description":"Générer un clip vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `clips:create`","tags":["Vidéos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["start_ms","end_ms"],"properties":{"start_ms":{"type":"integer","minimum":0},"end_ms":{"type":"integer","minimum":1},"format":{"type":"string","enum":["mp4","webm","mp3"],"default":"mp4"},"webhook_url":{"type":"string","format":"uri"}}}}}},"responses":{"202":{"description":"Clip generation job created"}},"x-required-scopes":["clips:create"]}},"/articles/{id}/translations":{"get":{"summary":"Lister les traductions d’un article","description":"Lister les traductions d’un article. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `articles:read`","tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Translations list"}},"x-required-scopes":["articles:read"]}},"/agent/chat":{"post":{"summary":"Échanger avec l’agent Sina","description":"Échanger avec l’agent Sina. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `agent:use`","tags":["Agent Sina"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"conversationId":{"type":"string"}}}}}},"responses":{"200":{"description":"Agent response with actions performed"}},"x-required-scopes":["agent:use"]}},"/agent/stream":{"post":{"summary":"Diffuser une conversation avec l’agent Sina","description":"Diffuser une conversation avec l’agent Sina. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `agent:use`","tags":["Agent Sina"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"conversationId":{"type":"string"}}}}}},"responses":{"200":{"description":"SSE stream with agent response chunks"}},"x-required-scopes":["agent:use"]}},"/keys/{id}":{"delete":{"summary":"Révoquer une clé API","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Révoquer une clé API. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `keys:admin`","tags":["Fondation"],"x-required-scopes":["keys:admin"]}},"/videos/{id}/graph":{"get":{"summary":"Consulter le Content Graph vidéo","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Consulter le Content Graph vidéo. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `analyses:read`","tags":["Analyses"],"x-required-scopes":["analyses:read"]}},"/production/templates":{"get":{"summary":"Lister les templates de production","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"data":[{"id":12,"name":"Portrait 9:16","format":"9:16","target_duration_seconds":45,"is_system":false,"is_default":true,"is_customized":true,"thumbnail_available":true}]}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"description":"Lister les templates de production. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `production:read`","tags":["Production"],"x-required-scopes":["production:read"]}},"/production/clips/detect":{"post":{"summary":"Détecter les meilleures opportunités de clips","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["article_id","template_id"],"properties":{"article_id":{"type":"integer","minimum":1},"template_id":{"type":"integer","minimum":1},"target_duration_seconds":{"type":"integer","minimum":5,"maximum":180},"requested_clip_count":{"type":"integer","minimum":1,"maximum":50,"default":10},"analysis_mode":{"type":"string","enum":["transcript","visual","audio","multimodal"],"default":"multimodal"},"prompt":{"type":"string","maxLength":500},"protect_sentence_boundaries":{"type":"boolean","default":true},"duration_margin_enabled":{"type":"boolean","default":true},"duration_margin_percent":{"type":"integer","minimum":0,"maximum":50,"default":10},"allow_shorter_duration":{"type":"boolean","default":true},"allow_longer_duration":{"type":"boolean","default":false}}}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"example":{"data":{"job_id":"clip_detect_01J8AIVEEXAMPLE","type":"clip_detection","status":"queued","reused":false}}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"description":"Démarre un traitement durable et idempotent qui analyse toute la source et détecte jusqu’à 50 opportunités de clips. Suivez le job_id retourné avec l’endpoint de suivi Clips.\n\n**Scope requis:** `clips:create`","tags":["Production"],"x-required-scopes":["clips:create"]}},"/production/clips/render":{"post":{"summary":"Produire les clips sélectionnés","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["article_id","template_id","clips"],"properties":{"article_id":{"type":"integer","minimum":1},"template_id":{"type":"integer","minimum":1},"target_duration_seconds":{"type":"integer","minimum":5,"maximum":180},"clips":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["id","title","start_ms","end_ms","duration_ms"],"properties":{"id":{"type":"string","maxLength":100},"title":{"type":"string","maxLength":180},"thumbnail_title":{"type":"string","maxLength":180},"start_ms":{"type":"number","minimum":0},"end_ms":{"type":"number","exclusiveMinimum":0},"duration_ms":{"type":"number","exclusiveMinimum":0},"viral_score":{"type":"number","minimum":0,"maximum":100},"rationale":{"type":"string","maxLength":500}}}}}}}}},"responses":{"202":{"description":"Accepted","content":{"application/json":{"example":{"data":{"job_id":"clip_render_01J8AIVEEXAMPLE","type":"clip_render","status":"queued","reused":false}}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"description":"Démarre la production durable de 1 à 50 clips sélectionnés. Les clips terminés apparaissent progressivement dans le suivi ; les échecs peuvent être repris sans recalculer les clips réussis.\n\n**Scope requis:** `clips:create`","tags":["Production"],"x-required-scopes":["clips:create"]}},"/production/clips/jobs/{jobId}":{"get":{"summary":"Consulter un traitement Clips","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"data":{"job_id":"clip_render_01J8AIVEEXAMPLE","type":"render","status":"rendering","progress":50,"stage":"rendering","article_id":1056,"template_id":12,"target_duration_seconds":45,"clips":[],"rendered_clips":[{"clip_id":"clip-1","url":"https://cdn.example.com/clip-1.mp4","thumbnail_url":"https://cdn.example.com/clip-1.jpg"}],"failed_clips":[],"attempts":1,"max_attempts":3,"next_attempt_at":null,"error":null,"credits_used":1,"started_at":"2026-08-18T12:00:00.000Z","completed_at":null,"updated_at":"2026-08-18T12:00:20.000Z"}}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":160}}],"description":"Consulter un traitement Clips. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `jobs:read`","tags":["Production"],"x-required-scopes":["jobs:read"]}},"/production/revival/candidates":{"get":{"summary":"Lister les candidats Relance","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"data":[{"id":"550e8400-e29b-41d4-a716-446655440000","media_id":4,"article_id":1056,"title":"Entretien long format","description":"Description actuelle","thumbnail_url":"https://cdn.example.com/source.jpg","published_at":"2026-08-01T09:00:00.000Z","duration_seconds":3600,"score":82,"status":"eligible","eligible":true,"reasons":["Description à compléter"],"updated_at":"2026-08-18T12:00:00.000Z"}]}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"media_id","in":"query","schema":{"type":"integer","minimum":1}},{"name":"status","in":"query","schema":{"type":"string","enum":["eligible","reviewing","selected","dismissed","stale"]}},{"name":"min_score","in":"query","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"min_duration_seconds","in":"query","schema":{"type":"integer","minimum":0}},{"name":"max_duration_seconds","in":"query","schema":{"type":"integer","minimum":1}},{"name":"query","in":"query","schema":{"type":"string","maxLength":160}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":30}}],"description":"Lister les candidats Relance. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `revival:read`","tags":["Relance"],"x-required-scopes":["revival:read"]}},"/production/descriptions/complete":{"post":{"summary":"Compléter les descriptions multiréseaux","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["media_id","candidate_id","platforms","idempotency_key"],"properties":{"media_id":{"type":"integer","minimum":1},"article_id":{"type":"integer","minimum":1},"candidate_id":{"type":"string","format":"uuid"},"platforms":{"type":"array","minItems":1,"maxItems":10,"uniqueItems":true,"items":{"type":"string","enum":["youtube_long","youtube_shorts","linkedin_long","facebook_video","facebook_reels","instagram_reels","tiktok","x_video","pinterest","blog_embed"]}},"idempotency_key":{"type":"string","minLength":16,"maxLength":160}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"data":{"request_id":"desc_01J8AIVEEXAMPLE","media_id":4,"article_id":1056,"candidate_id":"550e8400-e29b-41d4-a716-446655440000","drafts":[{"platform_id":"youtube_long","display_name":"YouTube","original_description":"Description actuelle","completed_description":"Description vérifiée…\n\n00:00 Introduction…\n\nRésumé GEO…","sections":{"description":"Description vérifiée…","chapters":"00:00 Introduction…","geo_summary":"Résumé GEO…"},"section_presence_before":{"description":true,"chapters":false,"geo_summary":false},"measured_length":1320,"max_length":5000,"length_unit":"utf8_bytes","was_truncated":false}],"warnings":[],"youtube_experiment_id":"revival_exp_01J8AIVEEXAMPLE","reused":false,"created_at":"2026-08-18T12:00:00.000Z"}}}}},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"description":"Complète la description vérifiée, le chapitrage timecodé et le résumé GEO pour les réseaux sélectionnés, dans leurs limites configurées. L’opération crée si nécessaire une expérience YouTube supervisée mais ne publie et ne modifie jamais YouTube.\n\n**Scope requis:** `revival:create`","tags":["Relance"],"x-required-scopes":["revival:create"]}},"/webhooks/{id}":{"delete":{"summary":"Supprimer un webhook","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Supprimer un webhook. L’opération est limitée au workspace et aux scopes liés à la clé API.\n\n**Scope requis:** `webhooks:admin`","tags":["Webhooks"],"x-required-scopes":["webhooks:admin"]}},"/webhooks/{id}/test":{"post":{"summary":"Tester un webhook","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request"},"401":{"description":"Invalid or missing API key"},"403":{"description":"Insufficient scope or workspace capability"},"429":{"description":"Rate limit or account limit reached"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"description":"Envoie un événement de test signé avec un délai maximal de 10 secondes. La destination est validée à nouveau juste avant l’envoi.\n\n**Scope requis:** `webhooks:admin`","tags":["Webhooks"],"x-required-scopes":["webhooks:admin"]}}},"tags":[{"name":"Fondation"},{"name":"Articles"},{"name":"Analyses"},{"name":"Exports"},{"name":"Vidéos"},{"name":"Traitements"},{"name":"Webhooks"},{"name":"Supervision"},{"name":"Médias"},{"name":"Utilisation"},{"name":"Agent Sina"},{"name":"Production"},{"name":"Relance"}]}