NewSynchronous v1 API is live

The image provenance API for developers

Check whether an image carries AI-generation and provenance signals in one synchronous API call — normalized C2PA, SynthID, and OpenAI provenance, backed by prepaid credits and durable request history.

Prepaid credits. Invalid uploads are rejected before you ever spend one.

Normalizes the signals you already care about

Simple by design

One request. One normalized result.

Send a single image as multipart form data and get back a strict, normalized verdict. The same public path powers the dashboard playground and every external integration.

  • Strict synchronous contract

    One multipart upload, one normalized response. No polling, no webhooks, no provider noise leaking into your payload.

  • Idempotency keys

    Send an Idempotency-Key and replays return the stored result with Idempotency-Replayed: true — never a second charge.

  • Stable public response

    A small, versioned response shape that is safe to build against and stays stable as providers come and go.

Explore the API reference
200 OK · application/json
{
  "provenance": "openai_generated",
  "signals": [
    { "type": "openai_provenance", "outcome": "detected" },
    { "type": "c2pa", "outcome": "unavailable" },
    { "type": "synthid", "outcome": "not_detected" }
  ],
  "attemptsUsed": 1,
  "durationMs": 1200,
  "requestId": "req_8Fh2..."
}
1Endpoint to integratePOST /v1/provenance/check
3Signals normalizedC2PA · SynthID · OpenAI
0Provider secrets in your payloadDiagnostics stay internal
Verifier boundary

Provider complexity stays out of your contract.

Each provider speaks its own dialect. Image Provenance normalizes them into one outcome vocabulary and keeps the messy internals on our side of the boundary.

  • Normalized across providers

    C2PA, SynthID, and OpenAI provenance are mapped to the same outcome vocabulary so you compare signals, not formats.

  • Provider complexity stays internal

    Raw provider diagnostics are persisted for debugging and abuse review — never returned in your customer-facing contract.

  • Isolated verifier boundary

    Provider checks run in a dedicated verifier with its own secrets, timeout, memory, and concurrency, separate from the public API.

SignalOutcome
C2PAContent credentials
detected
SynthIDGoogle watermark
not_detected
OpenAI provenanceModel attribution
detected
VerdictNormalized result
openai_generated
Prepaid credits

A credit ledger that never surprises you.

Billing is a request-scoped ledger with a clear lifecycle. You only pay for results, and failed provider checks refund themselves automatically.

  • Validate before you reserve

    Content-type and size validation, auth, and rate limits all run before a single credit is ever held.

  • Reserve → finalize → refund

    One credit is reserved when work starts, finalized on a successful result, and refunded automatically on provider failure.

  • A ledger you can audit

    Grants, adjustments, reservations, finalizations, and refunds are recorded as durable, request-scoped ledger events.

1
validateupload + auth + rate limit
passed
2
reservehold 1 credit for the request
−1
3
verifyisolated verifier runs
running
4
finalizeresult returned to caller
spent
Provider failure? The reservation is refunded, not spent.
Integrate today

Use the language you already ship.

Send a plain multipart request or drop in a few lines with your HTTP client of choice. One image field, one bearer token, one normalized result.

Get your API key
curl https://api.imageprovenance.ai/v1/provenance/check \
  -H "Authorization: Bearer ip_live_..." \
  -H "Idempotency-Key: upload_2026_06_28" \
  -F "image=@photo.jpg"

Start checking image provenance today.

Create an API key, send your first image, and get a normalized provenance verdict in a single synchronous call.