Documentazione API
ISO 27001SOC 2 CertifiedGDPR Compliant

API di rilevamento immagini IA

Documentazione completa per integrare l'API di rilevamento immagini IA TruthScan nelle vostre applicazioni.

Provate senza codice visitando il nostro endpoint FastAPI: https://detect-image.truthscan.com/docs

Autenticazione

TruthScan usa chiavi API. Ottenete la vostra chiave in cima alla pagina nel portale sviluppatori.

La chiave deve essere inclusa nel corpo JSON delle richieste (salvo endpoint solo intestazione, es. check-user-credits):

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

Sostituite YOUR API KEY GOES HERE con la vostra chiave personale.

Rilevatore immagini IA

Detect (processo in 3 passaggi)

Il flusso di rilevamento immagini IA comprende i passaggi seguenti:

  • Ottenere un URL di upload pre-firmato
  • Caricare l'immagine
  • Inviare l'immagine per il rilevamento

1. Ottenere un URL di upload pre-firmato

Richiedete all'API un URL pre-firmato. Consente di caricare in modo sicuro il file immagine sul server di storage.

Formati di file supportati

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

Nome file

Rimuovete gli spazi dal nome del file immagine quando richiedete l'URL pre-firmato.

Per i file PDF viene rilevata solo la prima immagine (flusso a file singolo).

Usate un nome file .zip su questo endpoint se intendete inviare uno ZIP tramite bulk upload.

Parametri di query

  • file_name (obbligatorio) — Nome file originale; il server può normalizzarlo (spazi e caratteri non sicuri vengono adeguati). Usate l'estensione .zip per il caricamento in blocco.
  • expiration (facoltativo) — Durata dell'URL pre-firmato in secondi (predefinito: 3600).
GET https://detect-image.truthscan.com/get-presigned-url?file_name=example.jpg

Esempio di richiesta

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

Esempio di risposta

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

document_id è un nuovo UUID generato per questa richiesta di upload (per correlazione/log). L'id usato per /detect o /bulk-upload viene assegnato quando inviate tali endpoint, salvo che passiate un id facoltativo su /detect.

2. Caricare l'immagine

Usate presigned_url per caricare l'immagine con una richiesta PUT. Impostate Content-Type in base al formato dell'immagine.

Nome file

Rimuovete gli spazi dal nome del file durante il caricamento.

Impostate Content-Type in modo che corrisponda esattamente all'estensione del file

  • 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

Errori comuni da evitare

  • Non usate image/jpg (non corretto). Usate image/jpeg.
  • Non abbinate male file e intestazione (es. file .png con image/jpeg).
  • Non cambiate l'estensione senza aggiornare l'intestazione (o viceversa).
  • Non includete spazi nei nomi file durante richiesta e caricamento.

Esempio di richiesta

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'

