Signing API
One POST stamps media with a C2PA Content Credential plus the standards you select—identity, API, and audit trail without a DAM.
New to Content Credentials? What is C2PA? C2PA is the base envelope; IPTC, EXIF, CAWG, PLUS, and XMP are optional claims inside it.
/api/v1/signMultipart file plus optional standards fields. Add ?manifest=sidecar for a zip of the unmodified asset and a detached .c2pa manifest.
Request
# One POST = C2PA Content Credential + selected standards curl -X POST "https://api.krusade.dev/api/v1/sign" \ -H "Authorization: Bearer krsd_your_key_here" \ -F "[email protected]" \ -F "author=Jane Doe" \ -F "standards=iptc,training_mining,plus" \ -F 'iptc={"creator":["Jane Doe"]}' \ -F 'training_mining={"entries":{"cawg.ai_generative_training":{"use":"notAllowed"}}}' \ -F 'plus={"license":"CC-BY"}' \ -o photo.signed.jpg # Sidecar: leave the asset unmodified; download zip (asset + .c2pa) curl -X POST "https://api.krusade.dev/api/v1/sign?manifest=sidecar" \ -H "Authorization: Bearer krsd_your_key_here" \ -F "[email protected]" \ -F "title=Agency cutdown" \ -o clip.c2pa.zip
OpenAPI: docs/openapi.yaml · Machine-readable error code on every failure.
Form fields
filebinary (required)Asset to stamp. JPEG, PNG, WebP, AVIF, TIFF, GIF, MP4, MOV, MP3, WAV, FLAC. 64 MB cap.
standardsstringComma-separated selector (e.g. iptc,training_mining). Empty → all applicable fields. Unknown name → 400.
authorstringAuthor → stds.schema-org.CreativeWork assertion.
titlestringManifest title (defaults from filename).
iptc / exif / xmpJSON stringOpaque JSON objects for IPTC, EXIF, and XMP assertions. Malformed JSON → 400.
training_miningJSON stringCAWG AI training / data-mining preferences (cawg.training-mining).
plusJSON stringLicensing payload (com.krusade.license).
web3JSON stringWeb3 provenance (com.krusade.web3).
cawg_identity"true"Opt-in signer name/email assertion. Off by default.
ingredientbinaryOptional parent asset ingested as a parentOf ingredient.
Sidecar response
With ?manifest=sidecar, the API returns application/zip containing the original file (bytes unchanged) and <name>.c2pa. Verify with an optional manifest part on /api/v1/verify.
Errors
Errors follow RFC 7807 problem+json shape with a machine-readable code field (plus detail and req_id).
400bad_requestMissing file, unknown standards name, or malformed standards JSON (iptc/exif/…). Detail explains which field failed.
402insufficient_creditsIncluded/free signs exhausted and credit balance is zero. Failed signs are never charged.
415validation_failedUnsupported or undetectable media type for signing (e.g. HEIC, plain text, unknown container).
Example (402)
{
"type": "about:blank",
"title": "Payment Required",
"status": 402,
"detail": "included signs used and no credits — purchase credits to continue signing",
"code": "insufficient_credits",
"req_id": "req_01hxyz"
}