API-documentatie
ISO 27001SOC 2 CertifiedGDPR Compliant

AI Image Detection API

Volledige documentatie voor het integreren van de AI image detection API van TruthScan in uw applicaties.

Probeer het zonder code via ons FastAPI endpoint: https://detect-image.truthscan.com/docs

Authentication

TruthScan gebruikt API keys voor toegang. U vindt uw API key bovenaan de pagina in het developer portal.

De API key hoort in het JSON body van requests (tenzij een endpoint alleen header-auth documenteert, bijv. check-user-credits):

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

Vervang YOUR API KEY GOES HERE door uw persoonlijke API key.

Rate limits

De API hanteert voor elke API key een budget van requests per minuut. Schrijf-endpoints kosten meer dan lichtere lees-endpoints. De standaardlimiet is 60 requests per minuut — neem contact met ons op als u een hoger limiet nodig hebt.

Endpoint-weights

Elke call trekt zijn weight af van uw budget per minuut:

EndpointTypeWeight
POST /detectSchrijven1
POST /bulk-uploadSchrijven1
GET /get-presigned-urlLezen0.2
GET /check-user-creditsLezen0.2
POST /heatmap/{id}Lezen0.2
POST /preview/{id}Lezen0.2
POST /queryLezenNiet beperkt
GET /healthLezenNiet beperkt

Voorbeeld: met een budget van 60/minuut kunt u tot 60 schrijfcalls, tot ~300 leescalls, of elke mix sturen waarbij het gewogen totaal ≤ 60 per minuut blijft.

Geslote response (HTTP 429)

Wanneer u uw budget per minuut overschrijdt, geeft de API:

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"
}

Rate-limit response headers

  • X-RateLimit-Limit — uw capaciteit per minuut.
  • X-RateLimit-Remaining — calls die u in de huidige minuut nog over hebt (na deze request).
  • X-RateLimit-Reset — (alleen bij 429) seconden tot u opnieuw een schrijfrequest kunt sturen.
  • X-RateLimit-Retry-After — (alleen bij 429) zelfde waarde als X-RateLimit-Reset, in Retry-After-stijl.

Aanbevolen client-gedrag

  • Bekijk X-RateLimit-Remaining in succesvolle responses om uw requests te doseren.
  • Bij een 429 wacht u minimaal X-RateLimit-Retry-After seconden voordat u retry't — gebruik exponential backoff met jitter.
  • Voor batches: geef de voorkeur aan POST /bulk-upload (één call verwerkt tot 50 afbeeldingen) boven veel parallelle /detect-calls.

AI Image Detector

Detect (3-stapsproces)

De AI Image Detection-workflow bestaat uit de volgende stappen:

  • Verkrijg een pre-signed upload-URL
  • Upload de afbeelding
  • Dien de afbeelding in voor detection

1. Verkrijg een pre-signed upload-URL

Vraag eerst een pre-signed URL aan bij de API. Met deze URL upload u uw afbeeldingsbestand veilig naar de storage-server.

Ondersteunde bestandsformaten

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

Bestandsnaam

Verwijder spaties uit de afbeeldingsbestandsnaam bij het aanvragen van een pre-signed URL.

Voor PDF-bestanden wordt alleen de eerste afbeelding gedetecteerd (single-file flow).

Gebruik een .zip-bestandsnaam op dit endpoint als u een ZIP via bulk upload wilt indienen.

Query parameters

  • file_name (verplicht) — Originele bestandsnaam; de server kan deze normaliseren (spaties en onveilige tekens worden aangepast). Gebruik een .zip-extensie voor bulk upload.
  • expiration (optioneel) — Levensduur van de presigned URL in seconden (standaard: 3600).
GET https://detect-image.truthscan.com/get-presigned-url?file_name=example.jpg

Voorbeeldrequest

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

Voorbeeldresponse

{
  "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"
}