Esempi di caricamento aggiuntivi (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'

Limiti di dimensione file

  • Dimensione minima del file: 1 KB
  • Dimensione massima del file: 10 MB

Mantenete il formato del file coerente durante il caricamento. Un caricamento riuscito restituisce HTTP 200.

3. Inviare l'immagine per il rilevamento IA

Dopo il caricamento, inviate l'immagine per il rilevamento IA facendo riferimento a file_path del passaggio precedente. Per i PDF viene analizzata/rilevata solo la prima immagine.

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

Esempio di richiesta

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 indica il percorso restituito dal passaggio URL pre-firmato (es. uploads/...). Costruite l'URL completo con l'host di storage come nell'esempio.

Parametri facoltativi

  • id: Stringa UUID facoltativa. Se omessa, il server genera un nuovo document id. Se fornita, non deve già esistere; altrimenti l'API restituisce un errore.
  • generate_preview: Impostate su true per generare un URL di anteprima (predefinito: true). Impostate su false per saltare l'anteprima.
  • document_type: Tipo di documento (predefinito: Image).
  • email: Indirizzo email per l'elaborazione.
  • generate_analysis_details: Impostate su false per non generare l'analisi dettagliata (predefinito: true).
  • generate_heatmap_overlayed: Controlla come viene prodotta l'immagine heatmap quando viene generata una heatmap (predefinito: true). Con true, la heatmap è fusa sull'immagine originale (overlay standard). Con false, il servizio restituisce una heatmap trasparente: immagine RGBA con mappa di attivazione colorata JET e alpha dal modello, sfondo trasparente per compositing nell'interfaccia.
  • generate_heatmap_normalized: Con false, la generazione della heatmap salta il passaggio di normalizzazione della mappa di attivazione (predefinito: true). Usate insieme a generate_heatmap_overlayed per controllare l'aspetto.
  • model: Modello o hint di routing (predefinito: generic). Esempi supportati: generic, sheerid o instance_id/model (es. my-instance-id/generic) per inviare il job a una coda dedicata. Valori instance_id non validi → 400.
  • user_agent: Stringa facoltativa memorizzata con il documento per analytics/supporto.

Esempio di risposta

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

La risposta include un ID immagine univoco per tracciare lo stato del rilevamento.

Interrogare stato e risultati del rilevamento

Per verificare lo stato e ottenere i risultati usate l'endpoint /query con l'ID immagine.

Autenticazione: il corpo della richiesta contiene solo id; l'API non invia la chiave su questa chiamata. Chiunque conosca l'UUID può interrogare i risultati—trattate i document id come sensibili se dovete limitare chi vede i punteggi.

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

Esempio di richiesta

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

Esempio di risposta

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

Esempio di risposta (/query, URL sicuri abilitati per l'organizzazione)

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

Esempio di risposta quando l'analisi è pronta

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

Dettagli del risultato

  • is_valid: Indica se il file immagine è valido (true/false).
  • detection_step: Fase di completamento: 1 = solo metadati; 2 = metadati e ocr; 3 = metadati, ocr e ml_model.
  • final_result: Esito complessivo (es. "AI Generated", "Real", "Digitally Edited", "AI Edited").
  • confidence: Punteggio di confidenza del rilevamento.
  • metadata: Informazioni estratte dai metadati con ExifTool e Pillow.
  • metadata_basic_source: Può indicare se l'immagine proviene da una fotocamera mobile, da uno strumento IA o da software di fotoritocco.
  • ocr: Risultato rilevamento watermark sotto il nome storico ocr. Array a due elementi [label, score]: label è una classe watermark (es. "Gemini") o "OCR did not detect AI"; score su scala 0–100 (o 0 se incerto). Riassunto in warnings se presente una label.
  • ml_model: Risultati del modello di machine learning.
  • warnings: Array facoltativo di avvisi eterogenei (tipo blur_dark, watermark, screen_recapture, ecc.). Può essere vuoto o assente.
  • preview_url: URL anteprima se generate_preview era true. Può essere storage diretto o, con URL sicuri, un path API tipo https://<api-host>/preview/<document_id>.
  • heatmap_status: pending, ready o failed. La generazione della heatmap è asincrona.
  • heatmap_url: Heatmap quando heatmap_status è ready. L'aspetto dipende da generate_heatmap_overlayed. Può essere storage o path API https://<api-host>/heatmap/<document_id> (usate POST /heatmap/{id} con chiave se sicuro).
  • analysis_results_status: pending, ready, skipped, failed o analyzing. Omesso o null se generate_analysis_details era false.
  • analysis_results: Analisi narrativa dettagliata se abilitata; vedi sotto Spiegazione risultato analisi.

Spiegazione del risultato di analisi

Quando analysis_results è pronto, include in genere: agreement (strong | moderate | weak | disagreement), imageTags (fino a cinque tag brevi), confidence (0–100), keyIndicators, detailedReasoning, visualPatterns e recommendations.

Note

  • La heatmap è asincrona. Interrogate /query per heatmap_status e heatmap_url.
  • L'analisi dettagliata è asincrona salvo generate_analysis_details=false. Interrogate per analysis_results_status e analysis_results.
  • URL sicuri: se abilitati, heatmap_url e preview_url possono usare l'host API; scaricate con POST /heatmap/{id} e POST /preview/{id} con la chiave (vedi Asset heatmap e anteprima sicuri).
  • Ripetete /query dopo il punteggio principale per recuperare heatmap e analysis_results al termine.

Heatmap e comportamento overlay

Il file in heatmap_url riflette generate_heatmap_overlayed e generate_heatmap_normalized dalla richiesta /detect (o /bulk-upload): overlay predefinito (true) è un'immagine normale con heatmap sovrapposta; false è tipicamente PNG trasparente per compositing.

Esempio: risultato ~90,24 con final_result AI Generated e detection_step 3 significa pipeline completa: metadati, OCR e modello ML.

Risultati analisi (analisi approfondita asincrona)

Con generate_analysis_details true in /detect, l'analisi dettagliata può completarsi dopo il punteggio principale. Interrogate /query finché analysis_results_status non è ready (o skipped/failed).

1. Il risultato iniziale può essere pronto prima dell'analisi

Il rilevamento principale (result, final_result, confidence) può essere disponibile mentre analysis_results_status è ancora 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
    }
}

