Documentation de l'API

Deux endpoints, un Bearer token, des réponses JSON. Tout ce qu'il vous faut pour détecter les textes et images générés par IA depuis votre propre backend.

Premiers pas

  1. 1Créez un compte et vérifiez votre adresse e-mail. C'est la vérification qui débloque les 1 000 crédits gratuits : un compte non vérifié n'en a aucun.
  2. 2Copiez votre clé API depuis le tableau de bord. Elle est créée automatiquement avec le compte.
  3. 3Envoyez votre première requête. Toute l'intégration tient en un POST avec un en-tête Bearer.

URL de base

https://www.wasitaigenerated.com/api/v1

Authentification

Chaque requête doit transmettre votre clé API sous forme de Bearer token. Il n'existe aucun autre mode d'authentification ni aucun accès non authentifié.

Authorization: Bearer YOUR_API_KEY

Gardez la clé côté serveur. Elle consomme votre solde de crédits : tout ce qui l'envoie vers un navigateur ou une application mobile ouvre une brèche dans votre facturation. Faites plutôt passer l'appel par votre propre backend.

Crédits et limites

L'utilisation est décomptée en crédits. Les crédits sont débités avant l'exécution de la détection. Avec API Business, les appels API et MCP puisent d'abord dans les 3 000 000 de crédits mensuels de la formule, puis dans votre solde de crédits.

EndpointCoûtAvec 1 000 crédits gratuits
/detect/text1 crédit par mot~1 000 mots
/detect/image300 crédits par image3 images
/detect/video300 crédits par image analysée (16 à 50 par clip)—
/detect/video300 crédits par image isolée3 images
50 000
crédits — 10 $, paiement unique
300 000
crédits — 49 $, paiement unique
1 500 000
crédits — 199 $, paiement unique

Les crédits à l'unité n'expirent jamais et fonctionnent sur le site, l'API et le serveur MCP. API Business coûte 299 $/mois avec 3 000 000 de crédits API et MCP chaque mois, plus des rapports PDF en marque blanche et un support prioritaire. Pro (14,99 $/mois) est réservé au site et n'inclut pas l'accès à l'API. Chaque clé API est limitée à 120 requêtes par minute (429 avec Retry-After au-delà) : traitez donc les lots de manière séquentielle ou avec une concurrence modérée. Enterprise propose des limites sur mesure et un SLA. Consultez les tarifs pour la liste complète des formules.

POST/api/v1/detect/text

Détecte les textes générés par ChatGPT, GPT-4, Claude, Gemini et d'autres modèles de langage. Renvoie un verdict pour l'ensemble du document et un score pour chaque phrase.

Corps de la requête

ChampTypeRemarques
contentstringObligatoire. Le texte à analyser.
textstringAccepté comme alias de content.
modestringFacultatif. "depth" renvoie un vrai score pour chaque phrase (pour la mise en surbrillance). À omettre si seul le score du document vous intéresse.
modelstringFacultatif. Par défaut "tropa-3". Passez "tropa-1" pour rester sur une génération antérieure le temps de recalibrer vos seuils. "tropa-2" est toujours accepté et servi par tropa-3. Même coût en crédits.

Example request

curl -X POST https://www.wasitaigenerated.com/api/v1/detect/text \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Your text content here..."
  }'

Response

