API Dokümantasyonu
ISO 27001SOC 2 CertifiedGDPR Compliant

AI Image Detection API

TruthScan AI image detection API'sini uygulamalarınıza entegre etmek için eksiksiz dokümantasyon.

Kod yazmadan denemek için FastAPI endpoint'imize gidin: https://detect-image.truthscan.com/docs

Authentication

TruthScan API'ye erişim için API key kullanır. API key'inizi developer portalında sayfanın üst kısmından.

API key, sunucuya giden isteklerde aşağıdaki gibi JSON body içinde olmalıdır (endpoint yalnızca header auth belirtiyorsa, örn. check-user-credits, istisna):

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

YOUR API KEY GOES HERE ifadesini kişisel API key'inizle değiştirmelisiniz.

AI Image Detector

Detect (3 adımlı süreç)

AI Image Detection akışı şu adımlardan oluşur:

  • Pre-signed Upload URL alın
  • Görüntüyü yükleyin
  • Görüntüyü detection için gönderin

1. Pre-signed Upload URL alın

Önce API'den pre-signed URL isteyin. Bu URL, görüntü dosyanızı depolama sunucusuna güvenli şekilde yüklemenizi sağlar.

Desteklenen dosya formatları

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

Dosya adı

Pre-signed URL isterken görüntü dosya adındaki boşlukları kaldırın.

PDF dosyalarında yalnızca ilk görüntü detection için kullanılır (tek dosya akışı).

ZIP'i bulk upload ile gönderecekseniz bu endpoint'te .zip dosya adı kullanın.

Query parameters

  • file_name (zorunlu) — Orijinal dosya adı; sunucu normalize edebilir (boşluk ve güvensiz karakterler düzeltilir). Bulk upload için .zip uzantısı kullanın.
  • expiration (isteğe bağlı) — Pre-signed URL ömrü saniye cinsinden (varsayılan: 3600).
GET https://detect-image.truthscan.com/get-presigned-url?file_name=example.jpg

Örnek istek

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

Örnek yanıt

