api.provena.eu/v1

Four endpoints. No SDK required.

Sign, verify, read the ledger, manage identities. Everything else is a webhook. The API is versioned, idempotent and returns the same verdict codes the panel shows.

Get an API keySelf-host verifier-core
P95 SIGN
142 ms
RATE LIMIT
120 / s
BREAKING CHANGES
never in v1
curl -X POST https://api.provena.eu/v1/assets/sign \ -H "Authorization: Bearer $PROVENA_KEY" \ -H "Idempotency-Key: as_local_4471" \ -F policy=newsroom-default \ -F file=@render_0904.jpg # 201 Created { "asset_id": "as_8f21c4", "verdict": "SIGNED_QUALIFIED", "ledger_seq": 41208 }
Idempotency-Key makes retries safe.
01THE WHOLE SURFACE
  • POST/v1/assets/signMark, sign and record one asset.assets:write
  • POST/v1/assets/verifyReturn a verdict for uploaded bytes or a URL.public
  • GET/v1/assets/:idManifest, verdict and ledger entry for an asset.assets:read
  • GET/v1/ledgerPaged ledger entries with checkpoint proofs.ledger:read
  • POST/v1/identitiesCreate or rotate a signing identity.identities:write
  • GET/v1/reports/:periodGenerated compliance report and its sha256.reports:read
02 · WEBHOOKS

Signed, retried, replayable.

Every delivery carries an HMAC signature over the raw body and a timestamp. Failed deliveries retry with backoff for 24 hours, then land in a dead-letter list you can replay from the panel.

  • asset.signedManifest written, ledger sequence assigned
  • asset.failedSigning rejected, with the reason code
  • watermark.completedAsync video mark finished
  • verdict.changedA re-verify produced a different outcome
  • identity.expiringCertificate expires in 30 days
  • report.readyPeriod report generated and hashed
POST /your-endpoint
X-Provena-Signature: t=1788480000, v1=5d41402abc4b2a76b9719d911017c592 Content-Type: application/json { "event": "asset.signed", "asset_id": "as_8f21c4", "workspace": "ws_newsroom_nl", "verdict": "SIGNED_QUALIFIED", "anchors": { "c2pa": true, "eidas_qualified": true }, "ledger": { "seq": 41208, "sha256": "9f2a41c8e7b0d3a5…" }, "created_at": "2026-09-04T09:14:22Z" }
03ERRORS THAT MEAN SOMETHING
400policy_not_foundThe policy id does not exist in this workspace.
402quota_exceededSigning is paused because the plan quota and overage cap were both reached.
409asset_already_signedThis idempotency key was used with different bytes.
422unsupported_containerThe file parses but the container cannot carry a manifest.
424identity_expiredThe signing certificate expired; rotate the identity first.
503trust_list_staleTrust list refresh failed; verdicts return PENDING rather than a guess.