Skip to main content
This page specifies how a platform carries a TLP receipt in an output’s C2PA manifest: the assertion’s label and content, where it is placed, the action and digital source type that go with it, how soft bindings lead back to a receipt, and what a verifier can still establish when the manifest is gone.

The assertion

The receipt travels as an assertion whose label is the license server’s c2pa_assertion_label. For the Talent API, the label is ai.reflections.license. TLP-C2PA-1. A platform meeting a c2pa_manifest obligation MUST add this assertion to the output’s active manifest, the manifest whose claim the platform signs, with exactly the receipt and verify_url the generation returned. It MUST NOT alter either value. TLP-C2PA-2. The platform MUST sign the claim, as its claim generator, with its own C2PA signing credential. The license server does not sign the manifest. The receipt inside the assertion carries the license server’s own signature, so a verifier can check it independently of the claim signature. A platform that declares its claim-signing certificate’s thumbprint as c2pa_signer when it submits the generation gets a receipt that names it as tlp.c2pa_signer (TLP-RCP-15). A verifier then rejects a copy of the assertion in a manifest that another certificate signed (TLP-RCP-16). Without it, the assertion is evidence of a decision, not of the file that carries it. TLP-C2PA-3. In a C2PA 2.x claim, the platform SHOULD list the assertion among the claim’s gathered assertions, because its content comes from the license server and not from the claim generator.

The action

TLP-C2PA-4. The same manifest MUST contain a c2pa.actions assertion (label c2pa.actions.v2 in C2PA 2.x) with a c2pa.created action whose digitalSourceType is the IPTC value http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia.

Example (informative)

The assertions a platform adds for the line of speech Northlight generated in Maya Okafor’s voice, in the manifest definition format C2PA tools accept:
The Talent API returns the second assertion, ready to add, as the generation’s c2pa field.

Order of operations

TLP-C2PA-5. A platform MUST submit the output to the generation check first, then embed the manifest, then deliver. artifact_sha256 in the receipt is the digest of the output as submitted, before the manifest was embedded. After the generation check, a platform MUST NOT change the output’s content, as opposed to its metadata.

Soft bindings

A soft binding identifies content by what it looks or sounds like rather than by its exact bytes, so it survives re-encoding. TLP uses two: TLP-C2PA-6. A license server MUST answer a verification of a file by its exact digest first and then by fingerprint, and MUST report which method matched and with what confidence. A platform that applies a watermark SHOULD register it on the generation, and MAY also record it in a C2PA c2pa.soft-binding assertion. TLP-C2PA-7. A verifier MUST treat a verification result of not_found as no information about whether the content is licensed.

What survives stripping

TLP-C2PA-8. A verifier holding a file with the assertion MUST verify the receipt (TLP-RCP-5), its claim signer binding (TLP-RCP-16), and the C2PA claim signature and bindings. The claim binds the manifest to the file; the receipt binds the decision to the submitted output. A verifier holding a file without the assertion MUST use a lookup, and MUST NOT treat a receipt it found elsewhere as proof about the file unless a lookup relates them.

Embed provenance

Writing the assertion and the disclosure label in practice.

C2PA assertion format

The ai.reflections.license assertion in the Talent API.

Verify content

Lookup by receipt, manifest, digest, fingerprint or file.

C2PA specifications

The C2PA technical specification.