{
  "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 bu yükleme isteği için yeni üretilen bir UUID'dir (korelasyon/loglama). /detect veya /bulk-upload için kullanacağınız id, bu endpoint'lere gönderdiğinizde atanır; /detect'e isteğe bağlı id vermezseniz sunucu atar.

2. Görüntüyü yükleyin

Verilen presigned_url ile görüntünüzü PUT isteğiyle yükleyin. Görüntü formatınıza uygun Content-Type'ı doğru ayarlayın.

Dosya adı

Yükleme sırasında görüntü dosya adındaki boşlukları kaldırın.

Content-Type'ı dosya uzantınızla birebir eşleştirin

  • 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

Sık yapılan hatalar

  • image/jpg kullanmayın (yanlış). image/jpeg kullanın.
  • Dosya ile header'ı eşleştirmeyin (ör. .png dosya + image/jpeg).
  • Uzantıyı değiştirip header'ı güncellemeyin (veya tersi).
  • İstek/yükleme sırasında dosya adında boşluk bırakmayın.

Örnek istek

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'

Ek yükleme örnekleri (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'

Dosya boyutu limitleri

  • Minimum dosya boyutu: 1KB
  • Maksimum dosya boyutu: 10MB

Yükleme boyunca dosya formatının tutarlı kalmasını sağlayın. Başarılı yükleme HTTP 200 döner.

3. AI detection için görüntüyü gönderin

Yüklemeden sonra, önceki adımdaki file_path ile görüntüyü AI detection için gönderin. PDF yüklemelerinde yalnızca ilk görüntü analiz/detection edilir.

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

Örnek istek

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, pre-signed URL adımında dönen yoldur (ör. uploads/...). Örnekte gösterildiği gibi storage host'unuzla tam URL'yi oluşturun.

İsteğe bağlı parametreler

  • id: İsteğe bağlı UUID string. Verilmezse sunucu yeni document id üretir. Verilirse daha önce var olmamalıdır; aksi halde API hata döner.
  • generate_preview: true ise görüntü için preview URL üretilir (varsayılan: true). false ise preview atlanır.
  • document_type: Belge türü (varsayılan: Image).
  • email: İşleme için e-posta adresi.
  • generate_analysis_details: false ise ayrıntılı analiz üretilmez (varsayılan: true).
  • generate_heatmap_overlayed: Heatmap üretildiğinde görüntünün nasıl oluşturulacağını belirler (varsayılan: true). true iken heatmap orijinal görüntü üzerine blend edilir (standart overlay). false iken servis şeffaf heatmap döner: modelden gelen alpha ile JET renkli aktivasyon haritası olan RGBA; arka plan şeffaf, UI'da composite edebilirsiniz.
  • generate_heatmap_normalized: false iken aktivasyon haritası için kullanılan normalizasyon adımı atlanır (varsayılan: true). Heatmap görünümünü generate_heatmap_overlayed ile birlikte kontrol edin.
  • model: Model veya routing ipucu (varsayılan: generic). Örnekler: generic, sheerid veya instance_id/model (ör. my-instance-id/generic) ile işi o instance için ayrılmış kuyruğa gönderir. Geçersiz instance_id 400 ile reddedilir.
  • user_agent: Belgeyle birlikte saklanan isteğe bağlı string (analitik/destek).

Örnek yanıt

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

Yanıtta detection durumunu takip etmek için benzersiz image ID bulunur.

Detection durumu ve sonuçları sorgulama

Durumu kontrol etmek ve sonuçları almak için image ID ile /query endpoint'ini kullanın.

Authentication: İstek gövdesinde yalnızca id vardır; bu çağrıda API key gönderilmez. UUID'yi bilen herkes sonuçları poll edebilir — skorları kısıtlamak istiyorsanız document ID'leri hassas kabul edin.

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

Örnek istek

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

Örnek yanıt

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

Örnek yanıt (/query, kuruluşta secure URL'ler açık)

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

Analiz sonuçları hazır olduğunda örnek yanıt

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

Sonuç alanları

  • is_valid: Görüntü dosyasının geçerli olup olmadığı (true/false).
  • detection_step: Detection'ın tamamlandığı aşama: 1 = yalnızca metadata; 2 = metadata ve ocr; 3 = metadata, ocr ve ml_model.
  • final_result: Genel sonuç (ör. "AI Generated", "Real", "Digitally Edited", "AI Edited").
  • confidence: Detection güven skoru.
  • metadata: ExifTool ve Pillow ile görüntü metadata'sından çıkarılan bilgiler.
  • metadata_basic_source: Görüntünün belirli bir mobil kamera modeliyle mi çekildiği, AI aracıyla mı üretildiği veya fotoğraf düzenleme yazılımıyla mı değiştirildiği gibi ipuçları verebilir.
  • ocr: Tarihsel alan adı ocr altında watermark detection sonucu. İki elemanlı dizi [label, score]: label tespit edilen watermark sınıfı (ör. "Gemini") veya "OCR did not detect AI"; score 0–100 ölçeğinde (veya emin değilse 0). Etiket varsa warnings içinde özetlenir.
  • ml_model: Makine öğrenmesi modelinden gelen sonuçlar.
  • warnings: İsteğe bağlı, heterojen uyarı nesneleri dizisi (blur_dark, watermark, screen_recapture vb.). Boş veya yok olabilir.
  • preview_url: generate_preview true ise önizleme URL'i. Doğrudan storage veya secure URL'lerde https://<api-host>/preview/<document_id> gibi API yolu olabilir.
  • heatmap_status: pending, ready veya failed. Heatmap üretimi asenkron.
  • heatmap_url: heatmap_status ready olduğunda heatmap. Görünüm generate_heatmap_overlayed'a bağlıdır. Doğrudan storage veya https://<api-host>/heatmap/<document_id> API yolu (secure ise POST /heatmap/{id} ile key kullanın).
  • analysis_results_status: pending, ready, skipped, failed veya analyzing. generate_analysis_details false ise null veya yok.
  • analysis_results: Açıksa ayrıntılı anlatımsal analiz; aşağıdaki Analysis Result Explanation'a bakın.

Analysis result açıklaması

analysis_results hazır olduğunda tipik olarak şunları içerir: agreement (strong | moderate | weak | disagreement), imageTags (en fazla beş kısa etiket), confidence (0–100), keyIndicators, detailedReasoning, visualPatterns ve recommendations.

Notlar

  • Heatmap üretimi asenkron. heatmap_status ve heatmap_url için /query ile poll edin.
  • Ayrıntılı analiz generate_analysis_details=false değilse asenkron. analysis_results_status ve analysis_results için poll edin.
  • Secure URL: Açıksa heatmap_url ve preview_url API host kullanabilir; key ile POST /heatmap/{id} ve POST /preview/{id} ile çekin (Secure heatmap ve preview assets).
  • Ana skor hazır olduktan sonra heatmap ve analysis_results bitince almak için /query'yi tekrarlayın.

Heatmap ve overlay davranışı

heatmap_url'deki dosya /detect (veya /bulk-upload) isteğinizdeki generate_heatmap_overlayed ve generate_heatmap_normalized yansıtır: varsayılan overlay (true) normal görüntü üzerine heatmap; false genelde composite için şeffaf PNG.

Örnek: result ~90.24, final_result AI Generated ve detection_step 3 ise tam pipeline metadata, OCR ve ML model tamamlanmıştır.

Analysis results (asenkron derin analiz)

/detect'te generate_analysis_details true ise ayrıntılı analiz ana skordan sonra tamamlanabilir. analysis_results_status ready (veya skipped/failed) olana kadar /query ile poll edin.

1. İlk sonuç analizden önce hazır olabilir

Çekirdek detection (result, final_result, confidence), analysis_results_status hâlâ pending iken hazır olabilir.

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

Ne yapmalı

Çekirdek alanları hemen kullanın; analysis_results gerekiyorsa poll etmeye devam edin.

2. Poll etmeye devam

analysis_results_status pending'den çıkana kadar aynı id ile /query çağırın.

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. Analiz tamam

analysis_results_status ready olduğunda analysis_results agreement, imageTags, confidence, keyIndicators, detailedReasoning, visualPatterns ve recommendations içerir.

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

Analiz yoksa

analysis_results_status skipped, failed veya yoksa veya generate_analysis_details false ise çekirdek detection'ı nihai kabul edin.

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

Analysis results alanları

  • analysis_results_status: pending | ready | skipped | failed | analyzing
  • analysis_results.agreement: strong | moderate | weak | disagreement
  • analysis_results.imageTags: kısa açıklayıcı etiketler
  • analysis_results.confidence: 0–100
  • analysis_results.keyIndicators: somut ipuçları
  • analysis_results.detailedReasoning: kısa açıklama
  • analysis_results.visualPatterns: daha geniş örüntüler
  • analysis_results.recommendations: sonraki adımlar

Bulk upload (ZIP)

ZIP yükleyerek tek istekte birden fazla görüntü gönderin. Akış tek görüntüyle aynı: presign (ZIP adı) → PUT ZIP → POST /bulk-upload → /query poll.

1. Pre-signed upload URL (ZIP)

get-presigned-url ile .zip dosya adı kullanın (ör. images.zip).

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

Örnek istek

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

2. ZIP'i yükleyin

ZIP'i presigned URL'e Content-Type: application/zip ile PUT edin.

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

ZIP limitleri

  • Maksimum ZIP boyutu: 100MB
  • Bulk başına en fazla 50 görüntü
  • Görüntü başına: minimum 1KB, maksimum 10MB

ZIP içinde desteklenen formatlar

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

ZIP içindeki PDF desteklenmez, atlanır.

SVG dosyaları detection öncesi PNG'ye dönüştürülür.

3. ZIP'i bulk detection için gönderin

POST /bulk-upload ile key ve yüklenen ZIP yolunu gösteren url.

İsteğe bağlı parametreler

  • generate_preview: true ise görüntüler için preview URL (varsayılan: false).
  • generate_analysis_details: true ise ayrıntılı analiz (varsayılan: false).
  • generate_heatmap_overlayed: /detect ile aynı (overlay veya şeffaf RGBA heatmap).
  • generate_heatmap_normalized: /detect ile aynı (varsayılan: true).
  • model: Model alanı: generic, sheerid veya instance_id/model formatı.

Örnek istek

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

Örnek yanıt

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

id, status pending ve ZIP'ten analiz edilecek görüntü sayısı expected_count döner.

Bulk ZIP sonuçlarının güncellenmesi

  • Gönderimden sonra işlem başlayana kadar status pending, sonra analyzing.
  • results her görüntü için listelenir; bitene kadar result ve result_details null olabilir.
  • İsteğe bağlı heatmap ve analiz ayrıntıları result_details içinde hazır olana kadar pending olabilir.
  • results'taki tüm görüntüler bittiğinde genel status done olur; batch tamamlanamazsa failed olabilir.
  • ZIP bitmeden önce kısmi sonuç için /query çağrılabilir.

4. Bulk upload sonuçlarını sorgulama

/bulk-upload'tan dönen id ile POST /query kullanın. Tek görüntü ile aynı endpoint; yanıt şekli id'nin tek görüntü mü ZIP batch mi olduğuna göre değişir.

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

Örnek yanıt (hâlâ işleniyor)

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

Yanıt alanları (bulk ZIP)

  • id — Bulk istek id.
  • status — önce pending, sonra analyzing, ardından done veya failed.
  • results — Analiz edilen her görüntü için giriş (id, status, result, result_details, filename, varsa preview_url).
  • skipped — Analiz edilmeyen dosyalar (desteklenmeyen tür, boyut vb.); status failed ve sebep result_details'ta.

Faturalandırma: Kredi yalnızca başarıyla analiz edilen görüntüler için kullanılır. Başarısız SVG dönüşümleri ve atlanan dosyalar faturalanmaz.

Secure heatmap ve preview asset'leri

/query'de heatmap_url veya preview_url API host'u gösteriyorsa (doğrudan object storage değil), baytları POST ve key ile indirin.

POST /heatmap/{id}

POST /preview/{id}

İstek gövdesi JSON: { "key": "YOUR-API-KEY-GOES-HERE" }

Heatmap yanıtları (HTTP status ve Content-Type kontrol edin)

  • 200 + binary (image/png vb.) — Heatmap dosyası hazır. X-Heatmap-Status set edilmiş olabilir.
  • 202 + JSON — heatmap_status pending; /query ile poll edip tekrar deneyin.
  • 200 + JSON — Sunulacak heatmap yok (isteğe bağlı özellik, failed vb.); sunucu hatası değil.
  • 500 + JSON — Kayıtlı heatmap_url var ancak storage'dan indirilemedi; sonra tekrar deneyin.
  • 404 + JSON — Document id bulunamadı.
  • 403 + JSON — API key bu belgeye ait değil.

Preview: POST /preview/{id} ham preview baytları döner. Önizleme yoksa (generate_preview false) 404 + JSON.

Örnekler

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

Internal: kuruluş kullanımını Stripe ile senkron (job secret)

Yalnızca güvenilir backend job'ları; genel API müşterileri için değil. x-job-secret header'ı sunucu JOB_SECRET ile eşleşmelidir. Belirli tarih aralığı için metered TruthScan kuruluş kullanımını Stripe'a senkronlar.

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

Headers: x-job-secret: <JOB_SECRET>

Body JSON: start_date, end_date, isteğe bağlı Stripe meter idempotency için idempotency_id.

success, organization_id, total_documents, value_sent_to_stripe, report_date, message döner. Org metered değil veya gerekirken stripe_customer_id eksikse 400; 401 geçersiz secret; 404 org yok; 500 Stripe/config hataları.

Kullanıcı kredilerini kontrol etme

Bu endpoint kullanıcının apikey'ini header üzerinden alır ve kredi detaylarını döner.

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

Örnek istek

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'

Örnek yanıt

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

Harici entegrasyonlarda yalnızca credits alanı dolu gelir.

Health check

API sunucusunun sağlık durumunu kontrol edin.

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

Örnek istek

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

Örnek yanıt

{
    "status": "healthy"
}

"healthy" yanıtı servisin normal çalıştığını gösterir.

Hatalar

Çoğu hata API'ye yanlış parametre gönderilmesinden kaynaklanır. Her çağrıyı kontrol edin ve verilen örnekleri deneyin.

Kullandığımız genel hata kodları REST standardına uygundur:

Hata koduAnlamı
400Bad Request — İsteğiniz geçersiz.
401Unauthorized — Geçersiz job secret (internal usage endpoint'leri) veya benzeri auth hatası.
403Forbidden — API key geçersiz, erişim reddedildi veya işlem için yeterli kredi yok.
404Not Found — Belirtilen kaynak yok.
405Method Not Allowed — Kaynağa geçersiz HTTP method ile erişildi.
406Not Acceptable — JSON olmayan bir format istendi.
410Gone — Bu endpoint'teki kaynak kaldırıldı.
422Invalid Request Body — Gövde formatı hatalı, geçersiz veya eksik parametre içeriyor.
429Too Many Requests — Çok fazla istek! Hızı düşürün.
500Internal Server Error — Sunucu tarafında sorun oluştu. Daha sonra tekrar deneyin.
503Service Unavailable — Bakım nedeniyle geçici olarak kapalı. Daha sonra tekrar deneyin.

Yaygın sorunlar ve çözümler

Authentication sorunları

"User verification failed" (403)

Neden: Geçersiz veya süresi dolmuş API key

Çözüm:

  1. API key'inizin doğru olduğunu doğrulayın
  2. Hesabınızda API key'in aktif olduğunu kontrol edin
  3. Gerekirse API key'i yeniden oluşturun

"Not enough credits" (403)

Neden: Görüntü işleme için yetersiz kredi

Çözüm:

  1. /check-user-credits ile kalan kredinizi kontrol edin
  2. Gerekirse ek kredi satın alın

Girdi doğrulama sorunları

"Input URL cannot be empty" (400)

Neden: Boş veya geçersiz URL gönderildi

Çözüm:

  1. url girdinizin boş olmadığından emin olun
  2. Görüntü adlarında başta/sonda boşluk bırakmayın
  3. URL encoding'in doğru olduğunu kontrol edin

"Input email is empty" (400)

Neden: URL işleme için e-posta eksik

Çözüm:

  1. URL gönderirken geçerli bir e-posta sağlayın
  2. E-posta formatının doğru olduğunu kontrol edin

"Unsupported image type" (400)

Neden: Dosya formatı desteklenmiyor

Çözüm:

  1. Desteklenen bir formata dönüştürün (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, GIF, SVG, PDF)
  2. Dosya uzantısının doğru olduğunu kontrol edin

"File size is too small" (400)

Neden: Görüntü dosyası minimum boyutun altında

Çözüm:

  1. Daha büyük bir görüntü dosyası kullanın (minimum 1KB)
  2. Yükleme sırasında dosyanın bozulmadığını kontrol edin

"File size exceeds limit" (400)

Neden: Görüntü dosyası çok büyük

Çözüm:

  1. Görüntüyü sıkıştırın veya yeniden boyutlandırın; limit dağıtıma göre ayarlanır (API hata mesajı MB cinsinden belirtir)
  2. Farklı bir görüntü formatı deneyin

"Invalid file type" (400)

Neden: Dosya türü doğrulaması başarısız

Çözüm:

  1. Dosyanın geçerli bir görüntü formatı olduğundan emin olun
  2. Dosyanın bozuk olmadığını kontrol edin
  3. MIME type ile dosya uzantısının eşleştiğini doğrulayın

İşleme sorunları

Görüntü durumu "failed"

Neden: İşleme çeşitli nedenlerle başarısız oldu

Çözüm:

  1. URL'nin desteklenen bir formatta olduğunu doğrulayın
  2. Görüntü dosyasının geçerli ve bozuk olmadığını kontrol edin
  3. Görüntünün boyut gereksinimlerini karşıladığından emin olun
  4. Sorun sürerse destek ile iletişime geçin

"User not found"

Neden: Geçersiz user ID

Çözüm:

  1. User ID'nin doğru olduğunu doğrulayın
  2. Kullanıcı hesabının aktif olduğundan emin olun
  3. Gerekirse yeniden kimlik doğrulayın

"File metadata could not be fetched" (500)

Neden: Yüklenen dosyaya erişilemiyor

Çözüm:

  1. Dosyanın başarıyla yüklendiğini doğrulayın
  2. Dosya URL'sinin erişilebilir olduğunu kontrol edin
  3. Dosyayı yeniden yüklemeyi deneyin

Upload sorunları

"Image upload failed" (403/400)

Neden: Geçersiz veya süresi dolmuş pre-signed URL veya depolama sunucusu sorunu

Çözüm:

  1. Pre-signed URL'i aldıktan sonra kısa sürede kullanın
  2. Content-Type'ın dosya formatıyla eşleştiğini doğrulayın
  3. Yüklemeden önce dosya adındaki boşlukları kaldırın
  4. Gerekirse yeni pre-signed URL oluşturun

"Invalid pre-signed URL" (400)

Neden: Dosya adında boşluk veya süresi dolmuş/bozuk pre-signed URL

Çözüm:

  1. Pre-signed URL istemeden önce dosya adındaki boşlukları kaldırın
  2. Alfanumerik karakter, tire ve alt çizgi kullanın
  3. Gerekirse yeni pre-signed URL oluşturun

Bulk upload sorunları

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

Neden: /bulk-upload'a verilen URL bir ZIP dosyasına işaret etmiyor

Çözüm:

  1. get-presigned-url?file_name=images.zip (veya başka .zip adı) kullanın
  2. Geçerli bir ZIP'i presigned URL'e yükleyin
  3. bulk-upload isteğindeki url'nin o yüklenmiş ZIP'e işaret ettiğinden emin olun

"ZIP file too large" (400)

Neden: ZIP maksimum boyutu (100MB) aşıyor

Çözüm:

  1. Görüntü sayısını azaltın veya sıkıştırın
  2. Birden fazla bulk upload'a bölün

"Too many files" (400)

Neden: ZIP içinde 50'den fazla geçerli görüntü var

Çözüm:

  1. ZIP başına 50 veya daha az görüntü kullanın
  2. Birden fazla bulk upload'a bölün

"No valid images found in ZIP" (400)

Neden: ZIP'teki tüm dosyalar atlandı (desteklenmeyen format, çok küçük, geçersiz yol vb.)

Çözüm:

  1. Desteklenen formatları kullanın (JPG, PNG, WebP, HEIC, HEIF, AVIF, BMP, TIFF, TIF, GIF, SVG)
  2. Bulk içinde PDF desteklenmez
  3. Her görüntü en az 1KB en fazla 10MB olmalı
  4. Gizli dosyalar (. ile başlayan) ve path traversal (..) kullanmayın

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

Neden: id bu yükleme türüyle eşleşmiyor (tek görüntü vs ZIP batch)

Çözüm:

  1. Tek görüntü gönderimleri için /detect'ten dönen id'yi kullanın
  2. ZIP gönderimleri için /bulk-upload'tan dönen id'yi kullanın

Yardıma mı ihtiyacınız var?

API kullanımı veya teknik destek için lütfen bizimle iletişime geçin.

API sık sorulan sorular

AI image detection API'miz hakkında en sık sorulan soruların yanıtları.