{
  "isAI": true,
  "confidence": 0.92,
  "score": 92.3,
  "verdict": "ai",
  "model": "tropa-3",
  "patterns": ["AI patterns detected"],
  "analysis": {
    "likelihood": "AI-generated",
    "reasoning": "Overall AI score: 92.3%"
  },
  "sentences": [
    {
      "text": "The sentence that was analyzed.",
      "isAI": true,
      "confidence": 0.95,
      "scores": { "ai": 0.95, "human": 0.05 }
    }
  ],
  "humanizedHint": "possibly_humanized",
  "inputAnomalies": { "homoglyph": 13, "zero_width": 0, "exotic_space": 0, "fullwidth": 0, "variation_selector": 0 },
  "subclassProbs": { "human": 0.0, "ai": 0.71, "ai_edited": 0.02, "humanized": 0.27 }
}
  • isAI : verdict au niveau du document (score > 50).
  • confidence : de 0 à 1, la solidité du verdict.
  • score : probabilité calibrée de 0 à 100 que le texte soit généré par IA.
  • verdict : le score par tranches : human (< 40), uncertain (40–70), likely_ai (70–90), ai (≥ 90). En cas de uncertain, confiez la relecture à une personne plutôt que de signaler automatiquement.
  • model : le modèle de détection qui a produit le résultat.
  • sentences[] : verdict et scores ai/human par phrase, pour la mise en surbrillance dans votre propre interface. Les vraies valeurs par phrase nécessitent mode: "depth".
  • humanizedHint : présent uniquement, avec la valeur possibly_humanized, lorsque le modèle attribue le signal IA principalement à un post-traitement par un humaniseur. Son absence ne signifie rien : le signal est précis mais ne se déclenche que sur ~40 % des textes humanisés, n'affichez donc jamais un état « non humanisé ».
  • inputAnomalies : présent uniquement lorsque le texte contenait des caractères cachés (homoglyphes cyrilliques, caractères de largeur nulle, espaces exotiques) couramment utilisés pour tromper les détecteurs. Ils ont été supprimés avant l'analyse.
  • subclassProbs : répartition par classe (human / ai / ai_edited / humanized). Information de diagnostic ; peut être absente lorsque la requête a été servie par le modèle de repli.

Coût : 1 crédit par mot. Consultez le guide de l'API de détection de texte pour des modèles d'intégration et des exemples concrets.

POST/api/v1/detect/image

Détecte les images générées par IA ou manipulées de façon synthétique. Lorsque le fichier contient encore des Content Credentials C2PA, le résultat est vérifié cryptographiquement plutôt qu'estimé.

Request

Envoyez l'image en multipart/form-data avec le nom de champ file.

  • Formats pris en charge : PNG, JPG, JPEG, GIF, WebP
  • Taille maximale : 4 Mo par requête

Example request

curl -X POST https://www.wasitaigenerated.com/api/v1/detect/image \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/image.jpg"

Response

{
  "isAI": true,
  "confidence": 0.99,
  "verified": true,
  "c2pa": {
    "vendor": "OpenAI",
    "generator": "ChatGPT",
    "generatorVersion": null,
    "softwareAgent": null,
    "issuer": "OpenAI",
    "signedAt": "2024-08-06T21:53:37+00:00",
    "signatureValid": true,
    "trusted": false,
    "validationState": "Valid",
    "validationCodes": ["signingCredential.untrusted"],
    "sourceType": "trainedAlgorithmicMedia",
    "isAI": true,
    "actions": ["c2pa.created"],
    "ingredients": 0,
    "manifestCount": 1
  },
  "provenance": {
    "platform": null,
    "watermarks": [],
    "signals": [],
    "confidence": "none"
  },
  "patterns": ["ai_verified", "c2pa_signed", "synthetic_artifacts"],
  "analysis": {
    "likelihood": "high",
    "reasoning": "AI-generated imagery detected with 99.0% confidence. Verified AI-generated: content credentials signed by ChatGPT (OpenAI) on 2024-08-06."
  },
  "detailed": {
    "scores": { "ai": 99.0, "human": 1.0 },
    "model": "v1.1"
  }
}
  • verified : lorsqu'il vaut true, l'image contient un Content Credential C2PA dont la signature est valide et qui déclare le fichier comme généré par IA. C'est une certitude, pas un score, et cela force isAI: true quel que soit le modèle d'analyse des pixels. Lorsqu'il vaut false, le verdict provient de l'analyse des pixels par le modèle.
  • c2pa : le Content Credential analysé, ou null si le fichier n'en contient pas. issuer est l'émetteur du certificat X.509 et le seul champ impossible à falsifier ; vendor et generator en sont déduits, ainsi que du manifeste (OpenAI / ChatGPT, Google, Microsoft, Adobe, Leica, …). signatureValid est la vérification cryptographique ; trusted exige en plus que l'émetteur figure sur une liste de confiance C2PA et vaut actuellement toujours false. sourceType vaut trainedAlgorithmicMedia pour un contenu IA et digitalCapture pour une photo d'appareil signée : un manifeste valide avec isAI: false indique que l'image est authentique.
  • provenance : heuristiques de plateforme et de filigrane (non cryptographiques), avec son propre confidence : high / medium / low / none.
  • patterns : étiquettes : ai_verified, c2pa_signed (manifeste valide, IA ou non), c2pa_invalid (signature invalide), c2pa_marker (marqueurs sans manifeste lisible), high_ai_confidence, synthetic_artifacts, human_generated.
  • confidence : de 0 à 1, issu du modèle de détection.
  • detailed.scores : probabilité IA contre humain, en pourcentage.

