C2PA Implementation Guide
From zero to signed content in five minutes. REST API with Python, TypeScript, Go, and Rust SDKs, all auto-generated from the same OpenAPI spec. Free verification for any C2PA-signed content, no account required.
API Quickstart
Sign text content with a single API call. Get your free API key from the Encypher dashboard (free tier).
Sign Text
# Sign a text document
curl -X POST https://api.encypher.com/api/v1/sign \
-H "Authorization: Bearer ey_your_key_here" \
-H "Content-Type: application/json" \
-d '{"text": "Your article content here.", "metadata": {"author": "Jane Smith", "rights": "bronze"}}'
Sign an Image
# Sign an image file
curl -X POST https://api.encypher.com/api/v1/sign/media \
-H "Authorization: Bearer ey_your_key_here" \
-F "file=@photo.jpg"
Verify (no auth required)
# Verify any C2PA-signed content
curl -X POST https://api.encypher.com/api/v1/verify \
-H "Content-Type: application/json" \
-d '{"text": "Content to verify here."}'
Python SDK
# Install
pip install git+https://github.com/encypherai/sdk-python.git
# Sign text with sentence-level provenance
from encypher import EncypherClient
client = EncypherClient(api_key="ey_your_key_here")
result = client.sign_text(
text="Your article content here.",
author="Jane Smith",
rights="bronze"
)
signed_text = result.text # Contains invisible provenance markers
# Verify
verification = client.verify_text(signed_text)
print(verification.signer, verification.timestamp)
The Python SDK wraps the REST API with typed interfaces for all signing and verification operations. Batch utilities allow processing thousands of documents:
# Batch sign articles from CMS
articles = cms.get_all_articles() # Your CMS client
results = client.sign_batch(
items=[{"text": a.body, "id": a.id} for a in articles],
concurrency=20
)
TypeScript SDK
// Install
npm install encypherai/sdk-typescript
// Sign text content
import { EncypherClient } from '@encypher/sdk';
const client = new EncypherClient({ key: 'ey_your_key_here' });
const result = await client.signText({
text: 'Your article content here.',
author: 'Jane Smith',
rights: 'bronze',
});
// Verify (no API key needed)
const verification = await client.verifyText(result.text);
console.log(verification.signer, verification.timestamp);
The TypeScript SDK provides full type definitions for all API responses. Compatible with Node.js and browser environments. The verification function works without an API key using the public verification endpoint.
Go and Rust SDKs
# Go
go get github.com/encypherai/sdk-go
# Rust
cargo add --git https://github.com/encypherai/sdk-rust
All four SDKs (Python, TypeScript, Go, and Rust) are auto-generated from the same OpenAPI spec at github.com/encypherai/sdk-python, sdk-typescript, sdk-go, and sdk-rust, so they stay in sync with the API. Full endpoint documentation lives in the API reference.
CMS Integration Patterns
The most common integration pattern is signing at publish time via a CMS webhook. When an article is published, the CMS fires a webhook to your signing service, which calls the Encypher API and updates the stored article with the signed version.
WordPress
Hook into the publish_post action. Call the Encypher signing API with the post content. Update the post with the signed content before the response is sent.
Contentful / Headless CMS
Subscribe to the ContentPublished webhook. In the handler, retrieve the content, sign it, and update the entry via the Management API. The signed version is served to readers.
Next.js / Static Generation
Sign content in getStaticProps or at build time. The signed content is baked into the static output. No runtime signing required for static sites.
Signing Options Reference
| Parameter | Type | Description |
|---|---|---|
| text / file | string / file | Content to sign. Text for articles; multipart file for media. |
| author | string | Author name or identifier. Included in manifest assertion. |
| rights | bronze | silver | gold | Machine-readable rights tier for AI licensing. |
| encoding | vs | zwc | VS markers (default) or ZWC markers (Word-safe). Text only. |
| sentence_level | boolean | Enable Merkle tree per-sentence authentication. Default true. |
| fingerprint | string | Recipient ID for distribution fingerprinting. Enterprise tier only. |
Free Tier and Limits
The free tier provides unlimited signing for normal publishing use (fair-use guardrails apply), including 10,000 AI-output assets per month. Verification is unlimited and free at all tiers including without any account. The free tier includes full API access, all four SDK libraries, and sentence-level Merkle tree authentication.
Paid tiers unlock higher volume limits, multi-media signing, fingerprinting, batch endpoints, and enterprise features including BYOK and on-premises deployment. See pricing for tier details.
Related Resources
Start Building
Free API key and free signing for normal publishing use. Verification is always free.