Upload the photo.
Send the bytes once. We keep the file for 24 hours, long enough to sign it, verify it, or sign it again with other settings.
curl https://api.inteqral.com/v1/files \
-H "Authorization: Bearer $TOKEN" \
-F asset=@beach.jpgA worked example you can change. Follow beach.jpg through every call, from upload to finding it again after its metadata is gone, and switch the options on the way to see what each one changes.
Send the bytes once. We keep the file for 24 hours, long enough to sign it, verify it, or sign it again with other settings.
curl https://api.inteqral.com/v1/files \
-H "Authorization: Bearer $TOKEN" \
-F asset=@beach.jpgWe write the C2PA manifest: that the photo was created, a hash of its content, your title and AI training statement, our signature and a time-stamp. With wait, the call answers when it is done.
curl "https://api.inteqral.com/v1/sign?wait=25" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"file_id": "0199b2c4-6a1e-...", "ai_training": false, "retention": "temporary""persisted"}'
The manifest now travels inside the file, and we keep our own copy of it. With temporary retention, you can download the signed copy for 24 hours, then we delete it.With persisted retention, the signed copy and your original stay with us, and the signed copy is public at a stable link.
curl https://api.inteqral.com/v1/sign/0199b2c4-7d02-.../asset \ -H "Authorization: Bearer $TOKEN" \ -o beach-signed.jpg # kept, so also public, with no token curl https://api.inteqral.com/v1/assets/urn%3Ac2pa%3A3f1e9a7c-... \ -o beach-signed.jpg
Verify runs the full C2PA validation, here or in any C2PA tool. The hash shows whether anything changed since signing; the certificate shows who signed it.Someone retouched the signed photo and kept its credentials. The signature still checks out, but the hash no longer matches the pixels, so verify answers invalid.The same photo, signed by someone whose certificate is not on the trust list. Nothing changed since signing, so verify answers valid, but who signed it is unconfirmed.
curl https://api.inteqral.com/v1/verify \ -H "Authorization: Bearer $TOKEN" \ -F asset=@beach-signed.jpgbeach-edited.jpgbeach-elsewhere.jpg
Days later, a social network re-encodes the photo and drops its metadata. The copy looks the same, but its Content Credentials are gone, and verify has nothing to read.
{
"error": {
"code": "no_matching_manifest",
"message": "...",
"request_id": "..."
}
}We fingerprinted the photo when we signed it. Resolve compares the copy with every image your account signed and returns the closest manifests. A copy that was only re-encoded or resized is usually within 32.
You chose temporary retention, so the signed copy is gone by now. The trail ends at the manifest, which your account can still open in the console.You chose persisted retention, so the closest candidate leads straight to the signed copy at its public link.
curl https://api.inteqral.com/v1/resolve \ -H "Authorization: Bearer $TOKEN" \ -F asset=@IMG_2041.jpg # then download the signed copy, no token curl https://api.inteqral.com/v1/assets/urn%3Ac2pa%3A3f1e9a7c-... \ -o beach-signed.jpg
Every call with its parameters, responses and errors, and a guide for each step of this page and each integration. While we onboard accounts one at a time, the docs are open on request. They become public once onboarding opens up.
"retention": "persisted" to keep it at a public link, with the original you sent. The manifest is kept either way.code, a message and a request_id you can quote to us.wait holds a call up to 25 seconds. Tokens last an hour.We are onboarding accounts one at a time. Tell us what you want to sign and where, and we will set up your console and your first credential.