Skip to content

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:

  • Upload object: manages the upload and validation workflow used to create a file object
  • File object: represents a managed file and its metadata
  • Result object: 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:

LimitValue
Maximum rows per repertoire file1 billion rows
Maximum repertoire file size10 GB
Maximum rows per report file100 million rows
Maximum report file size5 GB
Maximum rows per payment file10 million rows
Maximum payment file size5 GB
Minimum retention for repertoire files12 months
Minimum retention for report files12 months
Minimum retention for payment files12 months
Minimum retention for indexnow files12 months
Minimum retention for result files24 hours
Minimum temporary upload URL validity24 hours
Minimum temporary download URL validity24 hours

If a request exceeds an applicable operational limit, the API returns the error limit_exceeded.

Core concepts

Core terms

TermDefinition
RSL CollectiveThe collective rights organization that administers the RSL collective licensing program.
RSL PlatformThe software platform that powers the RSL Collective’s enrollment, repertoire, reporting, and payment workflows.
RSL Collective LicenseA collectively negotiated license defined by the RSL Collective that specifies commercial terms used for settlement and payment calculation.
PublisherA rights holder who makes Content Scopes available for collective licensing under RSL through an Enrollment Partner.
Content ScopeA 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.
LicenseeAn 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 RepertoireThe set of Content Scopes that the RSL Platform makes available to a Licensee for use under the RSL Collective License.
Reporting PeriodThe reporting time interval covered by a Report File, as defined by the RSL Collective License.
IndexNow FileA file that declares URL-level changes within previously declared Content Scopes.
Disbursement AgentAn independent payment agent that manages Disbursement Accounts and processes licensing payments.
Disbursement AccountAn 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.

xml
...
<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

  1. Repertoire retrieval. The Licensee periodically retrieves its repertoire through the /repertoires endpoints to determine which content scopes are currently available for use under the RSL Collective License.

  2. Repertoire synchronization. As new repertoire snapshots become available, the Licensee replaces its previous operational repertoire with the current repertoire of record.

  3. URL-level change intake. The Licensee periodically retrieves IndexNow files through the /indexnows endpoints and applies those URL-level changes to its current repertoire.

  4. Content scope resolution. For each content scope it intends to use, the Licensee uses the scope_url to 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.

  5. Licensed content use. The Licensee accesses and uses covered content assets in accordance with the applicable RSL Collective License terms.

  6. Usage reporting. For each reporting period, the Licensee submits a Report File through the /reports endpoints describing its usage of licensed content scopes during that reporting period.

  7. 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 /payments endpoints.

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

NameTypeRequiredDescription
fileobjectYesFile 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

http
GET /repertoires/{id}

Path parameters

NameTypeRequiredDescription
idstringYesfile.id of the repertoire object to retrieve.

Response fields

NameTypeDescription
repertoireobjectRepertoire object for the requested repertoire.

Example response