Het document_id is een nieuwe UUID voor deze upload (correlatie/logging). Het id dat u voor /detect of /bulk-upload gebruikt, wordt toegewezen bij het indienen van die endpoints, tenzij u een optioneel id meegeeft op /detect.

2. Upload de afbeelding

Gebruik de presigned_url om uw afbeelding te uploaden via een PUT-request. Zet Content-Type correct volgens uw bestandsformaat.

Bestandsnaam

Verwijder spaties uit de afbeeldingsbestandsnaam bij het uploaden.

Zet Content-Type exact gelijk aan uw bestandsextensie

  • 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

Veelgemaakte fouten

  • Gebruik geen image/jpg (fout). Gebruik image/jpeg.
  • Laat bestand en header niet uit elkaar lopen (bijv. .png met image/jpeg).
  • Wijzig de extensie niet zonder de header aan te passen (of omgekeerd).
  • Gebruik geen spaties in bestandsnamen bij request/upload.

Voorbeeldrequest

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'

Extra uploadvoorbeelden (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'

Bestandsgrootte

  • Minimum: 1KB
  • Maximum: 10MB

Het bestandsformaat moet tijdens upload consistent blijven. Een geslaagde upload geeft HTTP 200.

3. Dien afbeelding in voor AI detection

Na upload: dien in voor AI detection door te verwijzen naar file_path uit de vorige stap. Bij PDF-uploads wordt alleen de eerste afbeelding geanalyseerd.

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

Voorbeeldrequest

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 is het pad uit de presigned-URL-stap (bijv. uploads/...). Bouw de volledige URL met uw storage host zoals in het voorbeeld.

Optionele parameters

  • id: Optionele UUID-string. Bij weglaten genereert de server een nieuw document-id. Indien opgegeven: mag nog niet bestaan; anders retourneert de API een fout.
  • generate_preview: Zet op true voor een preview-URL (standaard: true). Zet op false om preview over te slaan.
  • document_type: Documenttype (standaard: Image).
  • email: E-mailadres voor verwerking.
  • generate_analysis_details: Zet op false om gedetailleerde analyse over te slaan (standaard: true).
  • generate_heatmap_overlayed: Bepaalt hoe de heatmap wordt geproduceerd (standaard: true). Bij true: heatmap gemengd met origineel (standaard overlay). Bij false: transparante heatmap — RGBA met JET-kleuren en alpha, transparante achtergrond voor compositing in uw UI.
  • generate_heatmap_normalized: Bij false slaat heatmap-generatie normalisatie over (standaard: true). Combineer met generate_heatmap_overlayed voor uiterlijk.
  • model: Model- of routinghint (standaard: generic). Onder andere generic, of instance_id/model (bijv. my-instance-id/generic) voor een dedicated queue. Ongeldige instance_id: 400.
  • user_agent: Optionele string opgeslagen bij het document voor analytics/support.

Voorbeeldresponse

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

De response bevat een unieke image-ID om de detection-status te volgen.

Query detection status en resultaten

Gebruik het /query endpoint met de image-ID om status en resultaten op te halen.

Authentication: het request body bevat alleen id; er wordt geen API key meegestuurd. Wie de UUID kent kan pollen — behandel document-ID's als gevoelig als u toegang wilt beperken.

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

Voorbeeldrequest

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

Voorbeeldresponse

{
    "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/..."
}

Voorbeeldresponse (/query, secure URLs ingeschakeld voor de org)

{
    "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"
}

Voorbeeldresponse wanneer analyse klaar is

{
    "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/..."
}

Resultaatdetails

  • is_valid: Of het bestand geldig is (true/false).
  • detection_step: Fase waarin detection klaar is: 1 = alleen metadata; 2 = metadata en ocr; 3 = metadata, ocr en ml_model.
  • final_result: Totale beoordeling (bijv. "AI Generated", "Real", "Digitally Edited", "AI Edited").
  • confidence: Confidence score van de detection.
  • metadata: Info uit image metadata via ExifTool en Pillow.
  • metadata_basic_source: Kan aangeven of de afbeelding met een bepaalde mobiele camera is vastgelegd, door een AI-tool is gegenereerd of met fotosoftware is bewerkt.
  • ocr: Watermark-detection onder historische veldnaam ocr. Twee-element array [label, score]: label is een gedetecteerde watermark-class (bijv. "Gemini") of "OCR did not detect AI"; score 0–100 (of 0 bij twijfel). Samengevat in warnings.
  • ml_model: Resultaten van het machine learning model.
  • warnings: Optionele array met warning-objecten (type blur_dark, watermark, screen_recapture, enz.). Kan leeg of ontbreken.
  • preview_url: Preview-URL als generate_preview true was. Direct storage of, bij secure URLs, API-pad zoals https://<api-host>/preview/<document_id>.
  • heatmap_status: pending, ready of failed. Heatmap-generatie is asynchroon.
  • heatmap_url: Heatmap als heatmap_status ready is. Uiterlijk hangt af van generate_heatmap_overlayed. Direct storage of API-pad https://<api-host>/heatmap/<document_id> (gebruik POST /heatmap/{id} met key bij secure).
  • analysis_results_status: pending, ready, skipped, failed of analyzing. Ontbreekt of null als generate_analysis_details false was.
  • analysis_results: Gedetailleerde narratieve analyse indien ingeschakeld; zie uitleg hieronder.

Uitleg analysis result

Als analysis_results klaar is, bevat het doorgaans: agreement (strong | moderate | weak | disagreement), imageTags (max. vijf korte tags), confidence (0–100), keyIndicators, detailedReasoning, visualPatterns en recommendations.

Opmerkingen

  • Heatmap-generatie is asynchroon. Poll /query voor heatmap_status en heatmap_url.
  • Gedetailleerde analyse is asynchroon tenzij generate_analysis_details=false. Poll analysis_results_status en analysis_results.
  • Secure URLs: bij inschakeling kunnen heatmap_url en preview_url de API-host gebruiken; haal op met POST /heatmap/{id} en POST /preview/{id} met uw key (zie Secure heatmap en preview assets).
  • Poll /query opnieuw nadat de hoofdscore klaar is om heatmap en analysis_results op te pikken.

Heatmap en overlay-gedrag

Het bestand op heatmap_url volgt generate_heatmap_overlayed en generate_heatmap_normalized van uw /detect (of /bulk-upload): standaard overlay (true) is een normale afbeelding met heatmap; false is typisch een PNG met transparantie voor compositing.

Voorbeeld: result ~90.24 met final_result AI Generated en detection_step 3 betekent volledige pipeline: metadata, OCR en ML model.

Analysis results (asynchrone deep analysis)

Als generate_analysis_details true is in /detect, kan gedetailleerde analyse na de hoofdscore klaarkomen. Poll /query tot analysis_results_status ready (of skipped/failed).

1. Eerste resultaat kan vóór analyse klaar zijn

Kern-detection (result, final_result, confidence) kan klaar zijn terwijl analysis_results_status nog pending is.

{
    "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
    }
}

