Skip to content

ramp.json Example

The ramp.json file is served at /.well-known/ramp.json and carries a WellKnownManifest. Every RAMP participant serves one — the role field says which (ROLE_PUBLISHER, ROLE_EXCHANGE, ROLE_AGENT, ROLE_BROKER). The example below is a publisher manifest (role=ROLE_PUBLISHER): it carries the provider’s signing keys and declares which Exchanges are authorized to sell its resources — like ads.txt for AI resource access.

{
"ver": "1.0",
"role": "ROLE_PUBLISHER",
"domain": "techprovider.com",
"contact": "licensing@techprovider.com",
"public_keys": [
{
"kid": "techprovider-2026-q2",
"kty": "OKP",
"crv": "Ed25519",
"use": "sig",
"alg": "EdDSA",
"x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo",
"not_before": "2026-04-01T00:00:00Z",
"not_after": "2026-10-01T00:00:00Z"
}
],
"invalidation_url": "https://techprovider.com/.well-known/ramp-invalidations.json",
"catalog_contributors": [
{
"domain": "doubleverify.com",
"relationship": "verifier"
},
{
"domain": "gumgum.com",
"relationship": "verifier"
}
],
"exchanges": [
{
"domain": "exchange.ssp-alpha.com",
"endpoint": "https://exchange.ssp-alpha.com/v1",
"relationship": "DIRECT"
},
{
"domain": "exchange.ssp-beta.com",
"endpoint": "https://exchange.ssp-beta.com/v1",
"relationship": "RESELLER"
}
]
}
FieldTypeRequiredDescription
verstringYesRAMP protocol version ("1.0")
rolestringYesParticipant role — ROLE_PUBLISHER for a provider’s manifest
domainstringYesCanonical domain serving this manifest
contactstringNoContact email for licensing inquiries
public_keysarrayYesInline RFC 7517 JWKs (Ed25519) for signature verification; ≥1 valid at serve time
public_keys[].kidstringYesKey ID, referenced by kid in request/offer signatures
public_keys[].not_before / [].not_afterstringYesRFC3339 validity window (half-open [not_before, not_after))
invalidation_urlstringNoEmergency key-revocation list URL (KeyInvalidationList); serve short/no-store
catalog_contributorsarrayNoAuthorized third-party catalog pushers
catalog_contributors[].domainstringYesCanonical domain of the contributor (e.g., doubleverify.com)
catalog_contributors[].relationshipstringYesRelationship type: verifier, exchange, etc.
exchangesarrayYes*Authorized Exchanges (*publisher manifests)
exchanges[].domainstringYesCanonical domain of the Exchange
exchanges[].endpointstringYesRAMP ExchangeService endpoint URL
exchanges[].relationshipstringYesDIRECT or RESELLER (mirrors ads.txt)

The agent checks /.well-known/ramp.json before attempting to access content:

1. Agent wants content from techprovider.com
2. GET https://techprovider.com/.well-known/ramp.json
3. Finds Exchange endpoint: exchange.ssp-alpha.com/v1
4. Calls DiscoverResources → gets Offers with pricing
5. Calls ExecuteTransaction → gets signed URL
6. Fetches content from CDN

If the agent doesn’t know about RAMP and tries to crawl directly:

1. Agent hits techprovider.com/premium/article
2. Edge function returns 403 + X-Content-Rules header
3. Agent discovers ramp.json from the header
4. Follows standard RAMP flow from step 2 above
RelationshipDescriptionAd-Tech Equivalent
DIRECTProvider has a direct contract with this Exchangeads.txt DIRECT
RESELLERExchange resells content via another authorized partyads.txt RESELLER

The Exchange periodically re-fetches ramp.json for each provider’s domain. If the Exchange is removed from a provider’s ramp.json, the tenant is revoked and offers stop being served. This provides ongoing verification, not just onboarding.

The ramp.json structure maps to the WellKnownManifest message (with role=ROLE_PUBLISHER) in ramp/v1/ramp.proto. Publisher-relevant fields shown; see Proto: RAMP v1 for the full message (exchange-only capability fields, etc.):

message WellKnownManifest {
string ver = 1; // "1.0"
Role role = 2; // ROLE_PUBLISHER here
string domain = 3;
optional string contact = 4;
repeated JsonWebKey public_keys = 5; // inline Ed25519 JWKs
optional string invalidation_url = 6; // emergency revocation list
repeated AuthorizedExchange exchanges = 7; // publisher-only
repeated CatalogContributor catalog_contributors = 8;
// ... exchange-only capability fields (9-27) omitted ...
google.protobuf.Struct ext = 15;
}
message JsonWebKey {
string kid = 1;
string kty = 2; // "OKP"
string crv = 3; // "Ed25519"
string use = 4; // "sig"
string alg = 5; // "EdDSA"
string x = 6; // base64url 32-byte public key
string not_before = 7; // RFC3339
string not_after = 8; // RFC3339
}
message AuthorizedExchange {
string domain = 1;
string endpoint = 2;
ProviderRelationship relationship = 3;
}
// Third party authorized to push catalog metadata on behalf of a provider.
message CatalogContributor {
string domain = 1; // e.g., "doubleverify.com"
string relationship = 2; // e.g., "verifier", "exchange"
}
enum Role {
ROLE_UNSPECIFIED = 0;
ROLE_AGENT = 1;
ROLE_EXCHANGE = 2;
ROLE_BROKER = 3;
ROLE_PUBLISHER = 4;
}
enum ProviderRelationship {
PROVIDER_RELATIONSHIP_UNSPECIFIED = 0;
PROVIDER_RELATIONSHIP_DIRECT = 1;
PROVIDER_RELATIONSHIP_RESELLER = 2;
}