Skip to content
OpenRSL Spec

Extension specification.

This directory documents what OpenRSL adds on top of RSL: extension namespaces, JWT claim extensions, payment-backend bindings, and conformance criteria for OpenRSL implementations. RSL itself is not redrafted here.

Schemas use date-pinned versions (e.g. 2026-05-06), compared lexicographically. The current version is 2026-05-06.

Browse spec/ on GitHub
canonical.rsl.xml

rsl.xml with OpenRSL extensions.

A valid OpenRSL rsl.xml declares the openrsl namespace on the root element and adds an openrsl:binding element inside each paid <payment> block. Free content uses <payment type="free"/> with no binding.

canonical.rsl.xml
<?xml version="1.0" encoding="UTF-8"?>
<rsl xmlns="https://rslstandard.org/rsl"
     xmlns:openrsl="https://openrsl.org/ns/extensions">
 
  <content url="/" server="https://olp.example.com">
    <license>
      <permits type="usage">ai-index</permits>
      <prohibits type="usage">ai-train</prohibits>
      <payment type="crawl">
        <amount currency="USD">0.001</amount>
        <openrsl:binding scheme="pds" ref="offer-abc-123"/>
      </payment>
    </license>
  </content>
 
  <content url="/research/" server="https://olp.example.com">
    <license>
      <permits type="usage">ai-train</permits>
      <payment type="training">
        <amount currency="USD">10.00</amount>
        <openrsl:binding scheme="pds" ref="offer-xyz-789"/>
      </payment>
    </license>
  </content>
 
  <content url="/open/">
    <license>
      <permits type="usage">all</permits>
      <payment type="free"/>
    </license>
  </content>
 
</rsl>
binding.schema.json

The binding element.

The openrsl:binding element is the bridge between an RSL license rule and a payment-backend instrument. RSL defines the rule shape; this element names what the OLP server settles against.

pds is the only defined scheme in OpenRSL v1. The ref value is opaque: the OLP server interprets it against the configured payment backend.

The binding claim in the JWT token is unprefixed (not openrsl_binding) because it is scheme-discriminated. All other OpenRSL extension claims use the openrsl_ prefix.

Schema: binding.schema.json
scheme string, enum required

Payment backend identifier. Only defined value in v1: "pds"

ref string, minLength: 1 required

Opaque reference to the payment-backend instrument. Interpreted by the OLP server.

Example
openrsl:binding
<openrsl:binding
  scheme="pds"
  ref="offer-abc-123"
/>
olp-token-claims.schema.json

OLP token JWT claims.

RSL treats the OLP access token as opaque. OpenRSL defines the claim structure inside the JWS. Standard JWT claims are unprefixed per RFC 7519. OpenRSL extension claims use the openrsl_ prefix, except binding which is unprefixed because it is scheme-discriminated.

The Python and TypeScript libraries do not verify tokens: they request and present them as opaque strings. Token verification is the OLP server’s responsibility. See spec/jwt-versions.md for the JWT library registry.

Standard JWT claims (required)
substringrequired

Subject: wallet or buyer identifier

issstringrequired

Issuer: OLP server URL

audstring

Audience: publisher or asset host

iatintegerrequired

Issued at (Unix timestamp)

expintegerrequired

Expiration (Unix timestamp)

jtistringrequired

JWT ID: unique token identifier

OpenRSL extension claims (required)
openrsl_assetstringrequired

Asset URL this token authorizes access to

openrsl_term_classstring, enumrequired

RSL payment type value for this token. See term classes below.

openrsl_license_idstringrequired

Identifier for the matched RSL license rule

openrsl_txidstringrequired

Transaction ID cross-referencing audit events (stdout JSON-line)

bindingobject

Payment-backend binding. Required for all paid term classes. Absent when openrsl_term_class is free.

sample-token-claims.json (paid)
paid token
{
  "sub": "wallet-user-001",
  "iss": "https://olp.example.com",
  "aud": "https://publisher.example.com",
  "iat": 1746576000,
  "exp": 1746662400,
  "jti": "tok-abc-123",
  "openrsl_asset": "https://publisher.example.com/article/1",
  "openrsl_term_class": "crawl",
  "openrsl_license_id": "license-rule-001",
  "openrsl_txid": "txn-def-456",
  "binding": { "scheme": "pds", "ref": "offer-abc-123" }
}
sample-token-claims-free.json
free token
{
  "sub": "wallet-user-002",
  "iss": "https://olp.example.com",
  "exp": 1746662400,
  "jti": "tok-free-001",
  "openrsl_asset": "https://publisher.example.com/open/article/1",
  "openrsl_term_class": "free",
  "openrsl_license_id": "license-rule-open",
  "openrsl_txid": "txn-free-001"
  // no binding claim: free term class
}
rsl-xml-extensions.schema.json

rsl.xml extension schema.

Validates the JSON projection of OpenRSL extension-carrying fields in an rsl.xml document. RSL elements (content, license, permits, prohibits, payment) are RSL-defined. This schema covers OpenRSL additions only.

versionstring, constrequired

Schema version. Must be "2026-05-06" for this version.

payment.termClassstring, enumrequired

RSL payment type. Required-explicit; OLP server returns 422 if absent. Values: purchase, subscription, training, crawl, use, contribution, attribution, free.

payment.bindingobject

Required for all paid term classes. Must conform to binding.schema.json. Absent when termClass is free.

openrsl_term_class

Term class values.

crawl

Standard web crawl or indexing.

training

Use for training a machine learning model.

use

General use, including inference and retrieval.

purchase

One-time purchase of access to a specific asset.

subscription

Recurring access under a subscription arrangement.

attribution

Use requiring attribution in the output.

contribution

Use as a contribution to a shared resource.

free

No payment required. OLP server issues a ticket with no settlement call. No binding claim in token.

Versioning

Date-pinned schemas.

Schema versions are date-pinned (e.g. 2026-05-06) and compared lexicographically. Adding a field is an additive change requiring a coordinated version bump across every library and the OLP server on the same release day.

Schema files live under spec/extensions/ in a directory named by their version. Changes are recorded in spec/CHANGELOG.md.

Files in spec/extensions/2026-05-06/
binding.schema.json
Schema for the openrsl:binding element
olp-token-claims.schema.json
Schema for OLP token JWT claims
rsl-xml-extensions.schema.json
Schema for rsl.xml extension projection
canonical.rsl.xml
Reference rsl.xml with OpenRSL extensions
sample-token-claims.json
Example decoded token payload (paid)
sample-token-claims-free.json
Example decoded token payload (free)
sample-binding.json
Minimal binding object example