Pro · English

API

This page is English.

Score media with your Pro key. Same engines as Check. Same Express path. Optionally issue a verifiable report anyone can open at https://dotcheck.ai/v/{reportId}. Confirm is first-party only — not via this API.

Create keys Download Pro API guide See plans

Call

https://dotcheck-server-c221c1f32c68.herokuapp.com
Authorization: Bearer dc_…

Mint and revoke keys on Check with Google. Keys never appear on this page.

Score

Image and text success bodies are a JSON array — one object per input — not a wrapper. Read probability and clean_hash from each element. Video, audio, and document return a JSON object.

Image

POST /analyze-image

Body {"image_urls":["https://…"]} (HTTPS or data URLs). Paid batch cap 30. JSON array of rows.

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/analyze-image" \
  -H "Authorization: Bearer dc_live_…" \
  -H "Content-Type: application/json" \
  -d '{"image_urls":["https://example.com/photo.jpg"]}'
[
  {
    "probability": 0.42,
    "clean_hash": "495ad70c4a1e2f3b…",
    "engine": "inhouse@14",
    "remaining": { "left": 29999, "limit": 30000, "scope": "week", "surface": "api" }
  }
]

Text

POST /analyze-text

Body {"texts":["…"]}. One string is one Check. Latin from 520 characters; Simplified Chinese from 120. Express packs hops inside the string. Pastes above 60,000 characters return truncated: true. English, Chinese, Spanish, French, Portuguese, German, Italian, Dutch. Unsupported language returns unsupported_language on that element (no Check burn). Paid batch cap 30. JSON array.

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/analyze-text" \
  -H "Authorization: Bearer dc_live_…" \
  -H "Content-Type: application/json" \
  -d '{"texts":["Sample paragraph to score."]}'
[
  {
    "probability": 0.11,
    "clean_hash": "8c21b0e4…",
    "engine": "inhouse-text@12"
  }
]

Video

POST /analyze-video

Body video_url (stable locator: HTTPS media, YouTube, or xvid: / x: — never /home) plus frames you extract (max 12). JSON object with aggregated probability, composite clean_hash, and frame_results. Scores the frames you send; it does not capture a live soundtrack.

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/analyze-video" \
  -H "Authorization: Bearer dc_live_…" \
  -H "Content-Type: application/json" \
  -d '{"video_url":"https://example.com/clip.mp4","frames":["data:image/jpeg;base64,…"]}'
{
  "probability": 0.38,
  "clean_hash": "b7d01c92…",
  "engine": "inhouse-video@4",
  "frame_results": [{ "probability": 0.41 }]
}

Audio

POST /analyze-audio

Multipart field audio (WAV / MP3 / M4A / OGG). One burn on the Pro fair-use bag. JSON object.

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/analyze-audio" \
  -H "Authorization: Bearer dc_live_…" \
  -F "audio=@sample.wav"
{
  "probability": 0.21,
  "clean_hash": "e4a91f70…",
  "engine": "inhouse-audio@3"
}

Document

POST /analyze-document

Multipart field document (PDF / DOCX / PPTX / TXT). One Check per scored item. Count-weighted probability, sourceSha256, checksBilled, and markSignal geometry. This API does not return a marked file.

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/analyze-document" \
  -H "Authorization: Bearer dc_live_…" \
  -F "document=@sample.pdf"
{
  "probability": 0.33,
  "sourceSha256": "1f8c6aa2…",
  "checksBilled": 4
}

Report

POST /report

HTTP 201. Freezes the server-held score for that clean_hash (never send a client %). JSON body: clean_hash (or sourceSha256) + kind. Optional multipart: same fields plus file (native MP4 or GIF) so video can Verify as hashBasis: file. Response includes hashBasis, stampCount (video, 1–12), and reportFormatVersion (v2). Text stays derived (link/ID). Construct https://dotcheck.ai/v/{reportId} (no verifyUrl field). List: GET /reports. Public lookup: GET /report/:id (no key). File match: POST /report/verify multipart media. Withdraw: POST /report/:id/withdraw. Confirm is first-party only (403 confirm_first_party_only).

curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/report" \
  -H "Authorization: Bearer dc_live_…" \
  -H "Content-Type: application/json" \
  -d '{"clean_hash":"495ad70c…","kind":"image"}'
curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/report" \
  -H "Authorization: Bearer dc_live_…" \
  -F "kind=video" \
  -F "clean_hash=495ad70c…" \
  -F "file=@clip.mp4"
curl -X POST "https://dotcheck-server-c221c1f32c68.herokuapp.com/report/verify" \
  -F "reportId=DC-XXXX-XXXX" \
  -F "media=@clip.mp4"
{
  "ok": true,
  "report": {
    "reportId": "DC-XXXX-XXXX",
    "score": 42,
    "probability": 0.42,
    "kind": "image",
    "hashBasis": "prepared",
    "stampCount": null,
    "reportFormatVersion": 2,
    "issuedAt": "2026-08-07T12:00:05.000Z"
  }
}

Usage

GET /usage with the same Bearer key returns quota for surface api. Poll remaining.left and remaining.scope (week) instead of guessing from 429 alone.

curl "https://dotcheck-server-c221c1f32c68.herokuapp.com/usage" \
  -H "Authorization: Bearer dc_live_…"
{
  "tier": "pro",
  "surface": "api",
  "remaining": { "left": 29999, "limit": 30000, "scope": "week", "surface": "api" }
}

Errors

CodeMeaning
401Missing or revoked key
403Not Pro, key used for key management, or Confirm via API (confirm_first_party_only)
429Weekly analysis budget reached — read remaining.left; resets on the next weekly window (no fake immediate Retry-After)
503Usage store or inference unavailable — fail closed with 503 (no silent fallback). Admission may include Retry-After: 2

Limits

  • Shares your Pro fair-use budget (up to 30,000 analyses/week, UTC).
  • Up to 30 image URLs or texts per request; up to 12 video frames.
  • Up to 5 active keys per account. Key management stays on Check with Google sign-in.
  • Runnable Python + Node: examples/pro-api (writes results.jsonl).