License API
Confidential. Do not share without explicit permission.
Introduction
The RSL Platform License API enables AI labs and other technology companies to obtain rights to use the content assets of millions of online publishers and content creators in AI applications through a single licensing relationship with the RSL Collective, and to satisfy the associated usage reporting and payment obligations under that relationship.
Design principles
Scalability. Supports repertoires containing up to 1 billion content scope declarations.
Bulk synchronization. Uses complete repertoire snapshots and batch usage report and payment files instead of per-object mutations, reducing integration and operational complexity at scale.
Isolated workflows. Separates repertoire delivery, usage reporting, and payment reporting from downstream settlement and disbursement workflows outside the License API.
Auditability. Captures repertoire snapshots, usage report versions, payment reporting records, and request identifiers in a form suitable for reconciliation, support, and dispute resolution.
Controlled lifecycle management. Uses explicit schema versioning, upload test validation, and sandbox-production isolation to support safe testing and rollout of reporting and payment workflows.
Operations and resilience. Supports explicit heartbeats, asynchronous job states, resumable file downloads, and idempotent requests.
Bulk file management
See the Files API for the shared objects used by the License API for uploading and downloading files:
Uploadobject: manages the upload and validation workflow used to create a file objectFileobject: represents a managed file and its metadataResultobject: describes the outcome of uploading and validating a file
Base URL
- Production:
https://api.rslcollective.org/license/v1 - Sandbox:
https://sandbox.api.rslcollective.org/license/v1
Operational heartbeats
The License API defines heartbeat requirements to help Licensees confirm that their production integration with the License API is still operational. Active Licensees must successfully call at least one License API endpoint every 24 hours using valid production credentials, and any successful License API request with valid credentials satisfies the heartbeat requirement.
If the heartbeat expires, the RSL Platform sends an operational alert to the operations email address configured in the license developer dashboard. The expired condition remains in effect until a subsequent License API request completes successfully.
Operational limits
The following operational limits apply to the License API:
| Limit | Value |
|---|---|
| Maximum rows per repertoire file | 1 billion rows |
| Maximum repertoire file size | 10 GB |
| Maximum rows per report file | 100 million rows |
| Maximum report file size | 5 GB |
| Maximum rows per payment file | 10 million rows |
| Maximum payment file size | 5 GB |
| Minimum retention for repertoire files | 12 months |
| Minimum retention for report files | 12 months |
| Minimum retention for payment files | 12 months |
| Minimum retention for indexnow files | 12 months |
| Minimum retention for result files | 24 hours |
| Minimum temporary upload URL validity | 24 hours |
| Minimum temporary download URL validity | 24 hours |
If a request exceeds an applicable operational limit, the API returns the error limit_exceeded.
Core concepts
Core terms
| Term | Definition |
|---|---|
| RSL Collective | The collective rights organization that administers the RSL collective licensing program. |
| RSL Platform | The software platform that powers the RSL Collective’s enrollment, repertoire, reporting, and payment workflows. |
| RSL Collective License | A collectively negotiated license defined by the RSL Collective that specifies commercial terms used for settlement and payment calculation. |
| Publisher | A rights holder who makes Content Scopes available for collective licensing under RSL through an Enrollment Partner. |
| Content Scope | A set of content assets, such as a website, a site section, or a dataset, governed by a single RSL license declaration that a Publisher makes available for licensing through the RSL Collective. |
| Licensee | An entity that has entered into a collective licensing agreement with the RSL Collective and is authorized to use licensed Content Scopes in AI applications, subject to usage reporting and payment obligations. |
| Licensee Repertoire | The set of Content Scopes that the RSL Platform makes available to a Licensee for use under the RSL Collective License. |
| Reporting Period | The reporting time interval covered by a Report File, as defined by the RSL Collective License. |
| IndexNow File | A file that declares URL-level changes within previously declared Content Scopes. |
| Disbursement Agent | An independent payment agent that manages Disbursement Accounts and processes licensing payments. |
| Disbursement Account | An approved account to which the Licensee initiates licensing payments. |
Content scopes
A Content Scope represents a set of content assets, such as a website, a site section, or a dataset, governed by a single RSL license declaration that a publisher makes available for licensing through the RSL Collective. Each content scope is identified by a scope_url that represents the location of licensed content governed by the RSL Collective License.
A content scope does not necessarily enumerate every covered content asset in the repertoire file. Instead, the Licensee uses the scope_url to locate and interpret the associated RSL license declaration, and uses that declaration to determine which content assets are covered by the scope.
Examples of content scopes governed by an RSL license declaration include:
- A website root (
https://example.com/) whose RSL declaration applies to the site or a defined portion of the site - An RSS feed (
https://example.com/feed.xml) whose RSL declaration applies to the feed and its referenced content - A web page or content file containing an embedded RSL license declaration that applies to that page or file
License declarations
To be included in the repertoire, each enrolled content scope must be governed by an RSL license declaration that references the RSL Collective License in the <standard> element of the <license> block.
Licensees use the RSL license declaration associated with a content scope to identify the content assets covered by that scope and to determine how those assets may be used under the applicable RSL Collective License terms.
...
<license>
<permits type="usage">ai-all</permits>
<payment>
<standard>https://rslcollective.org/license</standard>
</payment>
</license>
...See also RSL Standard, Section 3.8: Standard shared licensing frameworks.
License flow
Repertoire retrieval. The Licensee periodically retrieves its repertoire through the
/repertoiresendpoints to determine which content scopes are currently available for use under the RSL Collective License.Repertoire synchronization. As new repertoire snapshots become available, the Licensee replaces its previous operational repertoire with the current repertoire of record.
URL-level change intake. The Licensee periodically retrieves IndexNow files through the
/indexnowsendpoints and applies those URL-level changes to its current repertoire.Content scope resolution. For each content scope it intends to use, the Licensee uses the
scope_urlto locate and interpret the associated RSL license declaration, identify the content assets covered by that scope, and determine whether the declaration references the applicable RSL Collective License.Licensed content use. The Licensee accesses and uses covered content assets in accordance with the applicable RSL Collective License terms.
Usage reporting. For each reporting period, the Licensee submits a Report File through the
/reportsendpoints describing its usage of licensed content scopes during that reporting period.Payment reporting. For each billing period, the Licensee initiates one or more payments to a Disbursement Account managed by a Disbursement Agent and reports those payments through the
/paymentsendpoints.
The Repertoire object
A repertoire object represents a complete repertoire snapshot available to the licensee. The object provides the metadata needed to download the file that contains that snapshot.
The object uses a complete repertoire snapshot instead of per-object mutations to avoid synchronization errors, simplify large-scale integrations, and reduce operational complexity.
Attributes
| Name | Type | Required | Description |
|---|---|---|---|
file | object | Yes | File object for the corresponding repertoire snapshot. |
Retrieve a repertoire
Returns the repertoire object for the specified id. The repertoire object includes a temporary presigned file.url for downloading the corresponding repertoire file.
Endpoint
GET /repertoires/{id}Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | file.id of the repertoire object to retrieve. |
Response fields
| Name | Type | Description |
|---|---|---|
repertoire | object | Repertoire object for the requested repertoire. |
Example response
{
"repertoire": {
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774224000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2097152,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_f7Lp2Vx9qM4nT8rC3wK6yH1d.csv.gz",
"url_expires": 1774310400,
"validate_only": false
}
}
}List all repertoires
Returns a list of available repertoire objects in reverse chronological order. The repertoire file with the most recent file.created timestamp is the current repertoire of record. When a new repertoire is published, it becomes the repertoire of record and replaces the previous one.
To retrieve a specific repertoire object directly, use GET /repertoires/{id}.
Endpoint
GET /repertoiresQuery parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Maximum number of repertoire objects to return. |
starting_after | string | No | file.id of the last repertoire object from the previous page. |
Response fields
| Name | Type | Description |
|---|---|---|
repertoires | array of objects | List of repertoire objects. Each array item contains a repertoire object. |
has_more | boolean | Whether additional repertoire objects are available. |
Example response
{
"repertoires": [
{
"repertoire": {
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774224000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2097152,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_f7Lp2Vx9qM4nT8rC3wK6yH1d.csv.gz",
"url_expires": 1774310400,
"validate_only": false
}
}
},
{
"repertoire": {
"file": {
"id": "file_P7mT3vX9qR4nK8yC2wL6dH1z",
"created": 1774220400,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "a26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_P7mT3vX9qR4nK8yC2wL6dH1z.csv.gz",
"url_expires": 1774306800,
"validate_only": false
}
}
}
],
"has_more": false
}Repertoire file
A repertoire file represents the RSL Collective's licensable repertoire at a point in time. Each row defines a licensed content scope currently available to the licensee under the RSL Collective License.
Repertoire CSV files are UTF-8 encoded, include a header row, and define the following columns:
| Column | Type | Required | Limit | Description |
|---|---|---|---|---|
license_id | string | Yes | 40 chars | Stable RSL Collective-defined identifier for the licensed content scope identified by scope_url. |
publisher_url | string | Yes | 512 chars | Canonical URL representing the publisher of the content scope. |
scope_url | string | Yes | 512 chars | Canonical URL representing the licensed content scope. |
collective_license_id | string | Yes | 40 chars | Identifier of the RSL Collective License governing use of the content scope. |
Each license_id value and each scope_url value is unique.
Example Repertoire File
license_id,publisher_url,scope_url,collective_license_id
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com,https://example.com/,cl_001
licn_f7Lp2Vx9qM4nT8rC3wK6yH1d,https://example.com,https://example.com/feed.xml,cl_001
licn_M4xq8Rk2Vn7pT5cY9wL1bD6h,https://news.example.org,https://news.example.org/,cl_001The Report object
A report object represents a licensee’s usage report for a specified reporting period.
Attributes
| Name | Type | Required | Description |
|---|---|---|---|
period_start | string (YYYY-MM-DD) | Yes | Inclusive start date of the reporting period in UTC. |
period_end | string (YYYY-MM-DD) | Yes | Inclusive end date of the reporting period in UTC. |
upload | object | Yes | Upload object for the corresponding report file. |
Create a report
To submit a report file for a reporting period, a licensee creates a report object for that reporting period. The request returns a report object containing the upload object for that file.
If a licensee creates a new report object for a reporting period that already has a report of record, the new report object supersedes the prior report of record for that reporting period.
Endpoint
POST /reportsBody parameters
| Name | Type | Required | Description |
|---|---|---|---|
period_start | string (YYYY-MM-DD) | Yes | Inclusive start date of the reporting period in UTC. |
period_end | string (YYYY-MM-DD) | Yes | Inclusive end date of the reporting period in UTC. |
file | object | Yes | File metadata for the corresponding report file. |
Response fields
| Name | Type | Description |
|---|---|---|
report | object | Report object for the upload workflow. |
Example request
{
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"file": {
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"validate_only": false
}
}Example response
{
"report": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_9aK2mQ7xT4vN8pR3cW6yZ1bD",
"status": "ready",
"created": 1774225000,
"updated": null,
"completed": null,
"result_url": null,
"result_url_expires": null,
"result_sha256": null,
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774225000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"url_expires": 1774311400,
"validate_only": false
}
}
}
}Retrieve a report
Returns the report object for the specified id. Licensees can use this endpoint to monitor the status of uploading and validating a report file.
When the upload object reaches a terminal state, the upload.result_url field provides a temporary presigned URL for downloading the corresponding report result object.
Endpoint
GET /reports/{id}Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | upload.id of the report object to retrieve. |
Response fields
| Name | Type | Description |
|---|---|---|
report | object | Report object for the requested report. |
Example response
{
"report": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_9aK2mQ7xT4vN8pR3cW6yZ1bD",
"status": "failed",
"created": 1774225000,
"updated": 1774226200,
"completed": 1774226200,
"result_url": "https://files.rslcollective.org/file_R8nK3vT1qM6xP9cY4wL2dH7z.json",
"result_url_expires": 1774312600,
"result_sha256": "f26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b9",
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774225000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
}Report result file
Report uploads return a standard result file. The following additional License API-specific row-level error_code values may appear for report uploads:
| Value | Description | Action |
|---|---|---|
out_of_period | report_date falls outside the Reporting Period declared on the enclosing Report object. | Upload rejected |
invalid_product_code | product_code is not a supported RSL product code. | Upload rejected |
invalid_country | country is not a valid ISO 3166-1 alpha-2 country code. | Upload rejected |
Use the shared Files API row-level error codes wherever applicable, including:
duplicate_keyfor a duplicate(license_id, report_date, product_code, country, role, use_type, brand_attributed)tupleunknown_referencewhenlicense_iddoes not identify a content scope in the licensee's repertoire, orscope_urldoes not match the referenced content scope
Failed report result file example
{
"result": {
"id": "job_9aK2mQ7xT4vN8pR3cW6yZ1bD",
"status": "failed",
"error_code": "validation_failed",
"rows_processed": 13,
"rows_skipped": 0,
"errors": [
{
"row_number": 14,
"column": "report_date",
"error_code": "out_of_period",
"error_description": "report_date falls outside the declared reporting period."
}
]
}
}List all reports
Returns a list of available report objects in reverse chronological order. For a given reporting period, the most recent report object with upload.file.validate_only = false and upload.status = "succeeded" is the report of record for that period.
To retrieve a specific report object directly, use GET /reports/{id}.
Endpoint
GET /reportsQuery parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Maximum number of report objects to return. |
starting_after | string | No | upload.id of the last report object from the previous page. |
Response fields
| Name | Type | Description |
|---|---|---|
reports | array of objects | List of report objects. Each array item contains a report object. |
has_more | boolean | Whether additional report objects are available. |
Example response
{
"reports": [
{
"report": {
"period_start": "2026-04-01",
"period_end": "2026-04-30",
"upload": {
"id": "job_9aK2mQ7xT4vN8pR3cW6yZ1bD",
"status": "processing",
"created": 1774312000,
"updated": 1774312060,
"completed": null,
"result_url": null,
"result_url_expires": null,
"result_sha256": null,
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774312000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
},
{
"report": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_M4xq8Rk2Vn7pT5cY9wL1bD6h",
"status": "succeeded",
"created": 1774225000,
"updated": 1774226200,
"completed": 1774226200,
"result_url": "https://files.rslcollective.org/file_R8nK3vT1qM6xP9cY4wL2dH7z.json",
"result_url_expires": 1774312600,
"result_sha256": "f26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b9",
"file": {
"id": "file_P7mT3vX9qR4nK8yC2wL6dH1z",
"created": 1774225000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 2096128,
"sha256": "a26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
}
],
"has_more": false
}Report file
A Report File represents the aggregated contribution activity from the licensed repertoire for a specific reporting period. Each row reports contribution events for a single UTC reporting date and a single set of reporting dimensions.
Report terms
| Term | Definition |
|---|---|
| AI Output | A response, answer, generated item, or other user-facing result produced by a Licensee’s AI product. The License Report does not include output text. |
| Contribution | A source contribution from any digital asset within a licensed Content Scope in the Licensee Repertoire, identified by the Licensee as contributing to an AI Output before applying the Top Contributors Rule. |
| Top Contributors Rule | The rule, defined by the RSL Collective License, that determines which Contributions from licensed Content Scopes are included in the License Report. |
| Contribution Event | A Contribution from any digital asset within a licensed Content Scope that is selected by the Top Contributors Rule for an AI Output. |
| Role | The reporting classification that describes the relative importance of a Contribution to an AI Output. |
| Use Type | The reporting classification that describes how a Contribution was used in connection with an AI Output. |
| Brand Attribution | The reporting classification that indicates whether the source brand was explicitly surfaced in the AI Output. |
The report file includes only Contribution Events selected under the Top Contributors Rule defined by the RSL Collective License. Contributions that are not selected under that rule are not included in the Report File.
Report CSV files must be UTF-8 encoded and include a header row. The header row must contain the required column names defined below, and columns may appear in any order.
| Column | Type | Required | Limit | Description |
|---|---|---|---|---|
license_id | string | Yes | 40 chars | Stable RSL Collective-defined identifier for the Content Scope identified by scope_url. |
scope_url | string | Yes | 512 chars | Canonical URL representing the Content Scope. |
report_date | string (YYYY-MM-DD) | Yes | 10 chars | UTC date covered by the reported contribution activity. Must fall within the Reporting Period declared on the enclosing Report object. |
product_code | string | Yes | 2 chars | Two-digit product code, from 01 through 99, defined in the RSL Collective License for the product category in which the Contribution Event occurred. |
country | string | Yes | 2 chars | ISO 3166-1 alpha-2 country code for the country associated with the Contribution Events. |
role | enum | Yes | n/a | Role assigned to the Contribution Events. Valid values are primary, co_primary, supporting, and incidental. |
use_type | enum | Yes | n/a | Use type assigned to the Contribution Events. Valid values are direct, adapted, and background. |
brand_attributed | boolean | Yes | n/a | Whether the source brand was explicitly surfaced in the AI Output for the Contribution Events. |
contribution_count | integer | Yes | n/a | Number of Contribution Events represented by the row. Must be greater than zero. |
output_count | integer | No | n/a | Number of distinct AI Outputs represented by the row, if available. If multiple Contribution Events in the row occurred in the same AI Output, count that AI Output once. |
evidence_reference | string | No | 200 chars | Optional Licensee-defined reference to retained evidence supporting the row. |
Each (license_id, report_date, product_code, country, role, use_type, brand_attributed) tuple must be unique.
Count aggregation
For each row, report contribution_count as the total number of Contribution Events that match the row’s reporting dimensions.
Report output_count as the number of distinct AI Outputs represented by those Contribution Events. If multiple Contribution Events in the row occurred in the same AI Output, count that AI Output once in output_count.
Example:
A Content Scope has matching Contribution Events across 80 distinct AI Outputs for the same reporting date, product code, country, role, use type, and brand-attribution status.
- 70 AI Outputs contain 1 matching Contribution Event.
- 10 AI Outputs contain 2 matching Contribution Events.
The row reports:
| Field | Value |
|---|---|
contribution_count | 90 |
output_count | 80 |
Example Report File
license_id,scope_url,report_date,product_code,country,role,use_type,brand_attributed,contribution_count,output_count,evidence_reference
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com/,2026-03-01,01,US,primary,adapted,true,125000,124500,evid_2026_03_001
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com/,2026-03-01,01,US,supporting,background,false,420000,410200,evid_2026_03_002
licn_f7Lp2Vx9qM4nT8rC3wK6yH1d,https://news.example.org/,2026-03-01,01,US,co_primary,direct,true,90000,89950,evid_2026_03_003
licn_h8Lp2Vx9qM4nT8rC3wK6yH1d,https://reference.example/,2026-03-01,03,GB,supporting,direct,false,64000,63200,evid_2026_03_004
licn_m4Qp9Vx2rN7tK3cY8wL1dH6z,https://developer.example/docs,2026-03-02,05,CA,primary,background,false,210000,198000,evid_2026_03_005The Payment object
A payment object represents a Licensee’s upload of a payment file reporting one or more payments the Licensee initiated to satisfy licensing fee obligations.
The period_start and period_end fields describe the UTC date interval of the billing, invoice, or reporting period that the Licensee associates with the reported payment file.
Attributes
| Name | Type | Required | Description |
|---|---|---|---|
period_start | string (YYYY-MM-DD) | Yes | Inclusive UTC start date of the billing, invoice, or reporting period the Licensee associates with the reported payment. |
period_end | string (YYYY-MM-DD) | Yes | Inclusive UTC end date of the billing, invoice, or reporting period the Licensee associates with the reported payment. |
upload | object | Yes | Upload object for the corresponding payment file upload workflow. |
Create a payment
To submit a payment file, a licensee creates a payment object. The request returns a payment object containing the upload object for that file.
Payment objects are additive and do not replace prior payment objects.
Endpoint
POST /paymentsBody parameters
| Name | Type | Required | Description |
|---|---|---|---|
period_start | string (YYYY-MM-DD) | Yes | Inclusive UTC start date of the billing, invoice, or reporting period the Licensee associates with the reported payment. |
period_end | string (YYYY-MM-DD) | Yes | Inclusive UTC end date of the billing, invoice, or reporting period the Licensee associates with the reported payment. |
file | object | Yes | File metadata for the corresponding payment file. |
Response fields
| Name | Type | Description |
|---|---|---|
payment | object | Payment object for the upload workflow. |
Example request
{
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"file": {
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 131072,
"sha256": "c26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"validate_only": false
}
}Example response
{
"payment": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_P7mT3vX9qR4nK8yC2wL6dH1z",
"status": "ready",
"created": 1774227000,
"updated": null,
"completed": null,
"result_url": null,
"result_url_expires": null,
"result_sha256": null,
"file": {
"id": "file_Q8Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774227000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 131072,
"sha256": "c26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_Q8Lp2Vx9qM4nT8rC3wK6yH1d",
"url_expires": 1774313400,
"validate_only": false
}
}
}
}Retrieve a payment
Returns the payment object for the specified id. Licensees can use this endpoint to monitor the status of uploading and validating a payment file.
When the upload object reaches a terminal state, the upload.result_url field provides a temporary presigned URL for downloading the corresponding payment result file.
Endpoint
GET /payments/{id}Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | upload.id of the payment object to retrieve. |
Response fields
| Name | Type | Description |
|---|---|---|
payment | object | Payment object for the requested payment upload. |
Example response
{
"payment": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_P7mT3vX9qR4nK8yC2wL6dH1z",
"status": "succeeded",
"created": 1774227000,
"updated": 1774227600,
"completed": 1774227600,
"result_url": "https://files.rslcollective.org/file_S8nK3vT1qM6xP9cY4wL2dH7z.json",
"result_url_expires": 1774314000,
"result_sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b9",
"file": {
"id": "file_Q8Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774227000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 131072,
"sha256": "c26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
}Payment result file
Payment uploads return a standard result file. The License API uses shared Files API row-level error codes wherever applicable, including:
duplicate_keyfor a duplicateexternal_payment_referencevalue within the uploaded fileunknown_referencewhendisbursement_account_referencedoes not identify an approved Disbursement Account
No additional License API-specific payment row-level error codes are defined.
List all payments
Returns a list of available payment objects in reverse chronological order. Payment objects are additive and do not replace prior payment objects.
To retrieve a specific payment object directly, use GET /payments/{id}.
Endpoint
GET /paymentsQuery parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Maximum number of payment objects to return. |
starting_after | string | No | upload.id of the last payment object from the previous page. |
Response fields
| Name | Type | Description |
|---|---|---|
payments | array of objects | List of payment objects. Each array item contains a payment object. |
has_more | boolean | Whether additional payment objects are available. |
Example response
{
"payments": [
{
"payment": {
"period_start": "2026-04-01",
"period_end": "2026-04-30",
"upload": {
"id": "job_P7mT3vX9qR4nK8yC2wL6dH1z",
"status": "processing",
"created": 1774315000,
"updated": 1774315060,
"completed": null,
"result_url": null,
"result_url_expires": null,
"result_sha256": null,
"file": {
"id": "file_Q8Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774315000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 131072,
"sha256": "c26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
},
{
"payment": {
"period_start": "2026-03-01",
"period_end": "2026-03-31",
"upload": {
"id": "job_R4xq8Rk2Vn7pT5cY9wL1bD6h",
"status": "succeeded",
"created": 1774227000,
"updated": 1774227600,
"completed": 1774227600,
"result_url": "https://files.rslcollective.org/file_T8nK3vT1qM6xP9cY4wL2dH7z.json",
"result_url_expires": 1774314000,
"result_sha256": "e26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b9",
"file": {
"id": "file_U8Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774227000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 98304,
"sha256": "f26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": null,
"url_expires": null,
"validate_only": false
}
}
}
}
],
"has_more": false
}Payment file
A payment file reports one or more payments the Licensee initiated to one or more approved Disbursement Accounts for the billing, invoice, or reporting interval identified by the enclosing payment object. Each row defines one initiated payment.
Within a payment file, each (disbursement_account_reference, external_payment_reference) pair must be unique. If the same pair appears more than once in the uploaded file, the upload fails with duplicate_key.
Across accepted payment files for the same Licensee, the RSL Platform treats (disbursement_account_reference, external_payment_reference) as an idempotent payment reference. A duplicate pair in a later accepted payment file is rejected with duplicate_key.
Payment CSV files are UTF-8 encoded, include a header row, and define the following columns:
| Column | Type | Required | Limit | Description |
|---|---|---|---|---|
disbursement_account_reference | string | Yes | 100 chars | Approved reference for the Disbursement Account to which the payment was initiated. |
payment_timestamp | timestamp | Yes | n/a | UTC Unix timestamp when the payment was initiated by the Licensee. |
currency | currency | Yes | - | Currency of the initiated payment. |
amount | amount | Yes | - | Amount of the initiated payment. |
external_payment_reference | string | Yes | 100 chars | Payment or transaction reference assigned by the Licensee or banking rail. |
originator_account_reference | string | No | 100 chars | Originator account reference used by the Licensee, if available. |
remittance_reference | string | No | 200 chars | Remittance or payment reference sent with the payment, if any. |
invoice_reference | string | No | 100 chars | RSL invoice or payment reference associated with the payment, if available. |
Example Payment File
disbursement_account_reference,payment_timestamp,currency,amount,external_payment_reference,originator_account_reference,remittance_reference,invoice_reference
acct_main_001,1776211200,USD,2500000000,wire_out_001,orig_acct_001,March 2026 royalty payment,inv_2026_03_example2
acct_main_002,1776211800,USD,1750000000,wire_out_002,orig_acct_002,March 2026 royalty payment,inv_2026_03_exampleThe IndexNow object
An indexnow object represents a set of URL-level change notifications within previously declared licensed content scopes, allowing licensees to receive URL-level changes directly instead of needing to detect those changes by re-fetching licensed content scopes. Each change notification specifies that a URL within a previously declared licensed content scope has been added, updated, deleted, or removed, and follows the conventions of the IndexNow protocol.
IndexNow objects provide incremental, ordered updates, and must be applied in order from oldest to newest based on file.created. They do not declare new content scopes or replace the repertoire.
Attributes
| Name | Type | Required | Description |
|---|---|---|---|
file | object | Yes | File object for the corresponding indexnow file. |
Retrieve an IndexNow
Returns the indexnow object for the specified id. The indexnow object includes a temporary presigned file.url for downloading the corresponding indexnow file.
Endpoint
GET /indexnows/{id}Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | file.id of the indexnow object to retrieve. |
Response fields
| Name | Type | Description |
|---|---|---|
indexnow | object | IndexNow object for the requested indexnow. |
Example response
{
"indexnow": {
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774224000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 1048576,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_f7Lp2Vx9qM4nT8rC3wK6yH1d.csv.gz",
"url_expires": 1774310400,
"validate_only": false
}
}
}List all IndexNows
Returns a list of available indexnow objects in reverse chronological order. Clients must apply indexnow files in order from oldest to newest based on file.created.
To retrieve a specific indexnow object directly, use GET /indexnows/{id}.
Endpoint
GET /indexnowsQuery parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Maximum number of indexnow objects to return. |
starting_after | string | No | file.id of the last indexnow object from the previous page. |
Response fields
| Name | Type | Description |
|---|---|---|
indexnows | array of objects | List of indexnow objects. Each array item contains an indexnow object. |
has_more | boolean | Whether additional indexnow objects are available. |
Example response
{
"indexnows": [
{
"indexnow": {
"file": {
"id": "file_f7Lp2Vx9qM4nT8rC3wK6yH1d",
"created": 1774224000,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 1048576,
"sha256": "d26b94ae60e4554c7333034960d2146f3801f42a7516a566a014a2f1e6d9c3b7",
"url": "https://files.rslcollective.org/file_f7Lp2Vx9qM4nT8rC3wK6yH1d.csv.gz",
"url_expires": 1774310400,
"validate_only": false
}
}
},
{
"indexnow": {
"file": {
"id": "file_P7mT3vX9qR4nK8yC2wL6dH1z",
"created": 1774220400,
"format": "csv",
"schema_version": "1.0",
"compression": "gzip",
"size": 1047552,
"sha256": "b83c1f4e92d7a6c5e1f0438b7c2d9e6a4f1b8c7d5e2a9f3c6b1d4e7f8a2c5d9",
"url": "https://files.rslcollective.org/file_P7mT3vX9qR4nK8yC2wL6dH1z.csv.gz",
"url_expires": 1774306800,
"validate_only": false
}
}
}
],
"has_more": false
}IndexNow file
An indexnow file defines URL-level changes within previously declared content scopes. Each row defines a change for one URL within a licensed content scope. Rows in an indexnow file must be processed sequentially from top to bottom to apply changes in the correct order.
IndexNow CSV files are UTF-8 encoded, include a header row, and define the following columns:
| Column | Type | Required | Limit | Description |
|---|---|---|---|---|
license_id | string | Yes | 40 chars | Stable RSL Collective-defined identifier for the licensed content scope identified by scope_url. |
publisher_url | string | Yes | 512 chars | Canonical URL representing the publisher associated with the licensed content scope. This field is informational. |
scope_url | string | Yes | 512 chars | Canonical URL of the licensed content scope containing the URL. |
url | string | Yes | 512 chars | Canonical URL of the content being changed. |
change | enum | Yes | 16 chars | added, updated, deleted, or removed. |
timestamp | integer | Yes | 10 chars | UTC Unix timestamp when the URL-level change occurred. |
Change values
| Change | Description |
|---|---|
added | The URL is newly available within an existing licensed content scope. |
updated | The URL remains available within the licensed content scope, but its content has changed materially. |
deleted | The URL is no longer available due to an ordinary deletion. |
removed | The URL is no longer available due to a rights, legal, safety, or compliance-driven removal. |
Example IndexNow file
license_id,publisher_url,scope_url,url,change,timestamp
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com,https://example.com/,https://example.com/articles/example-1,removed,1774223900
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com,https://example.com/,https://example.com/articles/example-2,added,1774223940
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com,https://example.com/,https://example.com/articles/example-3,updated,1774223970
licn_9aK2mQ7xT4vN8pR3cW6yZ1bD,https://example.com,https://example.com/,https://example.com/articles/example-3,deleted,1774223995Appendix: Machine-readable schemas and integration artifacts
This appendix defines machine-readable artifacts for the RSL Platform License API, including:
- an OpenAPI definition for JSON-based API endpoints
- machine-readable schemas for the repertoire file, report file, payment file, and indexnow file CSV formats
- a machine-readable error catalog
Notes:
- The OpenAPI definition describes the machine-readable definition for JSON-based API endpoints and JSON response objects. It does not model CSV row schemas.
- The YAML CSV schema for the repertoire file describes the machine-readable definition for that format.
- The YAML CSV schema for the report file describes the machine-readable definition for that format.
- The YAML CSV schema for the payment file describes the machine-readable definition for that format.
- The YAML CSV schema for the indexnow file describes the machine-readable definition for that format.
- The shared
resultschema models the result file downloaded fromupload.result_url.
OpenAPI definition
openapi: 3.1.0
info:
title: RSL Platform License API
version: 1.0.0-beta
description: >
Machine-readable definition of the RSL Platform License API.
servers:
- url: https://api.rslcollective.org/license/v1
description: Production
- url: https://sandbox.api.rslcollective.org/license/v1
description: Sandbox
security:
- bearerAuth: []
paths:
/repertoires:
get:
summary: List all repertoires
operationId: listRepertoires
parameters:
- name: limit
in: query
required: false
schema:
type: integer
default: 100
minimum: 1
maximum: 1000
- name: starting_after
in: query
required: false
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/RepertoireListResponse"
/repertoires/{id}:
get:
summary: Retrieve a repertoire
operationId: getRepertoire
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/RepertoireObject"
"404":
$ref: "#/components/responses/Error"
/reports:
post:
summary: Create a report
operationId: createReportUpload
parameters:
- name: Idempotency-Key
in: header
required: false
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ReportUploadRequest"
responses:
"200":
description: Report object created
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ReportObject"
"400":
$ref: "#/components/responses/Error"
"401":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
"409":
$ref: "#/components/responses/Error"
"429":
$ref: "#/components/responses/Error"
get:
summary: List all reports
operationId: listReports
parameters:
- name: limit
in: query
required: false
schema:
type: integer
default: 100
minimum: 1
maximum: 1000
- name: starting_after
in: query
required: false
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ReportListResponse"
/reports/{id}:
get:
summary: Retrieve a report
operationId: getReport
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ReportObject"
"404":
$ref: "#/components/responses/Error"
/payments:
post:
summary: Create a payment
operationId: createPaymentUpload
parameters:
- name: Idempotency-Key
in: header
required: false
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/PaymentUploadRequest"
responses:
"200":
description: Payment object created
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/PaymentObject"
"400":
$ref: "#/components/responses/Error"
"401":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
"409":
$ref: "#/components/responses/Error"
"429":
$ref: "#/components/responses/Error"
get:
summary: List all payments
operationId: listPayments
parameters:
- name: limit
in: query
required: false
schema:
type: integer
default: 100
minimum: 1
maximum: 1000
- name: starting_after
in: query
required: false
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/PaymentListResponse"
/payments/{id}:
get:
summary: Retrieve a payment
operationId: getPayment
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/PaymentObject"
"404":
$ref: "#/components/responses/Error"
/indexnows:
get:
summary: List all IndexNows
operationId: listIndexNows
parameters:
- name: limit
in: query
required: false
schema:
type: integer
default: 100
minimum: 1
maximum: 1000
- name: starting_after
in: query
required: false
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/IndexNowListResponse"
/indexnows/{id}:
get:
summary: Retrieve an IndexNow
operationId: getIndexNow
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Successful response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/IndexNowObject"
"404":
$ref: "#/components/responses/Error"
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: API key
headers:
RequestId:
description: Unique request identifier
schema:
type: string
responses:
Error:
description: Error response
headers:
Request-Id:
$ref: "#/components/headers/RequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
schemas:
Error:
type: object
required: [error, error_description]
properties:
error:
type: string
error_description:
type: string
Repertoire:
type: object
description: Inner repertoire resource object.
required: [file]
properties:
file:
$ref: "./files.openapi.yaml#/components/schemas/File"
RepertoireObject:
type: object
description: Response wrapper containing a single repertoire object.
required: [repertoire]
properties:
repertoire:
$ref: "#/components/schemas/Repertoire"
RepertoireListResponse:
type: object
description: Paginated list response containing repertoire objects.
required: [repertoires, has_more]
properties:
repertoires:
type: array
items:
$ref: "#/components/schemas/RepertoireObject"
has_more:
type: boolean
Report:
type: object
description: Inner report resource object.
required: [period_start, period_end, upload]
properties:
period_start:
type: string
format: date
period_end:
type: string
format: date
upload:
$ref: "./files.openapi.yaml#/components/schemas/Upload"
ReportObject:
type: object
description: Response wrapper containing a single report object.
required: [report]
properties:
report:
$ref: "#/components/schemas/Report"
ReportListResponse:
type: object
description: Paginated list response containing report objects.
required: [reports, has_more]
properties:
reports:
type: array
items:
$ref: "#/components/schemas/ReportObject"
has_more:
type: boolean
ReportUploadRequest:
type: object
required: [period_start, period_end, file]
properties:
period_start:
type: string
format: date
period_end:
type: string
format: date
file:
$ref: "./files.openapi.yaml#/components/schemas/FileInput"
Payment:
type: object
description: Inner payment resource object.
required: [period_start, period_end, upload]
properties:
period_start:
type: string
format: date
period_end:
type: string
format: date
upload:
$ref: "./files.openapi.yaml#/components/schemas/Upload"
PaymentObject:
type: object
description: Response wrapper containing a single payment object.
required: [payment]
properties:
payment:
$ref: "#/components/schemas/Payment"
PaymentListResponse:
type: object
description: Paginated list response containing payment objects.
required: [payments, has_more]
properties:
payments:
type: array
items:
$ref: "#/components/schemas/PaymentObject"
has_more:
type: boolean
PaymentUploadRequest:
type: object
required: [period_start, period_end, file]
properties:
period_start:
type: string
format: date
period_end:
type: string
format: date
file:
$ref: "./files.openapi.yaml#/components/schemas/FileInput"
IndexNow:
type: object
description: Inner indexnow resource object.
required: [file]
properties:
file:
$ref: "./files.openapi.yaml#/components/schemas/File"
IndexNowObject:
type: object
description: Response wrapper containing a single indexnow object.
required: [indexnow]
properties:
indexnow:
$ref: "#/components/schemas/IndexNow"
IndexNowListResponse:
type: object
description: Paginated list response containing indexnow objects.
required: [indexnows, has_more]
properties:
indexnows:
type: array
items:
$ref: "#/components/schemas/IndexNowObject"
has_more:
type: booleanRepertoire CSV schema
schema_type: rsl.license_api.csv_schema
schema_version: "1.0"
file_type: repertoire_file
encoding: UTF-8
header_required: true
unknown_columns: forbidden
duplicate_columns: forbidden
columns_may_appear_in_any_order: true
columns:
- name: license_id
type: string
required: true
max_length: 40
description: Stable RSL Collective-defined identifier for the licensed content scope identified by `scope_url`.
- name: scope_url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL representing the content scope.
- name: publisher_url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL representing the publisher associated with the content scope. This field is informational.
- name: collective_license_id
type: string
required: true
max_length: 40
description: Identifier of the RSL Collective License governing use of the content scope.
constraints:
uniqueness:
- [license_id]
- [scope_url]Report CSV schema
schema_type: rsl.license_api.csv_schema
schema_version: "1.0"
file_type: report_file
encoding: UTF-8
header_required: true
unknown_columns: forbidden
duplicate_columns: forbidden
columns_may_appear_in_any_order: true
columns:
- name: license_id
type: string
required: true
max_length: 40
description: Stable RSL Collective-defined identifier for the Content Scope identified by `scope_url`.
- name: scope_url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL representing the Content Scope.
- name: report_date
type: string
format: date
required: true
max_length: 10
description: UTC date covered by the reported contribution activity. Must fall within the Reporting Period declared on the enclosing Report object.
- name: product_code
type: string
required: true
pattern: "^(0[1-9]|[1-9][0-9])$"
max_length: 2
description: Standard RSL product code for the AI product category in which the Contribution Events occurred.
- name: country
type: string
required: true
pattern: "^[A-Z]{2}$"
max_length: 2
description: ISO 3166-1 alpha-2 country code for the country associated with the Contribution Events.
- name: role
type: enum
required: true
values:
- primary
- co_primary
- supporting
- incidental
description: Role assigned to the Contribution Events.
- name: use_type
type: enum
required: true
values:
- direct
- adapted
- background
description: Use type assigned to the Contribution Events.
- name: brand_attributed
type: boolean
required: true
description: Whether the source brand was explicitly surfaced in the AI Output for the Contribution Events.
- name: contribution_count
type: integer
required: true
minimum: 1
description: Total number of Contribution Events represented by the row.
- name: output_count
type: integer
required: false
minimum: 1
description: Number of distinct AI Outputs represented by the row. If multiple Contribution Events in the row occurred in the same AI Output, count that AI Output once.
- name: evidence_reference
type: string
required: false
max_length: 200
description: Optional Licensee-defined reference to retained evidence supporting the row.
constraints:
uniqueness:
- [license_id, report_date, product_code, country, role, use_type, brand_attributed]
validation_errors:
- out_of_period
- unknown_reference
- invalid_product_code
- invalid_countryPayment CSV schema
The period_start and period_end values on the enclosing payment object identify the billing, invoice, or reporting period that the Licensee associates with the reported payment file.
schema_type: rsl.license_api.csv_schema
schema_version: "1.0"
file_type: payment_file
encoding: UTF-8
header_required: true
unknown_columns: forbidden
duplicate_columns: forbidden
columns_may_appear_in_any_order: true
columns:
- name: disbursement_account_reference
type: string
required: true
max_length: 100
description: Approved reference for the Disbursement Account to which the payment was initiated.
- name: payment_timestamp
type: integer
required: true
minimum: 0
maximum: 9999999999
description: UTC Unix timestamp when the payment was initiated by the Licensee.
- name: currency
type: string
required: true
pattern: "^[A-Z]{3}$"
max_length: 3
description: Currency of the initiated payment.
- name: amount
type: integer
required: true
minimum: 0
description: Amount of the initiated payment.
- name: external_payment_reference
type: string
required: true
max_length: 100
description: Payment or transaction reference assigned by the Licensee or banking rail.
- name: originator_account_reference
type: string
required: false
max_length: 100
description: Originator account reference used by the Licensee, if available.
- name: remittance_reference
type: string
required: false
max_length: 200
description: Remittance or payment reference sent with the payment, if any.
- name: invoice_reference
type: string
required: false
max_length: 100
description: RSL invoice or payment reference associated with the payment, if available.
constraints:
uniqueness:
- [disbursement_account_reference, external_payment_reference]IndexNow CSV schema
schema_type: rsl.license_api.csv_schema
schema_version: "1.0"
file_type: indexnow_file
encoding: UTF-8
header_required: true
unknown_columns: forbidden
duplicate_columns: forbidden
columns_may_appear_in_any_order: true
columns:
- name: license_id
type: string
required: true
max_length: 40
description: Stable RSL Collective-defined identifier for the licensed content scope identified by `scope_url`.
- name: scope_url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL of the content scope containing the URL.
- name: publisher_url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL representing the publisher associated with the content scope. This field is informational.
- name: url
type: string
format: uri
required: true
max_length: 512
description: Canonical URL of the content being changed.
- name: change
type: string
required: true
max_length: 16
enum: [added, updated, deleted, removed]
description: Type of URL-level change.
- name: timestamp
type: integer
required: true
minimum: 0
maximum: 9999999999
description: UTC Unix timestamp when the URL-level change occurred.
constraints: {}Error catalog
This catalog defines the License API-specific machine-readable error codes used by this API in addition to the shared file-level and row-level error codes defined by the Files API. API error responses use the generic Error schema defined in the OpenAPI definition.
catalog_type: rsl.license_api.error_catalog
catalog_version: 1.0.0-beta
validation_errors:
- code: out_of_period
category: report_row
retryable: false
description: A `report_date` value falls outside the declared reporting period.
- code: invalid_product_code
category: report_row
retryable: false
description: A `product_code` value is not a supported RSL product code.
- code: invalid_country
category: report_row
retryable: false
description: A `country` value is not a valid ISO 3166-1 alpha-2 country code.Changelog
- 2026-04-23: Initial License API definition.
