Skip to main content
Upload a single image or video as multipart/form-data. The response carries one top-level detected verdict plus a per-technique breakdown. No authentication, no credits. The upload is processed in memory and never retained.

Request

Send exactly one file part named file. The part must carry a filename in its Content-Disposition header — a plain form field without one is not a file part.
JPEG/PNG/WebP/GIF and MP4/QuickTime are recognised by magic bytes, so a wrong or generic part Content-Type (for example application/octet-stream) does not break detection for those formats. WebM has no magic-byte branch and is accepted only when the part declares Content-Type: video/webm.

Response

200 OK. An image or video that carries a valid, trusted Samsa C2PA manifest:
Response
result_pdf_url may be null. When it is present, follow it exactly as returned rather than assembling the URL yourself — the returned URL and the documented result endpoint serve the identical signed PDF.

The detected verdict

The verdict comes from C2PA manifest verification, which is authoritative. Watermark techniques are corroboration: they can supply attribution when no manifest is present, but they never override a manifest verdict.
unknown means this check found no evidence, not that the asset is authentic or human-made. Provenance metadata is easily stripped, and hosted watermark decode is not yet available.

Reading the techniques breakdown

techniques[] always starts with the single metadata entry (the authoritative C2PA layer), followed by the watermark techniques applicable to the asset’s modality.

The metadata technique

C2PA manifest verification is live: it is served by the Samsa public API and by any independent C2PA validator. Attribution of a manifest to Samsa becomes available once production signing is enabled.

Watermark techniques

not_checked is not a statement that no watermark is present — that is what absent means. Hosted watermark decode is not yet available; it is scheduled before 2 February 2027. Until then the API reports these techniques as not_checked, never as a false “no watermark”. Never render a not_checked technique as an absent watermark.
Because hosted watermark decode is not yet live, every watermark entry currently comes back as not_checked with confidence: null. Watermark entries carry no technique name of their own — for the algorithm IDs, pinned model artifact hashes, per-lane soft-binding labels, and open-source decoders behind each technique, read How detection works or GET /v1/public/detect/info.

Errors

Errors return {"detail": "…"} — not the Samsa REST API error envelope.
Treat 503 as transient and retry after the Retry-After interval. A decoder that is simply not provisioned never produces a 503 — it degrades to not_checked in a normal 200 response.