Wat te doen

Gebruik kernvelden direct; blijf pollen als u analysis_results nodig heeft.

2. Blijf pollen

Roep /query met hetzelfde id aan tot analysis_results_status verandert van 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 voltooid

Als analysis_results_status ready is, bevat analysis_results agreement, imageTags, confidence, keyIndicators, detailedReasoning, visualPatterns en 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/..."
}

Wanneer analyse niet beschikbaar is

Als analysis_results_status skipped, failed of ontbreekt, of generate_analysis_details false was, beschouw kern-detection als definitief.

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

Analysis results velden

  • analysis_results_status: pending | ready | skipped | failed | analyzing
  • analysis_results.agreement: strong | moderate | weak | disagreement
  • analysis_results.imageTags: korte beschrijvende tags
  • analysis_results.confidence: 0–100
  • analysis_results.keyIndicators: specifieke signalen
  • analysis_results.detailedReasoning: korte uitleg
  • analysis_results.visualPatterns: bredere patronen
  • analysis_results.recommendations: vervolgstappen

Bulk upload (ZIP)

Dien meerdere afbeeldingen in één request in door een ZIP te uploaden. Workflow als single-image: presign (ZIP-naam) → PUT ZIP → POST /bulk-upload → poll /query.

1. Pre-signed upload-URL (ZIP)