Coût : 300 crédits par image. Consultez le guide de l'API de détection d'images pour des modèles de modération et des seuils.

POST/api/v1/detect/video

Détecte les vidéos générées par IA. Envoyez un clip entier pour l'évaluer sur des images échantillonnées, ou une image isolée tirée d'une vidéo (miniature, capture d'écran) pour n'évaluer que celle-ci avec le modèle vidéo.

Request

Deux façons d'envoyer le fichier :

  • multipart/form-data avec le nom de champ file, jusqu'à 4 Mo
  • application/json avec {"url": "https://…"} pointant vers un fichier accessible publiquement, jusqu'à 50 Mo. C'est la méthode à utiliser pour la plupart des clips réels.
  • Clips : MP4, MOV, WebM, AVI. Les images sont échantillonnées uniformément sur la durée du clip, 10 par minute, 50 au maximum.
  • Images isolées : PNG, JPG, JPEG, WebP
  • Le type de fichier détermine le mode ; detailed.mode le renvoie.
  • Prévoyez un timeout de 60 s.

Example request

# Clip up to 4MB, uploaded directly
curl -X POST https://www.wasitaigenerated.com/api/v1/detect/video \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/clip.mp4"

# Larger clip (up to 50MB), passed by URL
curl -X POST https://www.wasitaigenerated.com/api/v1/detect/video \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/clip.mp4"}'

Response

{
  "isAI": true,
  "confidence": 0.94,
  "creditsCharged": 4800,
  "verified": false,
  "patterns": ["ai_generated_frames", "synthetic_artifacts"],
  "analysis": {
    "likelihood": "high",
    "reasoning": "AI-generated video detected with 94.0% confidence. 15 of 16 frames flagged as AI-generated."
  },
  "detailed": {
    "scores": { "ai": 94.0, "human": 6.0 },
    "model": "video-v1",
    "mode": "video",
    "framesAnalyzed": 16,
    "framesFlaggedAi": 15,
    "videoDurationSec": 8.2
  }
}
  • isAI / confidence : le verdict pour le clip et sa fiabilité (de 0 à 1).
  • detailed.mode : video pour un clip, frame pour une image isolée.
  • detailed.framesAnalyzed / framesFlaggedAi : combien d'images échantillonnées ont été évaluées et combien semblaient générées par IA. Clips uniquement.
  • detailed.frames : scores par image, lorsque le modèle les renvoie.

Coût : 300 crédits par image analysée. Un clip est échantillonné à 10 images par minute, au moins 16 et au plus 50 : il coûte donc de 4 800 à 15 000 crédits. Le minimum est débité d'avance, le reste une fois le nombre d'images connu ; creditsCharged dans la réponse indique ce qu'a coûté l'appel. Une image isolée coûte 300 crédits.

Serveur MCP

La détection est aussi disponible via le Model Context Protocol : un assistant IA peut ainsi vérifier lui-même textes et images, sans que vous ayez à copier-coller des résultats. Rien à installer : le serveur est hébergé et vous vous connectez à une URL.

Endpoint

https://www.wasitaigenerated.com/api/mcp

Connexion

Les clients compatibles OAuth récupèrent tout ce dont ils ont besoin depuis l'endpoint lui-même et ouvrent un navigateur pour que vous approuviez la connexion. Les clients qui utilisent un en-tête statique peuvent passer par une clé API :

claude mcp add --transport http wasitaigenerated \
  https://www.wasitaigenerated.com/api/mcp \
  --header "Authorization: Bearer $WAI_API_KEY"

Outils

  • detect_ai_text : évalue un passage, avec une analyse phrase par phrase. Coûte 1 crédit par mot.
  • detect_ai_image : vérifie une image par URL ou en base64, y compris les Content Credentials C2PA. Coûte 300 crédits.
  • get_credit_balance : lit votre solde restant. Gratuit.

Les appels effectués par un assistant consomment vos crédits exactement comme l'API REST. Un agent chargé de vérifier un long document dépensera un crédit par mot : mieux vaut lui indiquer le budget.

Erreurs

En cas d'échec, la réponse contient un corps JSON avec un champ error et souvent un message lisible.

400 Bad Request
Contenu texte manquant, fichier image ou vidéo manquant ou non pris en charge, ou url de vidéo impossible à récupérer.
401 Unauthorized
L'en-tête Authorization est absent, mal formé, ou la clé n'est pas valide.
402 Payment Required
Crédits insuffisants (insufficient_credits). Le corps contient required et available pour que vous puissiez afficher le manque.
403 Forbidden
plan_without_api : Pro est réservé au site. L'API fonctionne avec les crédits, API Business ou Enterprise.
413 Payload Too Large
Le texte, l'image ou la vidéo dépasse la taille maximale. Découpez le texte, réduisez l'image ou transmettez les clips de plus de 4 Mo par url (jusqu'à 50 Mo).
429 Too Many Requests
rate_limited : plus de 120 requêtes par minute sur cette clé API. Attendez le nombre de secondes indiqué dans l'en-tête Retry-After, puis réessayez.
500 Internal Server Error
Une erreur s'est produite de notre côté. Réessayez avec un backoff exponentiel ; contactez le support si le problème persiste.

Exemple : crédits épuisés

{
  "error": "Insufficient credits",
  "message": "You need 300 credits for image detection. You have 120 credits remaining.",
  "required": 300,
  "available": 120
}

Bonnes pratiques

Appelez-la de manière asynchrone

Sur les gros volumes de données, la détection prend du temps. Mettez l'appel en file d'attente et mettez à jour l'enregistrement à son retour, plutôt que de bloquer une requête côté utilisateur. Prévoyez un timeout client généreux : 60s pour le texte et la vidéo, 120s pour les images.

Traitez le score comme un indice, pas comme un verdict

La détection est probabiliste. Un texte IA fortement retravaillé se lit comme un texte humain, et certains écrits humains sont réellement stéréotypés. Transmettez les éléments signalés à une personne, montrez-lui l'analyse phrase par phrase et laissez-la décider. Sanctionner automatiquement sur la base d'un indice de confiance génère des réclamations indéfendables.

Privilégiez les fichiers originaux

Les captures d'écran et les images réencodées perdent du signal, et une capture d'écran supprime entièrement les Content Credentials : c'est pourquoi une capture manifestement synthétique peut revenir avec verified: false. Envoyez le fichier d'origine quand vous l'avez.

Découpez les longs documents

Un corps très long renvoie une 413. Découpez-le en sections de quelques milliers de mots et agrégez les résultats. Un texte long est plus fiable que quelques phrases : les entrées très courtes ne contiennent tout simplement pas assez de signal.

Gérez explicitement la 402

Les crédits sont débités à chaque appel : une intégration très sollicitée peut se retrouver à court en plein lot. Interceptez la 402, arrêtez le lot et alertez quelqu'un ; la réponse indique précisément combien il vous manquait.

Support

Une question sur l'intégration, les tarifs au volume, un SLA, ou un endpoint dont vous avez besoin et qui n'existe pas encore ? Écrivez-nous. Les demandes de fonctionnalités issues d'intégrations réelles sont prioritaires.