The Encypher RTD provider injects C2PA content provenance signals into OpenRTB bid requests at site.ext.data.c2pa. This gives DSPs a cryptographic content-integrity signal they can use for brand safety and inventory quality decisioning.
The module detects whether article content already carries embedded provenance markers (from a CMS plugin, CDN worker, or direct API integration) and verifies them server-side. If no existing provenance is found, it signs the content via the Encypher public API. In both cases the result is injected into the bid request.
No external JavaScript is loaded. The module uses only Prebid.js core imports. Every code path calls callback(). The module never blocks an auction.
Contact engineering@encypher.com for more information.
Compile the Encypher RTD module into your Prebid build:
gulp build -modules=rtdModule,encypherRtdProvider
Add the Encypher RTD provider to your Prebid config:
pbjs.setConfig({
realTimeData: {
auctionDelay: 300,
dataProviders: [{
name: 'encypher',
waitForIt: true,
params: {
// All optional. Free tier works with zero config.
}
}]
}
});
| Name | Scope | Type | Description |
|---|---|---|---|
name |
Required | String | Must be 'encypher' |
waitForIt |
Optional | Boolean | Set to true to delay the auction until provenance data is available. Default: false |
params |
Optional | Object | Configuration parameters (see below) |
params.apiBase |
Optional | String | Override the API base URL (default: https://api.encypher.com). Useful for staging or development environments. |
params.manifestUrl |
Optional | String | Manual manifest URL. When set, the module fetches this URL directly instead of calling the signing API. |
The module runs once per page load through three paths in strict priority:
If a <meta name="c2pa-manifest-url"> tag or params.manifestUrl is present, the module fetches the manifest directly without calling the signing API.
If provenance data for the current page exists in localStorage (30-day TTL, keyed by canonical URL hash), it is served immediately with no network call.
The module extracts article text from the DOM and sends it to the Encypher API. The API detects whether the content already contains embedded C2PA provenance markers:
The result is cached in localStorage and injected into the bid request.
Article text is extracted from the DOM in this priority order:
application/ld+json scripts containing schema.org Article, NewsArticle, BlogPosting, or Report types.<article> element: textContent of the first <article> element.[role="main"] element: textContent of the first element with role="main".Content shorter than 50 characters is skipped. Content longer than 50,000 characters is truncated.
The following object is placed at ortb2Fragments.global.site.ext.data.c2pa:
{
"manifest_url": "https://api.encypher.com/api/v1/public/prebid/manifest/abc123",
"verified": true,
"signer_tier": "connected",
"signed_at": "2026-04-01T10:00:00Z",
"content_hash": "a1b2c3d4e5f6",
"source": "auto",
"extraction_method": "json-ld"
}
| Field | Type | Description |
|---|---|---|
manifest_url |
String | URL to retrieve the C2PA manifest |
verified |
Boolean | true if provenance was successfully verified or signed |
signer_tier |
String | Signing identity tier (see table below) |
signed_at |
String | ISO 8601 timestamp of signing |
content_hash |
String | SHA-256 hash of article text |
source |
String | How provenance was obtained: cms, cache, or auto |
extraction_method |
String | DOM extraction method: json-ld, article-element, or role-main |
The signer_tier field tells DSPs how the content was authenticated:
| Tier | Meaning |
|---|---|
byok |
Publisher signed with their own key (strongest identity) |
connected |
Publisher authenticated with Encypher and signed at publish time |
encypher_free |
Content was auto-signed by Encypher at first pageview (no publisher authentication) |
local |
Manifest fetched from a local or self-hosted endpoint |
DSPs can use this field for differential bidding. Content signed by authenticated publishers carries stronger brand-safety guarantees than content attested by a third party at pageview time.
The free tier provides 1,000 unique content signatures per publisher domain per month. Re-requests for the same content (deduped by content hash) do not count against quota. Verification of already-signed content does not count against quota. When the quota is exceeded, the module continues without injecting provenance data (fail-open).
The module uses Prebid’s getStorageManager for localStorage access, which enforces GDPR/TCF consent. If consent is denied, caching is disabled and Path C (auto-sign) is skipped entirely, so no page content leaves the browser. When consent is granted but caching is unavailable, the module falls back to API calls on each page load. Article text sent to the Encypher API for signing is not stored on Encypher’s servers. Only content hashes and metadata are persisted. A 2-second timeout ensures the module never blocks the auction.