Cosa fare

Usate subito i campi principali; continuate a interrogare se servono analysis_results.

2. Continuate a interrogare

Chiamate /query con lo stesso id finché analysis_results_status non cambia da 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. Analisi completata

Quando analysis_results_status è ready, analysis_results include agreement, imageTags, confidence, keyIndicators, detailedReasoning, visualPatterns e 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/..."
}

Quando l'analisi non è disponibile

Se analysis_results_status è skipped, failed o assente, o generate_analysis_details era false, considerate definitivo il rilevamento principale.

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

Campi dei risultati di analisi

  • analysis_results_status: pending | ready | skipped | failed | analyzing
  • analysis_results.agreement: strong | moderate | weak | disagreement
  • analysis_results.imageTags: tag descrittivi brevi
  • analysis_results.confidence: 0–100
  • analysis_results.keyIndicators: indicatori specifici
  • analysis_results.detailedReasoning: breve spiegazione
  • analysis_results.visualPatterns: pattern più ampi
  • analysis_results.recommendations: passi successivi

Caricamento in blocco (ZIP)

Inviate più immagini in una richiesta caricando uno ZIP. Il flusso replica il singolo file: presign (nome .zip) → PUT ZIP → POST /bulk-upload → interroga /query.

1. Ottenere un URL di upload pre-firmato (ZIP)

Usate get-presigned-url con un nome file .zip (es. images.zip).

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

Esempio di richiesta

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

2. Caricare lo ZIP

PUT dello ZIP sull'URL pre-firmato con 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'

Limiti ZIP

  • Dimensione massima ZIP: 100 MB
  • Massimo immagini per blocco: 50
  • Per immagine: minimo 1 KB, massimo 10 MB

Formati supportati nello ZIP

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

I PDF nello ZIP non sono supportati e vengono saltati.

Gli SVG vengono convertiti in PNG prima del rilevamento.

3. Inviare lo ZIP per il rilevamento in blocco

POST /bulk-upload con key e url che puntano al percorso ZIP caricato.

Parametri facoltativi

  • generate_preview: true per generare URL di anteprima (predefinito: false).
  • generate_analysis_details: true per analisi dettagliata (predefinito: false).
  • generate_heatmap_overlayed: Stesso comportamento di /detect (overlay vs heatmap RGBA trasparente).
  • generate_heatmap_normalized: Stesso comportamento di /detect (predefinito: true).
  • model: Dominio modello: generic, sheerid o formato instance_id/model.

Esempio di richiesta

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

Esempio di risposta

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

Restituisce id, status pending ed expected_count (quante immagini dallo ZIP verranno analizzate).

Aggiornamento risultati ZIP in blocco

  • Dopo l'invio lo status è pending finché non inizia l'elaborazione, poi analyzing.
  • results elenca ogni immagine; le voci pending hanno result e result_details null fino al completamento.
  • Heatmap e analisi possono essere ancora pending in result_details fino al completamento.
  • Quando ogni immagine in results è terminata, lo status complessivo diventa done. In caso di errore di batch può essere failed.
  • Potete chiamare /query prima che lo ZIP finisca per vedere risultati parziali.

4. Interrogare i risultati del caricamento in blocco

POST /query con l'id restituito da /bulk-upload. Stesso endpoint del singolo file; la forma della risposta dipende se l'id è immagine singola o batch 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"
}'

Esempio di risposta (ancora in elaborazione)

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

Campi risposta (ZIP in blocco)

  • id — ID richiesta in blocco.
  • status — pending, poi analyzing, poi done o failed.
  • results — Una voce per immagine (id, status, result, result_details, filename, preview_url se disponibile).
  • skipped — File non analizzati (tipo non supportato, dimensione, ecc.) con status failed e motivo in result_details.

