{"openapi":"3.1.0","info":{"title":"SEOQuantum API","version":"1.0.0","description":"API externe SEOQuantum (v1). Périmètre : optimisation de contenu. Authentification par clé d'API scopée workspace. Rate limits par clé : lectures 120/min, écritures 20/min (429 + en-tête Retry-After au dépassement)."},"servers":[{"url":"/api/v1"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Clé d'API du workspace (préfixe 'sq_live_'). En-tête : Authorization: Bearer <clé>"}}},"paths":{"/pages":{"get":{"summary":"Liste paginée des pages du workspace (avec dernier score + total)","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"status","in":"query","schema":{"type":"string","enum":["pending","analyzing","analyzed","error"]}}],"responses":{"200":{"description":"OK — { pages, total, limit, offset }"},"401":{"description":"Clé manquante/invalide"},"429":{"description":"Rate limit"}}}},"/pages/{id}":{"get":{"summary":"Détail d'une page","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Page introuvable"}}}},"/pages/{id}/recommendations":{"get":{"summary":"Recommandations on-page + termes lexicaux + scores","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Aucune analyse pour cette page"}}}},"/analyses":{"get":{"summary":"Liste des analyses du workspace","responses":{"200":{"description":"OK"}}},"post":{"summary":"Lance une analyse (gratuit). keyword requis ; url optionnelle (sinon page brouillon).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string"},"url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"queued — renvoie { page_id, url, status }"}}}},"/analyses/{pageId}":{"get":{"summary":"Statut + résultat de la dernière analyse d'une page (polling)","parameters":[{"name":"pageId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Champ terminal:true sur états finaux. status: queued | processing (+ progress_stage, estimated_completion) | completed (+ analysis) | failed (+ error_message)"},"404":{"description":"Page inconnue dans ce workspace"}}}},"/optimizations":{"post":{"summary":"Lance une optimisation (consomme 1 article)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["page_id","content_html"],"properties":{"page_id":{"type":"string","format":"uuid"},"content_html":{"type":"string"},"h1":{"type":"string"},"meta_title":{"type":"string"},"meta_description":{"type":"string"}}}}}},"responses":{"200":{"description":"queued"},"402":{"description":"Quota d'articles dépassé"},"409":{"description":"La page doit être analysée d'abord"}}}},"/optimizations/{id}":{"get":{"summary":"Statut de scoring + contenu du draft","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Optimisation introuvable"}}}}}}