Developer API · prepaid beta

Video screening you can build into your workflow.

Send an original clip. Receive sampled timestamps, a file hash, an advisory verdict and an explanation. Keep human review in the loop.

Visual-only beta · 60-second clips · 50 MB · up to 4K · no SLA or accuracy guarantee. Audio, SynthID and C2PA validation are not included.

Prepaid credits. No surprise overage bills.

Credits are valid for 90 days. One Quick scan (8 frames) uses 1 credit; Deep (16 frames) uses 2; Forensic (24 frames) uses 3. An inconclusive completed result is charged; failed processing is not.

Starter

$29

100 credits · $0.29 per Quick scan

For evaluating integrations and occasional workflows.

Balanced starting point

Builder

$99

500 credits · $0.198 per Quick scan

For recurring newsroom and agency screening.

Scale

$299

2,000 credits · $0.1495 per Quick scan

For a proven integration. Beta throughput limits still apply.

One-time USD purchases, not subscriptions. No automatic top-ups. Extension Pro and consumer upload purchases do not include API credits. Higher throughput or team requirements: discuss a pilot.

Your developer dashboard

Sign in to manage API keys, credit purchases and private reports. We request basic Google identity only, not Drive, Gmail or mobile-app access.

Loading account services…

Quickstart

  1. Sign in, create a server-side API key and purchase credits.
  2. Upload a supported original clip with a unique idempotency key.
  3. Use the advisory report to decide whether human investigation is needed.

API base URL: https://api.tsdetect.com. Scan uploads go directly to the API service rather than through the website proxy.

curl https://api.tsdetect.com/v1/scans \
  -H "Authorization: Bearer $TRUESIGHT_API_KEY" \
  -H "Idempotency-Key: clip-2026-001" \
  -F "video=@clip.mp4" \
  -F "tier=quick"

Windows PowerShell: use curl.exe and put the arguments on one line. The API key must not be embedded in a website or shipped in a mobile app.

EndpointPurpose
POST /v1/scansSynchronous original-file scan; multipart field video, optional tier = quick / deep / forensic.
GET /v1/scans/{id}Retrieve your private report without spending more credits.
GET /v1/creditsRead available balance and tier credit costs.
Response and interpretation
{
  "id": "scan-uuid",
  "status": "completed",
  "input": { "sha256": "...", "durationSeconds": 12.5, "bytes": 2048000 },
  "analysis": {
    "verdict": "UNCLEAR",
    "label": "UNCLEAR",
    "confidence": 50,
    "aiProbability": 48,
    "explanation": "Some visual details could not be assessed confidently.",
    "humanReviewRequired": true,
    "frameCount": 8,
    "timestampsSeconds": [1.389, 2.778, 4.167, 5.556, 6.944, 8.333, 9.722, 11.111]
  },
  "provenance": { "synthid": "not_checked", "c2pa": "not_checked" },
  "billing": { "creditsCharged": 1, "remainingCredits": 99 }
}

Example, not a measured accuracy claim. confidence and aiProbability are model estimates, not independently calibrated probabilities. Review the returned limitations array. The report's remaining-credit balance is a snapshot at completion; use GET /v1/credits for your current balance.

Limits, retries and billing

Beta limit: 10 scan attempts per minute and one active scan per account; global capacity is limited. Allow up to 120 seconds for a response. Upload a decodable clip up to 60 seconds, 50 MB and 4K. Longer consumer uploads remain available separately on the website.

An Idempotency-Key of 8–100 allowed characters is required. A completed retry with the same file, tier and key returns the original report without charging again. A different file or tier with that key returns 409. If processing fails, credits are restored; use a new key for a fresh attempt. Reports and idempotency records expire after 30 days.

If your network drops after completion, retrieve the report or retry with the same key. A persisted completed analysis is charged even if the first response was lost.

Error codes

400: invalid file, tier, duration or idempotency key. 401: missing/invalid key. 402: insufficient credits. 403: account denied. 409: idempotency conflict or processing. 413: oversized upload. 429: rate/capacity limit. 500/503: processing/service failure. Errors return {"error":{"code":"...","message":"..."}}. No credits are spent on rejected input or failed processing.

What this API does not verify

It does not verify a person's identity, spoken claims, audio, every video frame or chain of custody. It does not run Google SynthID verification or validate C2PA signatures. A SHA-256 hash identifies the exact submitted file; it does not prove its origin.