Fatturazione: i crediti si applicano solo alle immagini analizzate con successo. Conversioni SVG fallite e file saltati non sono addebitati.

Asset heatmap e anteprima sicuri

Quando heatmap_url o preview_url in /query puntano all'host API (non allo storage oggetti), scaricate i byte con POST e la chiave.

POST /heatmap/{id}

POST /preview/{id}

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

Risposte heatmap (verificate stato HTTP e Content-Type)

  • 200 + binario (image/png, ecc.) — File heatmap disponibile. X-Heatmap-Status può essere impostato.
  • 202 + JSON — heatmap_status pending; interrogate /query e riprovate.
  • 200 + JSON — Nessuna heatmap da servire (funzione facoltativa, errore, ecc.); non è un errore server.
  • 500 + JSON — heatmap_url memorizzato ma file non scaricabile dallo storage; riprovate più tardi.
  • 404 + JSON — Document id non trovato.
  • 403 + JSON — La chiave API non possiede questo documento.

Anteprima: POST /preview/{id} restituisce i byte grezzi. 404 con JSON se non è stata generata l'anteprima (generate_preview false).

Esempi

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

Interno: sincronizzazione utilizzo organizzazione verso Stripe (segreto job)

Solo job backend attendibili, non clienti API generici. Richiede intestazione x-job-secret uguale a JOB_SECRET sul server. Sincronizza l'utilizzo metered TruthScan dell'organizzazione con Stripe per un intervallo di date.

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

Headers: x-job-secret: <JOB_SECRET>

Corpo JSON: start_date, end_date, idempotency_id facoltativo per idempotenza meter Stripe.

Restituisce success, organization_id, total_documents, value_sent_to_stripe, report_date, message. 400 se org non metered o manca stripe_customer_id; 401 segreto non valido; 404 org non trovata; 500 errori Stripe/config.

Verifica crediti utente

Questo endpoint accetta l'apikey dell'utente tramite intestazione e restituisce i dettagli dei crediti.

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

Esempio di richiesta

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'

Esempio di risposta

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

Per integrazioni esterne sarà popolato solo il campo credits.

Health check

Verificate lo stato di salute del server API.

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

Esempio di richiesta

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

Esempio di risposta

{
    "status": "healthy"
}

Una risposta "healthy" indica che il servizio funziona normalmente.

Errori

La maggior parte degli errori deriva da parametri errati. Verificate ogni chiamata e usate gli esempi forniti.

I codici di errore generici seguono lo standard REST:

Codice erroreSignificato
400Bad Request — Richiesta non valida.
401Unauthorized — Segreto job non valido (endpoint interni) o altro fallimento di autenticazione.
403Forbidden — Chiave API non valida, accesso negato o crediti insufficienti.
404Not Found — La risorsa specificata non esiste.
405Method Not Allowed — Metodo HTTP non consentito per la risorsa.
406Not Acceptable — È stato richiesto un formato diverso da JSON.
410Gone — La risorsa a questo endpoint è stata rimossa.
422Invalid Request Body — Corpo della richiesta errato, non valido o incompleto.
429Too Many Requests — Troppe richieste. Riducete la frequenza.
500Internal Server Error — Problema sul server. Riprovate più tardi.
503Service Unavailable — Servizio temporaneamente non disponibile per manutenzione.

Problemi comuni e soluzioni

Problemi di autenticazione

"User verification failed" (403)

Causa: Chiave API non valida o scaduta

Soluzione:

  1. Verificate che la chiave API sia corretta
  2. Controllate che la chiave sia attiva nell'account
  3. Provate a rigenerare la chiave API

"Not enough credits" (403)

Causa: Crediti insufficienti per l'elaborazione

Soluzione:

  1. Controllate i crediti residui con /check-user-credits
  2. Acquistate crediti aggiuntivi se necessario

Problemi di validazione dell'input

"Input URL cannot be empty" (400)

Causa: URL vuoto o non valido

Soluzione:

  1. Assicuratevi che url non sia vuoto
  2. Rimuovete spazi iniziali/finali nei nomi file
  3. Verificate la codifica dell'URL

"Input email is empty" (400)

