{"openapi":"3.0.3","info":{"title":"Skeptyx API","description":"API Skeptyx pour vérification B2B, provenance et surfaces publiques de confiance.","version":"3.1.0","contact":{"name":"Skeptyx Support","email":"support@skeptyx.com","url":"https://www.skeptyx.com"}},"servers":[{"url":"https://www.skeptyx.com","description":"Production"}],"paths":{"/api/v1/check":{"post":{"summary":"Vérifier un texte via l'API B2B","description":"Endpoint B2B sécurisé par API key qui délègue au moteur Skeptyx.","tags":["Verification"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Le texte à vérifier","example":"La Tour Eiffel mesure 330 mètres"},"url":{"type":"string","description":"URL source (optionnel)","example":"https://example.com/article"},"language":{"type":"string","description":"Langue du texte","enum":["fr","en","es","de","it","pt","nl"],"default":"fr"}}}}}},"responses":{"200":{"description":"Résultat de la vérification","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"data":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":100,"example":75},"verdict":{"type":"string","example":"uncertain"},"confidence":{"type":"integer","example":85},"analysis":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"}}}}}},"meta":{"type":"object","properties":{"tier":{"type":"string","example":"free"},"dailyLimit":{"type":"integer","example":100},"requestsToday":{"type":"integer","example":12},"remainingDaily":{"type":"integer","example":88}}}}}}}},"401":{"description":"API key manquante ou invalide"},"429":{"description":"Rate limit atteint"}}}},"/api/v2/status":{"get":{"summary":"Statut de l'API v2","description":"Retourne l'état de disponibilité du wrapper public v2.","tags":["Verification"],"responses":{"200":{"description":"Statut du wrapper v2","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"operational"},"version":{"type":"string","example":"2.0.0"},"timestamp":{"type":"string","format":"date-time"},"uptime_seconds":{"type":"integer","example":3600},"services":{"type":"object","properties":{"verify":{"type":"string","example":"operational"},"supabase":{"type":"string","example":"configured"}}},"endpoints":{"type":"object","properties":{"verify":{"type":"string","example":"/api/v2/verify"},"fallback":{"type":"string","example":"/api/v1/check"},"status":{"type":"string","example":"/api/v2/status"}}},"observability":{"type":"object","properties":{"sli":{"type":"object"},"totals":{"type":"object"},"slo_breaches":{"type":"array","items":{"type":"object"}},"top_routes":{"type":"array","items":{"type":"object"}}}}}}}}}}}},"/api/v2/verify":{"post":{"summary":"Vérifier un texte via le wrapper v2","description":"Wrapper public sécurisé vers /api/v1/check avec validation stricte.","tags":["Verification"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","example":"La Tour Eiffel mesure 330 mètres"},"url":{"type":"string","example":"https://example.com/article"},"language":{"type":"string","enum":["fr","en","es","de","it","pt","nl"],"default":"fr"}}}}}},"responses":{"200":{"description":"Réponse normalisée du moteur de vérification"},"401":{"description":"API key manquante"},"410":{"description":"Endpoint désactivé par configuration"},"429":{"description":"Rate limit atteint"}}}},"/api/public/trust-badge":{"get":{"summary":"Score NovaTrust d'un domaine","description":"Récupère le score de confiance d'un domaine (API publique)","tags":["NovaTrust"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"example":"lemonde.fr"}],"responses":{"200":{"description":"Score NovaTrust","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"score":{"type":"integer"},"trend":{"type":"string","enum":["improving","stable","declining"]},"total_checks":{"type":"integer"}}}}}}}}},"/api/public/release":{"get":{"summary":"Release servie par l'instance déployée","description":"Expose le commit, la branche et l'environnement réellement servis pour prouver la parité release.","tags":["Release"],"responses":{"200":{"description":"Métadonnées de release","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"release":{"type":"object","properties":{"gitSha":{"type":"string","nullable":true},"shortSha":{"type":"string","nullable":true},"gitBranch":{"type":"string","nullable":true},"environment":{"type":"string","example":"production"},"packageVersion":{"type":"string","example":"0.1.0"},"deploymentUrl":{"type":"string","nullable":true},"source":{"type":"string","enum":["explicit_env","vercel_env","runtime"]},"generatedAt":{"type":"string","format":"date-time"}}}}}}}}}}},"/api/verify-image":{"post":{"summary":"Vérifier une image publiquement","description":"Analyse publique d'image avec score de risque, verdict, niveau de preuve et lien de provenance.","tags":["Verification"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["imageUrl"],"properties":{"imageUrl":{"type":"string","description":"URL de l'image à analyser"}}}}}},"responses":{"200":{"description":"Résultat de l'analyse avec preuve de provenance","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"riskScore":{"type":"integer"},"verdict":{"type":"string","example":"likely_manipulated"},"evidenceLevel":{"type":"string","enum":["low","medium","high"]},"canConfirmManipulation":{"type":"boolean"},"reviewPriority":{"type":"string","enum":["low","medium","high"]},"confidenceScore":{"type":"integer"},"forensicFlags":{"type":"array","items":{"type":"string"}},"operatorChecklist":{"type":"array","items":{"type":"string"}},"riskBreakdown":{"type":"object","additionalProperties":{"type":"number"}},"limitations":{"type":"array","items":{"type":"string"}},"recommendations":{"type":"array","items":{"type":"string"}},"provenanceUrl":{"type":"string","example":"/api/provenance/ast_xxx"},"provenance":{"type":"object","properties":{"assetId":{"type":"string"},"status":{"type":"string","enum":["verified","unknown","tampered"]},"integrityHash":{"type":"string"}}}}}}}}}}},"/api/verify-video":{"post":{"summary":"Vérifier une vidéo publiquement","description":"Analyse publique de vidéo avec verdict heuristique, niveau de preuve, recommandations et lien de provenance.","tags":["Verification"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["videoUrl"],"properties":{"videoUrl":{"type":"string","description":"URL de la vidéo à analyser"}}}}}},"responses":{"200":{"description":"Résultat de l'analyse vidéo","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"deepfakeScore":{"type":"integer"},"verdict":{"type":"string","example":"suspicious"},"confidence":{"type":"integer"},"analysisMode":{"type":"string","enum":["external_tool_only","platform_preview","ffmpeg_forensic_frames_lite"]},"evidenceLevel":{"type":"string","enum":["low","medium"]},"reviewPriority":{"type":"string","enum":["low","medium","high"]},"confidenceScore":{"type":"integer"},"forensicFlags":{"type":"array","items":{"type":"string"}},"operatorChecklist":{"type":"array","items":{"type":"string"}},"riskBreakdown":{"type":"object","additionalProperties":{"type":"number"}},"limitations":{"type":"array","items":{"type":"string"}},"recommendations":{"type":"array","items":{"type":"string"}},"tools":{"type":"object","properties":{"invid":{"type":"string"},"youtubeDataViewer":{"type":"string"},"amnesty":{"type":"string"}}},"forensicV2":{"type":"object","properties":{"engine":{"type":"string","example":"forensic_v2"},"ffmpeg":{"type":"object","properties":{"enabled":{"type":"boolean"},"frameExtraction":{"type":"string"},"frameCount":{"type":"integer"}}},"ocr":{"type":"object","properties":{"status":{"type":"string"},"textDensity":{"type":"integer"},"repeatedOverlayScore":{"type":"integer"},"gibberishScore":{"type":"integer"}}},"scoring":{"type":"object","properties":{"totalScore":{"type":"integer"},"confidence":{"type":"integer"},"tier":{"type":"string","enum":["low","medium","high"]}}},"diagnostics":{"type":"array","items":{"type":"string"}}}},"provenanceUrl":{"type":"string"}}}}}},"400":{"description":"Entrée invalide"},"429":{"description":"Rate limit atteint"}}}},"/api/provenance/{assetId}":{"get":{"summary":"Récupérer la preuve de provenance d'un asset","description":"Retourne le statut de provenance (C2PA/content credentials) d'un asset analysé","tags":["Verification"],"parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string"},"example":"ast_9f5abf7a27ef04d8de924cdf"}],"responses":{"200":{"description":"Preuve de provenance trouvée"},"404":{"description":"Provenance non trouvée ou expirée"}}}},"/api/legal/search":{"post":{"summary":"Recherche juridique europeenne","description":"Recherche semantique dans la base de donnees juridique (BE, FR, LU, NL, EU) via pgvector RAG.","tags":["Legal"],"security":[{"CookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":5},"countries":{"type":"array","items":{"type":"string","enum":["BE","FR","LU","NL","EU"]},"default":["BE","FR","LU","NL","EU"]},"sources":{"type":"array","items":{"type":"string"}},"limit":{"type":"integer","minimum":1,"maximum":50},"compareMode":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Resultats de recherche juridique"},"401":{"description":"Non authentifie"},"429":{"description":"Rate limit atteint"}}},"get":{"summary":"Sources juridiques disponibles","description":"Liste les sources juridiques disponibles, filtrable par pays.","tags":["Legal"],"parameters":[{"name":"country","in":"query","schema":{"type":"string","enum":["BE","FR","LU","NL","EU"]}}],"responses":{"200":{"description":"Liste des sources juridiques"}}}},"/api/export/pdf":{"post":{"summary":"Exporter un rapport PDF/HTML","description":"Genere un rapport PDF, HTML ou Markdown a partir d'un check, investigation, GDPR ou analyse legale.","tags":["Export"],"security":[{"CookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"type":{"type":"string","enum":["check","investigation","gdpr","legal","generic"],"default":"check"},"title":{"type":"string","maxLength":180},"data":{"type":"object","description":"Donnees du rapport"},"includeWatermark":{"type":"boolean","default":true},"format":{"type":"string","enum":["pdf","html","markdown"],"default":"html"}}}}}},"responses":{"200":{"description":"Rapport genere (PDF binaire ou JSON avec contenu HTML/Markdown)"},"400":{"description":"Donnees invalides"},"401":{"description":"Non authentifie"},"403":{"description":"Plan insuffisant pour ce type de rapport"}}}},"/api/stripe/checkout":{"post":{"summary":"Creer une session Stripe Checkout","description":"Cree une session de paiement Stripe pour le plan selectionne (Pro ou Legal Pro Max).","tags":["Billing"],"security":[{"CookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["pro","pro_max","legal_pro_max"],"default":"pro"}}}}}},"responses":{"200":{"description":"Session Stripe creee","content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string"},"url":{"type":"string"}}}}}},"401":{"description":"Non authentifie"},"429":{"description":"Rate limit atteint"}}}},"/api/public/stats":{"get":{"summary":"Statistiques publiques Skeptyx","description":"Retourne les statistiques publiques de la plateforme (nombre de checks, utilisateurs, etc).","tags":["Public"],"responses":{"200":{"description":"Statistiques publiques"}}}},"/api/public/leaderboard":{"get":{"summary":"Classement public des utilisateurs","description":"Retourne le top des utilisateurs par nombre de verifications ou score moyen.","tags":["Public"],"responses":{"200":{"description":"Classement public"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Cle API obtenue depuis le dashboard Pro"},"CookieAuth":{"type":"apiKey","in":"cookie","name":"sb-access-token","description":"Session Supabase (authentification cookie)"}}},"tags":[{"name":"Verification","description":"Verification de texte, image et video"},{"name":"NovaTrust","description":"Scores de confiance par domaine"},{"name":"Legal","description":"Recherche juridique europeenne (Legal Pro Max)"},{"name":"Export","description":"Export de rapports PDF/HTML/Markdown"},{"name":"Billing","description":"Gestion des abonnements Stripe"},{"name":"Public","description":"Endpoints publics (stats, leaderboard)"},{"name":"Release","description":"Metadonnees de deploiement"}]}