Gebruik get-presigned-url met een .zip-bestandsnaam (bijv. images.zip).

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

Voorbeeldrequest

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

2. Upload de ZIP

PUT de ZIP naar de presigned URL met 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'

ZIP-limieten

  • Maximum ZIP-grootte: 100MB
  • Maximum afbeeldingen per bulk: 50
  • Per afbeelding: minimaal 1KB, maximaal 10MB

Ondersteunde formaten in ZIP

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

PDF in de ZIP wordt niet ondersteund en wordt overgeslagen.

SVG-bestanden worden naar PNG geconverteerd vóór detection.

3. Dien ZIP in voor bulk detection

POST /bulk-upload met key en url naar het geüploade ZIP-pad.

Optionele parameters

  • generate_preview: true voor preview-URL's (standaard: false).
  • generate_analysis_details: true voor gedetailleerde analyse (standaard: false).
  • generate_heatmap_overlayed: Zelfde gedrag als /detect (overlay vs transparante RGBA heatmap).
  • generate_heatmap_normalized: Zelfde gedrag als /detect (standaard: true).
  • model: Model domain: generic, of instance_id/model-formaat.

Voorbeeldrequest

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"
}'

Voorbeeldresponse

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

Retourneert id, status pending en expected_count (aantal te analyseren afbeeldingen uit de ZIP).

Hoe bulk ZIP-resultaten updaten

  • Na submit: status pending tot verwerking start, daarna analyzing.
  • results bevat per afbeelding; pending entries hebben result en result_details null tot klaar.
  • Optionele heatmaps en analysedetails kunnen in result_details nog pending zijn.
  • Als elke afbeelding in results klaar is, wordt status done. Bij falen van de batch kan status failed zijn.
  • U kunt /query aanroepen voordat de ZIP klaar is voor gedeeltelijke resultaten.

4. Query bulk upload resultaten

Gebruik POST /query met het id van /bulk-upload. Zelfde endpoint als single-image; response-vorm hangt af van single image of ZIP-batch.

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"
}'

Voorbeeldresponse (nog bezig)

{
  "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": []
}

Responsevelden (bulk ZIP)

  • id — Bulk request-id.
  • status — pending, daarna analyzing, daarna done of failed.
  • results — Eén entry per afbeelding (id, status, result, result_details, filename, preview_url indien beschikbaar).
  • skipped — Bestanden niet geanalyseerd (type, grootte, enz.) met status failed en reden in result_details.

Billing: credits alleen voor succesvol geanalyseerde afbeeldingen. Mislukte SVG-conversies en overgeslagen bestanden worden niet gefactureerd.

Secure heatmap en preview assets

Als heatmap_url of preview_url in /query naar de API-host wijzen (niet direct object storage), download bytes met POST en uw key.

POST /heatmap/{id}

POST /preview/{id}

Request body JSON: { "key": "YOUR-API-KEY-GOES-HERE" }

Heatmap responses (controleer HTTP status en Content-Type)

  • 200 + binary (image/png, enz.) — Heatmap beschikbaar. X-Heatmap-Status kan gezet zijn.
  • 202 + JSON — heatmap_status pending; poll /query en probeer opnieuw.
  • 200 + JSON — Geen heatmap te serveren (optioneel, failed, enz.); geen serverfout.
  • 500 + JSON — heatmap_url bestaat maar bestand niet uit storage; later opnieuw.
  • 404 + JSON — Document-id niet gevonden.
  • 403 + JSON — API key bezit dit document niet.

