Documentation API
ISO 27001SOC 2 CertifiedGDPR Compliant

API de détection d'images par IA

Documentation complète pour intégrer l'API de détection d'images par IA TruthScan dans vos applications.

Essayez sans code en visitant notre endpoint FastAPI : https://detect-image.truthscan.com/docs

Authentification

TruthScan utilise des clés API pour autoriser l'accès. Obtenez votre clé en haut de la page du portail développeur.

TruthScan attend la clé API dans le corps JSON des requêtes vers le serveur, comme suit (sauf si un endpoint documente uniquement l'authentification par en-tête, p. ex. check-user-credits) :

{
  "key": "YOUR API KEY GOES HERE"
}

Remplacez YOUR API KEY GOES HERE par votre clé API personnelle.

Limites de débit

L'API applique un budget de requêtes par minute pour chaque clé d'API. Les endpoints d'écriture sont plus coûteux que ceux de lecture. La limite par défaut est de 60 requêtes par minute — contactez-nous si vous avez besoin d'une limite plus élevée.

Pondération des endpoints

Chaque appel déduit son poids de votre budget par minute :

EndpointTypePoids
POST /detectÉcriture1
POST /bulk-uploadÉcriture1
GET /get-presigned-urlLecture0.2
GET /check-user-creditsLecture0.2
POST /heatmap/{id}Lecture0.2
POST /preview/{id}Lecture0.2
POST /queryLectureNon limité
GET /healthLectureNon limité

Exemple : avec un budget de 60/minute, vous pouvez envoyer jusqu'à 60 appels d'écriture, jusqu'à ~300 appels de lecture, ou tout mélange dont le total pondéré reste ≤ 60 par minute.

Réponse limitée (HTTP 429)

Lorsque vous dépassez votre budget par minute, l'API renvoie :

HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 3
X-RateLimit-Retry-After: 3
Content-Type: application/json

{
  "error": "Too many requests"
}

En-têtes de réponse rate limit

  • X-RateLimit-Limit — votre capacité par minute.
  • X-RateLimit-Remaining — appels restants pour la minute courante (après cette requête).
  • X-RateLimit-Reset — (uniquement sur 429) secondes avant de pouvoir envoyer une nouvelle requête d'écriture.
  • X-RateLimit-Retry-After — (uniquement sur 429) même valeur que X-RateLimit-Reset, au format Retry-After.

Comportement client recommandé

  • Surveillez X-RateLimit-Remaining sur les réponses réussies pour cadencer vos requêtes.
  • Sur un 429, attendez au moins X-RateLimit-Retry-After secondes avant de réessayer — utilisez un backoff exponentiel avec jitter.
  • Pour les lots, privilégiez POST /bulk-upload (un appel traite jusqu'à 50 images) plutôt que de nombreux /detect en parallèle.

Détecteur d'images IA

Détection (processus en 3 étapes)

Le flux de détection d'images IA comprend les étapes suivantes :

  • Obtenir une URL de téléversement pré-signée
  • Téléverser l'image
  • Soumettre l'image pour détection

1. Obtenir une URL de téléversement pré-signée

Commencez par demander une URL pré-signée à l'API. Elle permet de téléverser votre fichier image de façon sécurisée vers le serveur de stockage.

Formats de fichier pris en charge

JPG, JPEG, PNG, WebP, JFIF, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG, PDF

Nom de fichier

Supprimez les espaces du nom de fichier de l'image lors de la demande d'URL pré-signée.

Pour les fichiers PDF, seule la première image sera détectée (flux fichier unique).

Utilisez un nom de fichier .zip sur cet endpoint lorsque vous préparez un envoi ZIP en masse.

Paramètres de requête

  • file_name (obligatoire) — Nom de fichier d'origine ; le serveur peut le normaliser (espaces et caractères non sûrs sont ajustés). Utilisez l'extension .zip pour un envoi groupé.
  • expiration (facultatif) — Durée de vie de l'URL pré-signée en secondes (par défaut : 3600).
GET https://detect-image.truthscan.com/get-presigned-url?file_name=example.jpg

Exemple de requête

curl -X GET 'https://detect-image.truthscan.com/get-presigned-url?file_name=example.jpg' \
--header 'apikey: YOUR API KEY GOES HERE'

Exemple de réponse

{
  "status": "success",
  "presigned_url": "https://nyc3.digitaloceanspaces.com/ai-image-detector-dev/uploads/581d47c7-3ef4-42af-88d9-6dab6bf69389_20250611-121955_example.jpg...",
  "file_path": "uploads/example.jpg",
  "document_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Le document_id est un nouvel UUID généré pour cette demande de téléversement (corrélation / journaux). L'id utilisé pour /detect ou /bulk-upload est attribué lors de la soumission de ces endpoints, sauf si vous passez un id facultatif sur /detect.

2. Téléverser l'image

Utilisez le presigned_url fourni pour téléverser votre image via une requête PUT. Assurez-vous que le Content-Type correspond au format de votre image.

Nom de fichier

Supprimez les espaces du nom de fichier de l'image lors du téléversement.

Définissez le Content-Type pour qu'il corresponde exactement à l'extension du fichier

  • image/jpeg: jpg, jpeg, jfif
  • image/png: png
  • image/webp: webp
  • image/heic: heic
  • image/heif: heif
  • image/avif: avif
  • image/bmp: bmp
  • image/tiff: tiff, tif
  • image/gif: gif
  • image/svg+xml: svg
  • application/pdf: pdf

Erreurs fréquentes à éviter

  • N'utilisez pas image/jpg (incorrect). Utilisez image/jpeg.
  • Ne faites pas correspondre fichier et en-tête de façon incohérente (ex. : fichier .png avec image/jpeg).
  • Ne changez pas l'extension sans mettre à jour l'en-tête (ou l'inverse).
  • N'incluez pas d'espaces dans les noms de fichier lors des demandes / téléversements.

Exemple de requête

curl -X PUT 'https://nyc3.digitaloceanspaces.com/ai-image-detector-dev/uploads/581d47c7-3ef4-42af-88d9-6dab6bf69389_20250611-121955_example.jpg...' \
  --header 'Content-Type: image/jpeg' \
  --header 'x-amz-acl: private' \
  --data-binary '@example.jpg'

Exemples de téléversement supplémentaires (PNG, PDF, SVG)

curl -X PUT '<PRESIGNED_URL_FOR_example.png>' \
  --header 'Content-Type: image/png' \
  --header 'x-amz-acl: private' \
  --data-binary '@example.png'
curl -X PUT '<PRESIGNED_URL_FOR_example.pdf>' \
  --header 'Content-Type: application/pdf' \
  --header 'x-amz-acl: private' \
  --data-binary '@example.pdf'
curl -X PUT '<PRESIGNED_URL_FOR_example.svg>' \
  --header 'Content-Type: image/svg+xml' \
  --header 'x-amz-acl: private' \
  --data-binary '@example.svg'

Limites de taille de fichier

  • Taille minimale : 1 Ko
  • Taille maximale : 10 Mo

Le format du fichier doit rester cohérent pendant le téléversement. Un téléversement réussi renvoie HTTP 200.

3. Soumettre l'image pour détection IA

Après le téléversement, soumettez l'image pour détection en vous référant au file_path de l'étape précédente. Pour les PDF, seule la première image sera analysée / détectée.

POST https://detect-image.truthscan.com/detect

Exemple de requête

curl -X 'POST' \
  'https://detect-image.truthscan.com/detect' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "key": "YOUR-API-KEY-GOES-HERE",
  "url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/<FILE_PATH>",
  "generate_preview": true
}'

FILE_PATH désigne le chemin renvoyé à l'étape URL pré-signée (p. ex. uploads/...). Construisez l'URL complète avec votre hôte de stockage comme dans l'exemple.

Paramètres facultatifs

  • id: Chaîne UUID facultative. Si omise, le serveur génère un nouvel id de document. Si fournie, elle ne doit pas déjà exister ; sinon l'API renvoie une erreur.
  • generate_preview: true pour générer une URL d'aperçu de l'image (par défaut : true). false pour ne pas générer d'aperçu.
  • document_type: Type de document (par défaut : Image).
  • email: Adresse e-mail pour le traitement.
  • generate_analysis_details: false pour ne pas générer l'analyse détaillée (par défaut : true).
  • generate_heatmap_overlayed: Contrôle la façon dont l'image de carte de chaleur est produite lorsqu'une carte est générée (par défaut : true). Si true, la carte est fusionnée avec l'image d'origine (superposition standard). Si false, le service renvoie une carte transparente : une image RGBA avec la carte d'activation colorée JET et l'alpha du modèle, sur fond transparent pour la composer dans votre interface.
  • generate_heatmap_normalized: Si false, la génération de carte de chaleur ignore l'étape de normalisation de la carte d'activation (par défaut : true). À combiner avec generate_heatmap_overlayed pour contrôler l'apparence.
  • model: Modèle ou indication de routage (par défaut : generic). Exemples pris en charge : generic ou instance_id/model (p. ex. my-instance-id/generic) pour envoyer la tâche vers une file dédiée à cette instance. Les instance_id invalides sont rejetées avec 400.
  • user_agent: Chaîne facultative stockée avec le document pour l'analytique / le support.

Exemple de réponse

{
    "id": "77565038-9e3d-4e6a-8c80-e20785be5ee9",
    "status": "pending"
}

La réponse inclut un identifiant d'image unique pour suivre l'état de la détection.

Interroger l'état et les résultats de détection

Pour connaître l'état et récupérer les résultats, utilisez l'endpoint /query avec l'identifiant de l'image.

Authentification : le corps de la requête ne contient que id ; l'API n'envoie pas de clé API sur cet appel. Toute personne connaissant l'UUID peut interroger les résultats — traitez les id de document comme sensibles si vous devez restreindre l'accès aux scores.

POST https://detect-image.truthscan.com/query

Exemple de requête

curl -X 'POST' \
  'https://detect-image.truthscan.com/query' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "id": "IMAGE-ID-GOES-HERE"
}'

Exemple de réponse

{
    "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
    "status": "done",
    "result": 90.2371538185235,
    "result_details": {
        "is_valid": true,
        "detection_step": 3,
        "final_result": "AI Generated",
        "metadata": [
            "No Information Detected for Real/AI",
            "Could not find anything from ExifTool and Pillow metadata"
        ],
        "metadata_basic_source": "null",
        "ocr": [
            "OCR did not detect AI",
            0.0
        ],
        "ml_model": [
            "AI Generated",
            90.2371538185235
        ],
        "confidence": 90.2371538185235,
        "heatmap_status": "ready",
        "heatmap_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/uploads/....",
        "analysis_results_status": "pending",
        "analysis_results": null,
        "warnings": [
            { "type": "blur_dark", "label": "Blurred" },
            { "type": "watermark", "label": "Gemini", "confidence": 0.95 },
            { "type": "screen_recapture", "label": "screen", "metrics": { "is_screen": false }, "confidence": 99.99 }
        ]
    },
    "preview_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/previews/..."
}

Exemple de réponse (/query, URLs sécurisées activées pour l'organisation)

{
    "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
    "status": "done",
    "result": 90.2371538185235,
    "result_details": {
        "is_valid": true,
        "detection_step": 3,
        "final_result": "AI Generated",
        "confidence": 90.2371538185235,
        "heatmap_status": "ready",
        "heatmap_url": "https://ai-image-detect.undetectable.ai/heatmap/00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
        "analysis_results_status": "ready",
        "analysis_results": null
    },
    "preview_url": "https://ai-image-detect.undetectable.ai/preview/00fee5ff-a55b-42fb-b7c7-d14f05ae0769"
}

Exemple de réponse lorsque l'analyse détaillée est prête

{
    "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
    "status": "done",
    "result": 90.2371538185235,
    "result_details": {
        "heatmap_status": "ready",
        "heatmap_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/uploads/....",
        "analysis_results_status": "ready",
        "analysis_results": {
            "imageTags": ["person", "portrait", "outdoor", "vineyard", "smiling"],
            "agreement": "strong",
            "confidence": 92,
            "keyIndicators": [
                "Unnaturally smooth skin texture",
                "Consistent lighting anomalies"
            ],
            "detailedReasoning": "The image shows clear signs of AI generation with unnaturally smooth textures and consistent lighting patterns not typical of real photography.",
            "visualPatterns": ["Uniform noise pattern typical of diffusion models"],
            "recommendations": [
                "Cross-reference with original source if available",
                "Check for metadata inconsistencies",
                "Compare with known AI generation patterns"
            ]
        }
    },
    "preview_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/previews/..."
}

Détails du résultat

  • is_valid: Indique si le fichier image est valide (true/false).
  • detection_step: Étape à laquelle la détection s'est terminée : 1 = métadonnées uniquement ; 2 = métadonnées et ocr ; 3 = métadonnées, ocr et ml_model.
  • final_result: Verdict global (p. ex. « AI Generated », « Real », « Digitally Edited », « AI Edited »).
  • confidence: Score de confiance de la détection.
  • metadata: Informations extraites des métadonnées de l'image avec ExifTool et Pillow.
  • metadata_basic_source: Peut indiquer si l'image provient d'un modèle d'appareil photo mobile, d'un outil d'IA ou a été modifiée avec un logiciel de retouche.
  • ocr: Résultat de détection de filigrane sous le nom historique ocr. Tableau à deux éléments [label, score] : label est une classe de filigrane détectée (p. ex. « Gemini ») ou « OCR did not detect AI » ; score sur une échelle 0–100 (ou 0 en cas d’incertitude). Résumé dans warnings lorsqu’un label est présent.
  • ml_model: Résultats du modèle d'apprentissage automatique.
  • warnings: Tableau facultatif d'objets d'avertissement hétérogènes (type blur_dark, watermark, screen_recapture, etc.). Peut être vide ou omis.
  • preview_url: URL d'aperçu si generate_preview était true. Peut pointer directement vers le stockage ou, avec URLs sécurisées, vers un chemin API tel que https://<api-host>/preview/<document_id>.
  • heatmap_status: pending, ready ou failed. La génération de carte de chaleur est asynchrone.
  • heatmap_url: Carte de chaleur lorsque heatmap_status vaut ready. L'apparence dépend de generate_heatmap_overlayed. Peut être un stockage direct ou un chemin API https://<api-host>/heatmap/<document_id> (utilisez POST /heatmap/{id} avec la clé si sécurisé).
  • analysis_results_status: pending, ready, skipped, failed ou analyzing. Omis ou null lorsque generate_analysis_details était false.
  • analysis_results: Analyse narrative détaillée lorsqu'elle est activée ; voir Explication du résultat d'analyse ci-dessous.

Explication du résultat d'analyse

Lorsque analysis_results est prêt, il inclut généralement : agreement (strong | moderate | weak | disagreement), imageTags (jusqu'à cinq courts tags), confidence (0–100), keyIndicators, detailedReasoning, visualPatterns et recommendations.

Remarques

  • La génération de carte de chaleur est asynchrone. Interrogez /query pour heatmap_status et heatmap_url.
  • L'analyse détaillée est asynchrone sauf si generate_analysis_details=false. Interrogez analysis_results_status et analysis_results.
  • URLs sécurisées : une fois activées, heatmap_url et preview_url peuvent utiliser l'hôte API ; récupérez avec POST /heatmap/{id} et POST /preview/{id} avec votre clé (voir Ressources carte de chaleur et aperçu sécurisées).
  • Réinterrogez /query après le score principal pour récupérer heatmap et analysis_results une fois terminés.

Carte de chaleur et superposition

Le fichier à heatmap_url reflète generate_heatmap_overlayed et generate_heatmap_normalized de votre requête /detect (ou /bulk-upload) : la superposition par défaut (true) est une image normale avec la carte superposée ; false est généralement un PNG transparent pour la composition.

Exemple : résultat ~90,24 avec final_result AI Generated et detection_step 3 signifie que le pipeline complet (métadonnées, OCR et modèle ML) est terminé.

Résultats d'analyse (analyse approfondie asynchrone)

Lorsque generate_analysis_details est true dans /detect, l'analyse détaillée peut se terminer après le score principal. Interrogez /query jusqu'à ce que analysis_results_status soit ready (ou skipped/failed).

1. Le résultat initial peut être prêt avant l'analyse

La détection principale (result, final_result, confidence) peut être disponible pendant que analysis_results_status est encore pending.

{
    "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
    "status": "done",
    "result": 90.2371538185235,
    "result_details": {
        "is_valid": true,
        "detection_step": 3,
        "final_result": "AI Generated",
        "confidence": 90.2371538185235,
        "analysis_results_status": "pending",
        "analysis_results": null
    }
}

Que faire

Utilisez les champs principaux immédiatement ; continuez à interroger si vous avez besoin de analysis_results.

2. Poursuivre l'interrogation

Appelez /query avec le même id jusqu'à ce que analysis_results_status change par rapport à pending.

curl -X 'POST' \
  'https://detect-image.truthscan.com/query' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769"
}'

3. Analyse terminée

Lorsque analysis_results_status vaut ready, analysis_results inclut agreement, imageTags, confidence, keyIndicators, detailedReasoning, visualPatterns et recommendations.

{
    "id": "00fee5ff-a55b-42fb-b7c7-d14f05ae0769",
    "status": "done",
    "result": 90.2371538185235,
    "result_details": {
        "is_valid": true,
        "detection_step": 3,
        "final_result": "AI Generated",
        "confidence": 90.2371538185235,
        "heatmap_status": "ready",
        "heatmap_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/uploads/....",
        "analysis_results_status": "done",
        "analysis_results": {
            "imageTags": [
                "person",
                "portrait",
                "outdoor",
                "vineyard",
                "smiling"
            ],
            "agreement": "strong",
            "confidence": 92,
            "keyIndicators": [
                "Unnaturally smooth skin texture",
                "Consistent lighting anomalies"
            ],
            "detailedReasoning": "The image shows clear signs of AI generation with unnaturally smooth textures and consistent lighting patterns not typical of real photography.",
            "visualPatterns": [
                "Uniform noise pattern typical of diffusion models"
            ],
            "recommendations": [
                "Cross-reference with original source if available",
                "Check for metadata inconsistencies",
                "Compare with known AI generation patterns"
            ]
        }
    },
    "preview_url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/previews/..."
}

Lorsque l'analyse n'est pas disponible

Si analysis_results_status vaut skipped, failed ou est absent, ou si generate_analysis_details était false, considérez la détection principale comme définitive.

{
    "status": "done",
    "result": 12.5,
    "result_details": {
        "analysis_results_status": "skipped",
        "analysis_results": null
    }
}

Champs des résultats d'analyse

  • analysis_results_status: pending | ready | skipped | failed | analyzing
  • analysis_results.agreement: strong | moderate | weak | disagreement
  • analysis_results.imageTags: courts tags descriptifs
  • analysis_results.confidence: 0–100
  • analysis_results.keyIndicators: indices précis
  • analysis_results.detailedReasoning: brève explication
  • analysis_results.visualPatterns: motifs plus larges
  • analysis_results.recommendations: prochaines étapes

Envoi groupé (ZIP)

Soumettez plusieurs images en une seule requête en téléversant un ZIP. Le flux reprend l'image unique : presign (nom .zip) → PUT ZIP → POST /bulk-upload → interroger /query.

1. Obtenir une URL de téléversement pré-signée (ZIP)

Utilisez get-presigned-url avec un nom de fichier .zip (p. ex. images.zip).

GET https://detect-image.truthscan.com/get-presigned-url?file_name=images.zip

Exemple de requête

curl -X GET 'https://detect-image.truthscan.com/get-presigned-url?file_name=images.zip' \
--header 'apikey: YOUR API KEY GOES HERE'

2. Téléverser le ZIP

PUT du ZIP vers l'URL pré-signée avec Content-Type: application/zip.

curl -X PUT '<PRESIGNED_URL_FOR_images.zip>' \
  --header 'Content-Type: application/zip' \
  --header 'x-amz-acl: private' \
  --data-binary '@images.zip'

Limites ZIP

  • Taille maximale du ZIP : 100 Mo
  • Nombre maximal d'images par envoi groupé : 50
  • Limites par image : minimum 1 Ko, maximum 10 Mo

Formats pris en charge dans le ZIP

JPG, JPEG, PNG, WebP, JFIF, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG

Les fichiers PDF dans le ZIP ne sont pas pris en charge et seront ignorés.

Les fichiers SVG sont convertis en PNG avant détection.

3. Soumettre le ZIP pour détection en masse

POST /bulk-upload avec key et url pointant vers le chemin du ZIP téléversé.

Paramètres facultatifs

  • generate_preview: true pour générer des URL d'aperçu pour les images (par défaut : false).
  • generate_analysis_details: true pour générer une analyse détaillée (par défaut : false).
  • generate_heatmap_overlayed: Même comportement que /detect (superposition vs carte RGBA transparente).
  • generate_heatmap_normalized: Même comportement que /detect (par défaut : true).
  • model: Domaine du modèle : generic ou format instance_id/model.

Exemple de requête

curl -X 'POST' \
  'https://detect-image.truthscan.com/bulk-upload' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "key": "YOUR-API-KEY-GOES-HERE",
  "url": "https://ai-image-detector-prod.nyc3.digitaloceanspaces.com/<FILE_PATH>",
  "generate_preview": false,
  "generate_analysis_details": false,
  "model": "generic"
}'

Exemple de réponse

{
    "id": "77565038-9e3d-4e6a-8c80-e20785be5ee9",
    "status": "pending",
    "expected_count": 12
}

Renvoie id, status pending et expected_count (nombre d'images du ZIP qui seront analysées).

Mise à jour des résultats ZIP en masse

  • Après soumission, le statut est pending jusqu'au début du traitement, puis analyzing.
  • results liste chaque image ; les entrées pending ont result et result_details null jusqu'à la fin.
  • Les cartes de chaleur et l'analyse détaillée peuvent encore être en attente dans result_details.
  • Lorsque chaque image de results est terminée, le statut global devient done. En cas d'échec du lot, le statut peut être failed.
  • Vous pouvez appeler /query avant la fin du ZIP pour voir des résultats partiels.

4. Interroger les résultats de l'envoi groupé

Utilisez POST /query avec l'id renvoyé par /bulk-upload. Même endpoint que pour une image unique ; la forme de la réponse dépend du fait que l'id soit une image seule ou un lot ZIP.

curl -X 'POST' \
  'https://detect-image.truthscan.com/query' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "id": "77565038-9e3d-4e6a-8c80-e20785be5ee9"
}'

Exemple de réponse (traitement en cours)

{
  "id": "3b81fb24-dd23-40e7-ae95-82f823f44098",
  "status": "analyzing",
  "results": [
    {
      "id": "4600c7e5-00ec-469d-9117-ff20e0f1c1fa",
      "status": "done",
      "result": 44.0006,
      "result_details": {},
      "filename": "photo1.jpg",
      "preview_url": null
    },
    {
      "id": "2f770c89-352a-4d53-b6a3-a2147ca2c0ae",
      "status": "pending",
      "result": null,
      "result_details": null,
      "filename": "photo2.jpg",
      "preview_url": null
    }
  ],
  "skipped": []
}

Champs de réponse (ZIP en masse)

  • id — Identifiant de la demande groupée.
  • status — pending, puis analyzing, puis done ou failed.
  • results — Une entrée par image analysée (id, status, result, result_details, filename, preview_url le cas échéant).
  • skipped — Fichiers non analysés (type non pris en charge, taille, etc.) avec status failed et raison dans result_details.

Facturation : les crédits ne sont consommés que pour les images analysées avec succès. Les conversions SVG en échec et les fichiers ignorés ne sont pas facturés.

Ressources carte de chaleur et aperçu sécurisées

Lorsque heatmap_url ou preview_url dans /query pointent vers l'hôte API (pas le stockage objet direct), téléchargez les octets avec POST et votre clé.

POST /heatmap/{id}

POST /preview/{id}

Corps JSON de la requête : { "key": "YOUR-API-KEY-GOES-HERE" }

Réponses carte de chaleur (vérifiez le statut HTTP et le Content-Type)

  • 200 + binaire (image/png, etc.) — Fichier carte de chaleur disponible. X-Heatmap-Status peut être défini.
  • 202 + JSON — heatmap_status pending ; interrogez /query et réessayez.
  • 200 + JSON — Aucune carte à servir (fonctionnalité facultative, échec, etc.) ; ce n'est pas une erreur serveur.
  • 500 + JSON — heatmap_url stockée existe mais le fichier n'a pas pu être téléchargé depuis le stockage ; réessayez plus tard.
  • 404 + JSON — Id de document introuvable.
  • 403 + JSON — La clé API ne possède pas ce document.

Aperçu : POST /preview/{id} renvoie les octets bruts de l'aperçu. 404 avec JSON si aucun aperçu n'a été généré (generate_preview était false).

Exemples

curl -X POST 'https://detect-image.truthscan.com/heatmap/00fee5ff-a55b-42fb-b7c7-d14f05ae0769' \
  -H 'Content-Type: application/json' \
  -d '{"key":"YOUR-API-KEY-GOES-HERE"}' \
  --output heatmap.png
curl -X POST 'https://detect-image.truthscan.com/preview/00fee5ff-a55b-42fb-b7c7-d14f05ae0769' \
  -H 'Content-Type: application/json' \
  -d '{"key":"YOUR-API-KEY-GOES-HERE"}' \
  --output preview.png

Interne : synchronisation de l'usage organisation vers Stripe (secret de tâche)

Backends de confiance uniquement, pas les clients API grand public. Nécessite l'en-tête x-job-secret correspondant au JOB_SECRET du serveur. Synchronise l'usage TruthScan mesuré de l'organisation vers Stripe pour une plage de dates.

POST /organizations/{org_id}/usage/sync-to-stripe

En-têtes : x-job-secret: <JOB_SECRET>

Corps JSON : start_date, end_date, idempotency_id facultatif pour l'idempotence du compteur Stripe.

Renvoie success, organization_id, total_documents, value_sent_to_stripe, report_date, message. 400 si l'org n'est pas mesurée ou stripe_customer_id manquant si nécessaire ; 401 secret invalide ; 404 org introuvable ; 500 erreurs Stripe / configuration.

Vérifier les crédits utilisateur

Cet endpoint accepte la clé apikey de l'utilisateur via l'en-tête et renvoie le détail des crédits.

GET https://detect-image.truthscan.com/check-user-credits

Exemple de requête

curl -X 'GET' \
  'https://detect-image.truthscan.com/check-user-credits' \
  -H 'apikey: YOUR API KEY GOES HERE' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json'

Exemple de réponse

{
    "baseCredits": 10000,
    "boostCredits": 1000,
    "credits": 11000
}

Pour les intégrations externes, seul le champ credits est renseigné.

Vérification de l'état du service

Vérifiez l'état de santé du serveur API.

GET https://detect-image.truthscan.com/health

Exemple de requête

curl -X 'GET' \
  'https://detect-image.truthscan.com/health' \
  -H 'accept: application/json'

Exemple de réponse

{
    "status": "healthy"
}

Une réponse « healthy » indique que le service fonctionne normalement.

Erreurs

La plupart des erreurs proviennent de paramètres incorrects envoyés à l'API. Vérifiez chaque appel et essayez les exemples fournis.

Les codes d'erreur génériques que nous utilisons respectent le standard REST :

Code d'erreurSignification
400Bad Request — Votre requête est invalide.
401Unauthorized — Secret de tâche interne invalide (endpoints d'usage interne) ou autre échec d'authentification similaire.
403Forbidden — Clé API invalide, accès refusé ou crédits insuffisants pour l'opération.
404Not Found — La ressource demandée n'existe pas.
405Method Not Allowed — Vous avez tenté d'accéder à une ressource avec une méthode non valide.
406Not Acceptable — Vous avez demandé un format autre que JSON.
410Gone — La ressource sur cet endpoint a été supprimée.
422Invalid Request Body — Le corps de la requête est mal formaté, invalide ou incomplet.
429Too Many Requests — Vous avez dépassé le rate limit de votre clé d'API (voir Limites de débit). Le corps est {"error":"Too many requests"} ; l'en-tête X-RateLimit-Retry-After indique combien de secondes attendre avant de réessayer.
500Internal Server Error — Problème côté serveur. Réessayez plus tard.
503Service Unavailable — Service temporairement indisponible pour maintenance. Réessayez plus tard.

Problèmes courants et solutions

Problèmes d'authentification

« User verification failed » (403)

Cause: Clé API invalide ou expirée

Solution:

  1. Vérifiez que votre clé API est correcte
  2. Contrôlez que votre clé est active dans votre compte
  3. Essayez de régénérer votre clé API

« Not enough credits » (403)

Cause: Crédits insuffisants pour le traitement d'image

Solution:

  1. Vérifiez vos crédits restants avec /check-user-credits
  2. Achetez des crédits supplémentaires si nécessaire

Problèmes de validation des entrées

« Input URL cannot be empty » (400)

Cause: URL vide ou invalide soumise

Solution:

  1. Assurez-vous que l'entrée url n'est pas vide
  2. Supprimez les espaces en début et fin dans les noms d'image
  3. Vérifiez l'encodage de l'URL

« Input email is empty » (400)

Cause: E-mail manquant pour le traitement d'URL

Solution:

  1. Fournissez une adresse e-mail valide lors de la soumission d'URL
  2. Vérifiez le format de l'e-mail

« Unsupported image type » (400)

Cause: Format de fichier non pris en charge

Solution:

  1. Convertissez vers un format pris en charge (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, GIF, SVG, PDF)
  2. Vérifiez que l'extension du fichier est correcte

« File size is too small » (400)

Cause: Fichier image en dessous de la taille minimale

Solution:

  1. Utilisez une image plus grande (minimum 1 Ko)
  2. Vérifiez que l'image n'a pas été corrompue pendant le téléversement

« File size exceeds limit » (400)

Cause: Fichier image trop volumineux

Solution:

  1. Compressez ou redimensionnez l'image ; la limite maximale dépend du déploiement (le message d'erreur de l'API indique la limite en Mo)
  2. Utilisez un autre format d'image

« Invalid file type » (400)

Cause: Échec de la validation du type de fichier

Solution:

  1. Assurez-vous que le fichier est un format image valide
  2. Vérifiez que le fichier n'est pas corrompu
  3. Vérifiez que le type MIME correspond à l'extension

Problèmes de traitement

Statut d'image « failed »

Cause: Échec du traitement pour diverses raisons

Solution:

  1. Vérifiez que l'URL est dans un format pris en charge
  2. Contrôlez que le fichier image est valide et non corrompu
  3. Assurez-vous que l'image respecte les exigences de taille
  4. Contactez le support si le problème persiste

« User not found »

Cause: Identifiant utilisateur invalide

Solution:

  1. Vérifiez que l'identifiant utilisateur est correct
  2. Assurez-vous que le compte est actif
  3. Réauthentifiez-vous si nécessaire

« File metadata could not be fetched » (500)

Cause: Impossible d'accéder au fichier téléversé

Solution:

  1. Vérifiez que le fichier a bien été téléversé
  2. Contrôlez que l'URL du fichier est accessible
  3. Réessayez de téléverser le fichier

Problèmes de téléversement

« Image upload failed » (403/400)

Cause: URL pré-signée invalide ou expirée, ou problème avec le serveur de stockage

Solution:

  1. Utilisez l'URL pré-signée rapidement après réception
  2. Vérifiez que le Content-Type correspond au format du fichier
  3. Supprimez les espaces du nom de fichier avant le téléversement
  4. Générez une nouvelle URL pré-signée si nécessaire

« Invalid pre-signed URL » (400)

Cause: Nom de fichier avec espaces ou URL pré-signée expirée / corrompue

Solution:

  1. Supprimez les espaces du nom de fichier avant de demander une URL pré-signée
  2. Utilisez des caractères alphanumériques, tirets et underscores
  3. Générez une nouvelle URL pré-signée si nécessaire

Problèmes d'envoi groupé

« URL must point to a ZIP file » (400)

Cause: L'URL fournie à /bulk-upload ne pointe pas vers un fichier ZIP

Solution:

  1. Utilisez get-presigned-url?file_name=images.zip (ou un autre nom .zip)
  2. Téléversez un ZIP valide vers l'URL pré-signée
  3. Assurez-vous que l'url de bulk-upload pointe vers ce ZIP téléversé

« ZIP file too large » (400)

Cause: Le ZIP dépasse la taille maximale (100 Mo)

Solution:

  1. Réduisez le nombre d'images ou compressez-les
  2. Répartissez sur plusieurs envois groupés

« Too many files » (400)

Cause: Le ZIP contient plus de 50 images valides

Solution:

  1. Limitez à 50 images ou moins par ZIP
  2. Répartissez sur plusieurs envois groupés

« No valid images found in ZIP » (400)

Cause: Tous les fichiers du ZIP ont été ignorés (format non pris en charge, trop petit, chemin invalide, etc.)

Solution:

  1. Utilisez des formats pris en charge (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG)
  2. Le PDF n'est pas pris en charge en masse
  3. Chaque image doit faire au moins 1 Ko et au plus 10 Mo
  4. Évitez les fichiers cachés (noms commençant par .) et la traversée de répertoire (..)

« Document is not a bulk upload (image-zip) result » (400)

Cause: L'id ne correspond pas à ce type de téléversement (image unique vs lot ZIP)

Solution:

  1. Utilisez l'id renvoyé par /detect pour les soumissions fichier unique
  2. Utilisez l'id renvoyé par /bulk-upload pour les soumissions ZIP

Besoin d'aide ?

Pour plus d'informations sur l'utilisation de notre API ou pour le support technique, contactez-nous.

Questions fréquentes sur l'API

Réponses aux questions les plus courantes sur notre API de détection d'images par IA.