Causa: Email mancante per l'elaborazione da URL

Soluzione:

  1. Fornite un indirizzo email valido quando inviate URL
  2. Verificate il formato dell'email

"Unsupported image type" (400)

Causa: Formato file non supportato

Soluzione:

  1. Convertite in un formato supportato (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, GIF, SVG, PDF)
  2. Verificate l'estensione del file

"File size is too small" (400)

Causa: File al di sotto della dimensione minima

Soluzione:

  1. Usate un file più grande (minimo 1 KB)
  2. Verificate che il file non sia corrotto durante il caricamento

"File size exceeds limit" (400)

Causa: File troppo grande

Soluzione:

  1. Comprimete o ridimensionate; il limite massimo dipende dal deployment (il messaggio di errore indica il limite in MB)
  2. Provate un altro formato

"Invalid file type" (400)

Causa: Validazione del tipo di file fallita

Soluzione:

  1. Assicuratevi che sia un formato immagine valido
  2. Verificate che il file non sia corrotto
  3. MIME type ed estensione devono corrispondere

Problemi di elaborazione

Stato immagine "failed"

Causa: Elaborazione non riuscita per vari motivi

Soluzione:

  1. Verificate che l'URL sia in un formato supportato
  2. Controllate che il file sia valido e non corrotto
  3. Rispettate i requisiti di dimensione
  4. Contattate il supporto se il problema persiste

"User not found"

Causa: ID utente non valido

Soluzione:

  1. Verificate l'ID utente
  2. Assicuratevi che l'account sia attivo
  3. Ripetete l'autenticazione se necessario

"File metadata could not be fetched" (500)

Causa: Impossibile accedere al file caricato

Soluzione:

  1. Verificate che il caricamento sia andato a buon fine
  2. Controllate che l'URL del file sia raggiungibile
  3. Riprovate il caricamento

Problemi di caricamento

"Image upload failed" (403/400)

Causa: URL pre-firmato non valido o scaduto, oppure problemi sullo storage

Soluzione:

  1. Usate l'URL pre-firmato subito dopo averlo ricevuto
  2. Verificate che Content-Type corrisponda al formato
  3. Rimuovete gli spazi dal nome file prima del caricamento
  4. Generate un nuovo URL pre-firmato se necessario

"Invalid pre-signed URL" (400)

Causa: Nome file con spazi o URL pre-firmato scaduto/non valido

Soluzione:

  1. Rimuovete gli spazi dal nome file prima di richiedere l'URL pre-firmato
  2. Usate caratteri alfanumerici, trattini e underscore
  3. Generate un nuovo URL pre-firmato se necessario

Problemi di caricamento in blocco

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

Causa: L'URL fornito a /bulk-upload non punta a un file ZIP

Soluzione:

  1. Usate get-presigned-url?file_name=images.zip (o altro nome .zip)
  2. Caricate uno ZIP valido sull'URL pre-firmato
  3. Assicuratevi che url in bulk-upload punti a quello ZIP

"ZIP file too large" (400)

Causa: ZIP oltre la dimensione massima (100 MB)

Soluzione:

  1. Riducete il numero di immagini o comprimetele
  2. Suddividete in più caricamenti in blocco

"Too many files" (400)

Causa: Lo ZIP contiene più di 50 immagini valide

Soluzione:

  1. Portate a 50 o meno immagini per ZIP
  2. Suddividete in più caricamenti in blocco

"No valid images found in ZIP" (400)

Causa: Tutti i file nello ZIP sono stati saltati (formato non supportato, troppo piccoli, percorso non valido, ecc.)

Soluzione:

  1. Usate formati supportati (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG)
  2. Il PDF non è supportato in blocco
  3. Ogni immagine: minimo 1 KB, massimo 10 MB
  4. Evitate file nascosti (nomi che iniziano con .) e path traversal (..)

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

Causa: L'id non corrisponde a quel tipo di upload (immagine singola vs batch ZIP)

Soluzione:

  1. Usate l'id da /detect per invii a immagine singola
  2. Usate l'id da /bulk-upload per invii ZIP

Serve aiuto?

Per maggiori informazioni sull'API o supporto tecnico, contattateci.

Domande frequenti sull'API

Risposte alle domande più comuni sull'API di rilevamento immagini IA.