Preview: POST /preview/{id} retourneert raw preview-bytes. 404 met JSON als geen preview (generate_preview false).

Voorbeelden

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

Intern: organization usage sync naar Stripe (job secret)

Alleen vertrouwde backend jobs, niet voor algemene API-klanten. Vereist header x-job-secret gelijk aan server JOB_SECRET. Synchroniseert gemeterde TruthScan organization usage naar Stripe voor een datumbereik.

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

Headers: x-job-secret: <JOB_SECRET>

Body JSON: start_date, end_date, optioneel idempotency_id voor Stripe meter idempotency.

Retourneert success, organization_id, total_documents, value_sent_to_stripe, report_date, message. 400 als org niet gemeterd of stripe_customer_id ontbreekt; 401 ongeldig secret; 404 org niet gevonden; 500 Stripe/config-fouten.

Check user credits

Dit endpoint accepteert de apikey van de gebruiker via de header en retourneert creditdetails.

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

Voorbeeldrequest

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'

Voorbeeldresponse

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

Voor externe integraties wordt alleen het veld credits gevuld.

Health check

Controleer de health status van de API-server.

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

Voorbeeldrequest

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

Voorbeeldresponse

{
    "status": "healthy"
}

Een "healthy" response betekent dat de service normaal draait.

Errors

De meeste fouten komen door onjuiste parameters. Controleer elke call en gebruik de voorbeelden.

De generieke error codes volgen de REST-standaard:

Error codeBetekenis
400Bad Request — uw request is ongeldig.
401Unauthorized — ongeldig job secret (internal usage endpoints) of vergelijkbare auth-fout.
403Forbidden — API key ongeldig, toegang geweigerd, of onvoldoende credits.
404Not Found — de resource bestaat niet.
405Method Not Allowed — verkeerde HTTP-methode voor deze resource.
406Not Acceptable — u vroeg een formaat dat geen JSON is.
410Gone — de resource op dit endpoint is verwijderd.
422Invalid Request Body — body onjuist geformatteerd, ongeldig of ontbrekende parameters.
429Too Many Requests — u overschreed de rate limit van uw API key (zie Rate limits). De body is {"error":"Too many requests"}; de header X-RateLimit-Retry-After geeft aan hoeveel seconden u moet wachten voor een retry.
500Internal Server Error — serverprobleem. Probeer later opnieuw.
503Service Unavailable — tijdelijk offline voor onderhoud. Probeer later opnieuw.

Veelvoorkomende problemen en oplossingen

Authentication-problemen

"User verification failed" (403)

Oorzaak: Ongeldige of verlopen API key

Oplossing:

  1. Controleer of uw API key correct is
  2. Controleer of uw API key actief is in uw account
  3. Genereer zo nodig een nieuwe API key

"Not enough credits" (403)

Oorzaak: Onvoldoende credits voor image processing

Oplossing:

  1. Controleer resterende credits via /check-user-credits
  2. Koop extra credits indien nodig

Input validation-problemen

"Input URL cannot be empty" (400)

Oorzaak: Lege of ongeldige URL

Oplossing:

  1. Zorg dat url niet leeg is
  2. Verwijder leading/trailing whitespace in namen
  3. Controleer URL-encoding

"Input email is empty" (400)

Oorzaak: Ontbrekende e-mail voor URL-verwerking

Oplossing:

  1. Geef een geldig e-mailadres bij URL-submits
  2. Controleer het e-mailformaat

"Unsupported image type" (400)

Oorzaak: Bestandsformaat niet ondersteund

Oplossing:

  1. Converteer naar een ondersteund formaat (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, GIF, SVG, PDF)
  2. Controleer de bestandsextensie

