Skip to content

Recipes and signing modes

llms.txtAsk agent

A recipe fixes which steps a signing job runs: a C2PA manifest, an invisible watermark, server-side fingerprints, or a combination. The catalog is closed: you pass one reviewed recipe_id to POST /v1/sign. The API has no endpoint for creating or editing recipes.

For images, audio and video in the embedded lane, choose by what you need a copy to keep:

Goal Mode recipe_id
Content credentials only; no watermark and no fingerprint Sign rcp_system_sign
Content credentials, plus a watermark that can outlive a stripped manifest Sign + watermark rcp_system_watermark_then_sign_unfingerprinted
The above, plus fingerprints so recovery can also find edited copies Sign + watermark + fingerprint rcp_system_watermark_then_sign
Content credentials with fingerprints, no watermark (earlier integrations) Sign (fingerprinted) rcp_system_sign_only
A watermark with no manifest Watermark only rcp_system_watermark_only

Other formats have one recipe each, chosen by the lane:

  • Structural containers (for example HEIC, GIF, FLAC, QuickTime) are signed without decoding with rcp_system_structural_sign_only. They take no watermark and no fingerprint.
  • Sidecar formats (documents, text, fonts, ML models, and some image, audio and video containers) are signed with the rcp_private_sidecar_…_sign_only recipe for their kind, which publishes a separate .c2pa manifest; see Downloads and sidecar manifests.

Which media type is in which lane is on Formats.

rcp_system_sign_only was the first “sign” recipe and also records fingerprints. The newer rcp_system_sign signs without them, and rcp_system_watermark_then_sign_unfingerprinted is the watermark mode without them. The older recipes are unchanged, so existing integrations keep working; choose a newer one when you do not want fingerprints kept.

What a mode without fingerprints gives up: nothing is kept that could find your published original from a copy whose manifest was removed, except the watermark in “Sign + watermark”. Fingerprints and watermarks are recovery signals, not proof of origin; see Lookup and recovery.

A recipe with a watermark accepts watermark_algorithm and watermark_strength; see Watermarks. A recipe with fingerprints accepts fingerprint_algorithms; see Fingerprints. A recipe without the step refuses the field with HTTP 422 JOB_RECIPE_INVALID. Each field can also be defaulted per API key; see Signing profile.

Generated from the capability snapshot the API is built with. The live GET /v1/capabilities response is authoritative: it lists the recipes enabled for your account, with their current versions.

Recipe Name What it does Lane Media types
rcp_system_sign_only Sign (with fingerprint, legacy) Signs the file with a C2PA manifest and also records a perceptual fingerprint. The launch recipe, kept for existing integrations; for C2PA signing without a fingerprint choose rcp_system_sign. Embedded (decoded) audio/mp4, audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_watermark_only Watermark only Embeds an invisible watermark and records a perceptual fingerprint. Writes no C2PA manifest. Embedded (decoded) audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_watermark_then_sign Sign + watermark + fingerprint Embeds an invisible watermark, records a perceptual fingerprint, then signs the watermarked file with a C2PA manifest. Embedded (decoded) audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_sign Sign Signs the file with a C2PA manifest that binds its exact bytes. No watermark and no fingerprint. Embedded (decoded) audio/mp4, audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_watermark_then_sign_unfingerprinted Sign + watermark Embeds an invisible watermark, then signs the watermarked file with a C2PA manifest. No fingerprint is computed. Embedded (decoded) audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_express_watermark_then_sign Sign + watermark + fingerprint (express) Embeds an invisible watermark, records a perceptual fingerprint, then signs the watermarked file with a C2PA manifest, run as one uninterrupted job for JPEG, PNG, WebP, TIFF and AVIF images. With mode express, POST /v1/sign waits for the result. Embedded (decoded) audio/mpeg, audio/wav, image/avif, image/jpeg, image/png, image/tiff, image/webp, video/mp4
rcp_system_structural_sign_only Sign only (no watermark or fingerprint) Signs formats the product does not decode by writing a C2PA manifest into the container. No watermark or fingerprint. Structural (not decoded) audio/flac, image/gif, image/heic, image/heic-sequence, image/heif, image/heif-sequence, image/jxl, image/svg+xml, image/x-adobe-dng, video/quicktime, video/x-msvideo
rcp_private_sidecar_audio_sign_only Sign only (audio, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest audio/MPA, audio/aac, audio/x-riff-based
rcp_private_sidecar_document_sign_only Sign only (document, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest application/epub+zip, application/oxps, application/pdf, application/vnd.oasis.opendocument.text, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/x-zip-based
rcp_private_sidecar_font_sign_only Sign only (font, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest font/otf
rcp_private_sidecar_image_sign_only Sign only (image, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest image/x-riff-based, image/x-tiff-based
rcp_private_sidecar_model_sign_only Sign only (ML model, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest application/onnx, application/x-jax, application/x-keras, application/x-mlnet, application/x-mxnet, application/x-npy, application/x-openvino-ir+xml, application/x-openvino-weights, application/x-pickle, application/x-protobuf, application/x-pytorch, application/x-tensorflow, application/x-tensorflow-savedmodel
rcp_private_sidecar_text_sign_only Sign only (text, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest application/xhtml+xml, application/xml, text/html, text/plain, text/xml
rcp_private_sidecar_video_sign_only Sign only (video, manifest beside it) Signs the file with a C2PA manifest delivered beside it as a separate .c2pa sidecar; the file’s bytes are not changed. No watermark or fingerprint. Sidecar manifest video/x-bmff-based, video/x-riff-based

GET /v1/recipes lists the enabled recipes for the embedded and structural lanes. Sidecar recipes are listed by GET /v1/capabilities only.

Terminal window
curl -sS "$OP_API_BASE_URL/v1/recipes" -H "Authorization: Bearer $OP_API_KEY"

Each entry has:

Field Description
recipe_id Stable identifier to pass to POST /v1/sign.
version The currently enabled immutable version.
capabilities Customer-visible capabilities in execution order.
supported_media_types The currently enabled media types this recipe accepts.

Read one recipe with GET /v1/recipes/{recipe_id}.

Recognition by an inspector is separate from recipe availability. Do not infer execution support from an internal codec, a planned profile, or an older guide.

Every recipe also inspects the media, validates its own output independently, and stores the result immutably.

A job records the exact recipe_id and recipe_version it ran with. Assets keep verifying against what was actually applied, even after a newer version is enabled.