json
{
  "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

http
GET /repertoires

Query parameters

NameTypeRequiredDescription
limitintegerNoMaximum number of repertoire objects to return.
starting_afterstringNofile.id of the last repertoire object from the previous page.

Response fields

NameTypeDescription
repertoiresarray of objectsList of repertoire objects. Each array item contains a repertoire object.
has_morebooleanWhether additional repertoire objects are available.

Example response

json
{
  "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:

ColumnTypeRequiredLimitDescription
license_idstringYes40 charsStable RSL Collective-defined identifier for the licensed content scope identified by scope_url.
publisher_urlstringYes512 charsCanonical URL representing the publisher of the content scope.
scope_urlstringYes512 charsCanonical URL representing the licensed content scope.
collective_license_idstringYes40 charsIdentifier 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

csv
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_001

The Report object

A report object represents a licensee’s usage report for a specified reporting period.

Attributes

NameTypeRequiredDescription
period_startstring (YYYY-MM-DD)YesInclusive start date of the reporting period in UTC.
period_endstring (YYYY-MM-DD)YesInclusive end date of the reporting period in UTC.
uploadobjectYesUpload 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

http
POST /reports

Body parameters

NameTypeRequiredDescription
period_startstring (YYYY-MM-DD)YesInclusive start date of the reporting period in UTC.
period_endstring (YYYY-MM-DD)YesInclusive end date of the reporting period in UTC.
fileobjectYesFile metadata for the corresponding report file.

Response fields

NameTypeDescription
reportobjectReport object for the upload workflow.

Example request

json
{
  "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

json
{
  "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

http
GET /reports/{id}

Path parameters

NameTypeRequiredDescription
idstringYesupload.id of the report object to retrieve.

Response fields

NameTypeDescription
reportobjectReport object for the requested report.

Example response

json
{
  "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:

ValueDescriptionAction
out_of_periodreport_date falls outside the Reporting Period declared on the enclosing Report object.Upload rejected
invalid_product_codeproduct_code is not a supported RSL product code.Upload rejected
invalid_countrycountry 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_key for a duplicate (license_id, report_date, product_code, country, role, use_type, brand_attributed) tuple
  • unknown_reference when license_id does not identify a content scope in the licensee's repertoire, or scope_url does not match the referenced content scope
Failed report result file example
json
{
  "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

http
GET /reports

Query parameters

NameTypeRequiredDescription
limitintegerNoMaximum number of report objects to return.
starting_afterstringNoupload.id of the last report object from the previous page.

Response fields

NameTypeDescription
reportsarray of objectsList of report objects. Each array item contains a report object.
has_morebooleanWhether additional report objects are available.

Example response

json
{
  "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

TermDefinition
AI OutputA response, answer, generated item, or other user-facing result produced by a Licensee’s AI product. The License Report does not include output text.
ContributionA 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 RuleThe rule, defined by the RSL Collective License, that determines which Contributions from licensed Content Scopes are included in the License Report.
Contribution EventA Contribution from any digital asset within a licensed Content Scope that is selected by the Top Contributors Rule for an AI Output.
RoleThe reporting classification that describes the relative importance of a Contribution to an AI Output.
Use TypeThe reporting classification that describes how a Contribution was used in connection with an AI Output.
Brand AttributionThe 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.

ColumnTypeRequiredLimitDescription
license_idstringYes40 charsStable RSL Collective-defined identifier for the Content Scope identified by scope_url.
scope_urlstringYes512 charsCanonical URL representing the Content Scope.
report_datestring (YYYY-MM-DD)Yes10 charsUTC date covered by the reported contribution activity. Must fall within the Reporting Period declared on the enclosing Report object.
product_codestringYes2 charsTwo-digit product code, from 01 through 99, defined in the RSL Collective License for the product category in which the Contribution Event occurred.
countrystringYes2 charsISO 3166-1 alpha-2 country code for the country associated with the Contribution Events.
roleenumYesn/aRole assigned to the Contribution Events. Valid values are primary, co_primary, supporting, and incidental.
use_typeenumYesn/aUse type assigned to the Contribution Events. Valid values are direct, adapted, and background.
brand_attributedbooleanYesn/aWhether the source brand was explicitly surfaced in the AI Output for the Contribution Events.
contribution_countintegerYesn/aNumber of Contribution Events represented by the row. Must be greater than zero.
output_countintegerNon/aNumber 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_referencestringNo200 charsOptional 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:

FieldValue
contribution_count90
output_count80

Example Report File

csv
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_005

The 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

NameTypeRequiredDescription
period_startstring (YYYY-MM-DD)YesInclusive UTC start date of the billing, invoice, or reporting period the Licensee associates with the reported payment.
period_endstring (YYYY-MM-DD)YesInclusive UTC end date of the billing, invoice, or reporting period the Licensee associates with the reported payment.
uploadobjectYesUpload 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

http
POST /payments

Body parameters

NameTypeRequiredDescription
period_startstring (YYYY-MM-DD)YesInclusive UTC start date of the billing, invoice, or reporting period the Licensee associates with the reported payment.
period_endstring (YYYY-MM-DD)YesInclusive UTC end date of the billing, invoice, or reporting period the Licensee associates with the reported payment.
fileobjectYesFile metadata for the corresponding payment file.

Response fields

NameTypeDescription
paymentobjectPayment object for the upload workflow.

Example request

json
{
  "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

json
{
  "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

http
GET /payments/{id}

Path parameters

NameTypeRequiredDescription
idstringYesupload.id of the payment object to retrieve.

Response fields

NameTypeDescription
paymentobjectPayment object for the requested payment upload.

Example response

json
{
  "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_key for a duplicate external_payment_reference value within the uploaded file
  • unknown_reference when disbursement_account_reference does 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

http
GET /payments

Query parameters

NameTypeRequiredDescription
limitintegerNoMaximum number of payment objects to return.
starting_afterstringNoupload.id of the last payment object from the previous page.

Response fields

NameTypeDescription
paymentsarray of objectsList of payment objects. Each array item contains a payment object.
has_morebooleanWhether additional payment objects are available.

Example response

json
{
  "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:

ColumnTypeRequiredLimitDescription
disbursement_account_referencestringYes100 charsApproved reference for the Disbursement Account to which the payment was initiated.
payment_timestamptimestampYesn/aUTC Unix timestamp when the payment was initiated by the Licensee.
currencycurrencyYes-Currency of the initiated payment.
amountamountYes-Amount of the initiated payment.
external_payment_referencestringYes100 charsPayment or transaction reference assigned by the Licensee or banking rail.
originator_account_referencestringNo100 charsOriginator account reference used by the Licensee, if available.
remittance_referencestringNo200 charsRemittance or payment reference sent with the payment, if any.
invoice_referencestringNo100 charsRSL invoice or payment reference associated with the payment, if available.

Example Payment File

csv
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_example

The 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

NameTypeRequiredDescription
fileobjectYesFile 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

http
GET /indexnows/{id}

Path parameters

NameTypeRequiredDescription
idstringYesfile.id of the indexnow object to retrieve.

Response fields

NameTypeDescription
indexnowobjectIndexNow object for the requested indexnow.

Example response

json
{
  "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

http
GET /indexnows

Query parameters

NameTypeRequiredDescription
limitintegerNoMaximum number of indexnow objects to return.
starting_afterstringNofile.id of the last indexnow object from the previous page.

Response fields

NameTypeDescription
indexnowsarray of objectsList of indexnow objects. Each array item contains an indexnow object.
has_morebooleanWhether additional indexnow objects are available.

Example response

json
{
  "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:

ColumnTypeRequiredLimitDescription
license_idstringYes40 charsStable RSL Collective-defined identifier for the licensed content scope identified by scope_url.
publisher_urlstringYes512 charsCanonical URL representing the publisher associated with the licensed content scope. This field is informational.
scope_urlstringYes512 charsCanonical URL of the licensed content scope containing the URL.
urlstringYes512 charsCanonical URL of the content being changed.
changeenumYes16 charsadded, updated, deleted, or removed.
timestampintegerYes10 charsUTC Unix timestamp when the URL-level change occurred.

Change values

ChangeDescription
addedThe URL is newly available within an existing licensed content scope.
updatedThe URL remains available within the licensed content scope, but its content has changed materially.
deletedThe URL is no longer available due to an ordinary deletion.
removedThe URL is no longer available due to a rights, legal, safety, or compliance-driven removal.

Example IndexNow file

csv
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,1774223995

Appendix: 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 result schema models the result file downloaded from upload.result_url.

OpenAPI definition

yaml
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: boolean

Repertoire CSV schema

yaml
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

yaml
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_country

Payment 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.

yaml
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

yaml
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.

yaml
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.