"File size is too small" (400)

Oorzaak: Bestand kleiner dan minimum

Oplossing:

  1. Gebruik een groter bestand (minimaal 1KB)
  2. Controleer of het bestand tijdens upload corrupt raakte

"File size exceeds limit" (400)

Oorzaak: Bestand te groot

Oplossing:

  1. Comprimeer of verklein; maximum staat per deployment (foutmelding vermeldt limiet in MB)
  2. Gebruik een ander formaat

"Invalid file type" (400)

Oorzaak: File type validation mislukt

Oplossing:

  1. Zorg dat het bestand een geldige image is
  2. Controleer of het bestand niet corrupt is
  3. MIME type moet bij extensie passen

Processing-problemen

Image status "failed"

Oorzaak: Verwerking mislukt om diverse redenen

Oplossing:

  1. Controleer of de URL een ondersteund formaat heeft
  2. Controleer of het bestand geldig en niet corrupt is
  3. Controleer de grootte-eisen
  4. Neem contact op met support als het aanhoudt

"User not found"

Oorzaak: Ongeldige user ID

Oplossing:

  1. Controleer de user ID
  2. Controleer of het account actief is
  3. Authenticeer opnieuw indien nodig

"File metadata could not be fetched" (500)

Oorzaak: Geen toegang tot geüpload bestand

Oplossing:

  1. Controleer of upload geslaagd is
  2. Controleer of de file URL bereikbaar is
  3. Upload opnieuw

Upload-problemen

"Image upload failed" (403/400)

Oorzaak: Ongeldige of verlopen pre-signed URL, of problemen met storage

Oplossing:

  1. Gebruik de pre-signed URL snel na ontvangst
  2. Controleer of Content-Type bij het formaat past
  3. Verwijder spaties uit de bestandsnaam vóór upload
  4. Genereer zo nodig een nieuwe pre-signed URL

"Invalid pre-signed URL" (400)

Oorzaak: Bestandsnaam met spaties of verlopen/corrupte pre-signed URL

Oplossing:

  1. Verwijder spaties vóór het aanvragen van een pre-signed URL
  2. Gebruik alfanumeriek, koppeltekens en underscores
  3. Genereer zo nodig een nieuwe pre-signed URL

Bulk upload-problemen

"URL must point to a ZIP file" (400)

Oorzaak: De URL voor /bulk-upload wijst niet naar een ZIP

Oplossing:

  1. Gebruik get-presigned-url?file_name=images.zip (of andere .zip-naam)
  2. Upload een geldige ZIP naar de presigned URL
  3. Zorg dat bulk-upload url naar die ZIP wijst

"ZIP file too large" (400)

Oorzaak: ZIP groter dan maximum (100MB)

Oplossing:

  1. Verminder aantal afbeeldingen of comprimeer
  2. Splits over meerdere bulk uploads

"Too many files" (400)

Oorzaak: ZIP bevat meer dan 50 geldige afbeeldingen

Oplossing:

  1. Maximaal 50 afbeeldingen per ZIP
  2. Splits over meerdere bulk uploads

"No valid images found in ZIP" (400)

Oorzaak: Alle bestanden overgeslagen (formaat, grootte, pad, enz.)

Oplossing:

  1. Gebruik ondersteunde formaten (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG)
  2. PDF wordt in bulk niet ondersteund
  3. Elke afbeelding minimaal 1KB en maximaal 10MB
  4. Vermijd hidden files (.) en path traversal (..)

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

Oorzaak: Het id hoort niet bij dit uploadtype (single image vs ZIP-batch)

Oplossing:

  1. Gebruik het id van /detect voor single-image
  2. Gebruik het id van /bulk-upload voor ZIP

Hulp nodig?

Voor meer informatie over onze API of technische support: neem contact met ons op.

API — veelgestelde vragen

Antwoorden op veelvoorkomende vragen over onze AI image detection API.