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:
| Endpoint | Type | Weight |
|---|---|---|
| POST /detect | Schrijven | 1 |
| POST /bulk-upload | Schrijven | 1 |
| GET /get-presigned-url | Lezen | 0.2 |
| GET /check-user-credits | Lezen | 0.2 |
| POST /heatmap/{id} | Lezen | 0.2 |
| POST /preview/{id} | Lezen | 0.2 |
| POST /query | Lezen | Niet beperkt |
| GET /health | Lezen | Niet 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.jpgVoorbeeldrequest
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/detectVoorbeeldrequest
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/queryVoorbeeldrequest
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.zipVoorbeeldrequest
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.pngcurl -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.pngIntern: 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-creditsVoorbeeldrequest
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/healthVoorbeeldrequest
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 code | Betekenis |
|---|---|
| 400 | Bad Request — uw request is ongeldig. |
| 401 | Unauthorized — ongeldig job secret (internal usage endpoints) of vergelijkbare auth-fout. |
| 403 | Forbidden — API key ongeldig, toegang geweigerd, of onvoldoende credits. |
| 404 | Not Found — de resource bestaat niet. |
| 405 | Method Not Allowed — verkeerde HTTP-methode voor deze resource. |
| 406 | Not Acceptable — u vroeg een formaat dat geen JSON is. |
| 410 | Gone — de resource op dit endpoint is verwijderd. |
| 422 | Invalid Request Body — body onjuist geformatteerd, ongeldig of ontbrekende parameters. |
| 429 | Too 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. |
| 500 | Internal Server Error — serverprobleem. Probeer later opnieuw. |
| 503 | Service 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:
- Controleer of uw API key correct is
- Controleer of uw API key actief is in uw account
- Genereer zo nodig een nieuwe API key
"Not enough credits" (403)
Oorzaak: Onvoldoende credits voor image processing
Oplossing:
- Controleer resterende credits via /check-user-credits
- Koop extra credits indien nodig
Input validation-problemen
"Input URL cannot be empty" (400)
Oorzaak: Lege of ongeldige URL
Oplossing:
- Zorg dat url niet leeg is
- Verwijder leading/trailing whitespace in namen
- Controleer URL-encoding
"Input email is empty" (400)
Oorzaak: Ontbrekende e-mail voor URL-verwerking
Oplossing:
- Geef een geldig e-mailadres bij URL-submits
- Controleer het e-mailformaat
"Unsupported image type" (400)
Oorzaak: Bestandsformaat niet ondersteund
Oplossing:
- Converteer naar een ondersteund formaat (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, GIF, SVG, PDF)
- Controleer de bestandsextensie
"File size is too small" (400)
Oorzaak: Bestand kleiner dan minimum
Oplossing:
- Gebruik een groter bestand (minimaal 1KB)
- Controleer of het bestand tijdens upload corrupt raakte
"File size exceeds limit" (400)
Oorzaak: Bestand te groot
Oplossing:
- Comprimeer of verklein; maximum staat per deployment (foutmelding vermeldt limiet in MB)
- Gebruik een ander formaat
"Invalid file type" (400)
Oorzaak: File type validation mislukt
Oplossing:
- Zorg dat het bestand een geldige image is
- Controleer of het bestand niet corrupt is
- MIME type moet bij extensie passen
Processing-problemen
Image status "failed"
Oorzaak: Verwerking mislukt om diverse redenen
Oplossing:
- Controleer of de URL een ondersteund formaat heeft
- Controleer of het bestand geldig en niet corrupt is
- Controleer de grootte-eisen
- Neem contact op met support als het aanhoudt
"User not found"
Oorzaak: Ongeldige user ID
Oplossing:
- Controleer de user ID
- Controleer of het account actief is
- Authenticeer opnieuw indien nodig
"File metadata could not be fetched" (500)
Oorzaak: Geen toegang tot geüpload bestand
Oplossing:
- Controleer of upload geslaagd is
- Controleer of de file URL bereikbaar is
- Upload opnieuw
Upload-problemen
"Image upload failed" (403/400)
Oorzaak: Ongeldige of verlopen pre-signed URL, of problemen met storage
Oplossing:
- Gebruik de pre-signed URL snel na ontvangst
- Controleer of Content-Type bij het formaat past
- Verwijder spaties uit de bestandsnaam vóór upload
- Genereer zo nodig een nieuwe pre-signed URL
"Invalid pre-signed URL" (400)
Oorzaak: Bestandsnaam met spaties of verlopen/corrupte pre-signed URL
Oplossing:
- Verwijder spaties vóór het aanvragen van een pre-signed URL
- Gebruik alfanumeriek, koppeltekens en underscores
- 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:
- Gebruik get-presigned-url?file_name=images.zip (of andere .zip-naam)
- Upload een geldige ZIP naar de presigned URL
- Zorg dat bulk-upload url naar die ZIP wijst
"ZIP file too large" (400)
Oorzaak: ZIP groter dan maximum (100MB)
Oplossing:
- Verminder aantal afbeeldingen of comprimeer
- Splits over meerdere bulk uploads
"Too many files" (400)
Oorzaak: ZIP bevat meer dan 50 geldige afbeeldingen
Oplossing:
- Maximaal 50 afbeeldingen per ZIP
- Splits over meerdere bulk uploads
"No valid images found in ZIP" (400)
Oorzaak: Alle bestanden overgeslagen (formaat, grootte, pad, enz.)
Oplossing:
- Gebruik ondersteunde formaten (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG)
- PDF wordt in bulk niet ondersteund
- Elke afbeelding minimaal 1KB en maximaal 10MB
- 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:
- Gebruik het id van /detect voor single-image
- 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.