ONP-2500
Open News Protocol (ONP): Payments
Abstract
This document defines the Payments Companion:
content_type = "onp:companion:payments", fulfilling the fourth and
final pillar named in ONP-0000 Section 1.3.4. It declares what is
owed and to whom — price, currency, recipient, revenue distribution
— and, per Principle P4 (Settlement Neutrality, ONP-0003), never
how payment is executed. No money moves through ONP itself; this
document is the binding instance that ONP-1002 Section 4.4, rule 2
anticipated when it required monetary amounts to be represented as
strings rather than JSON numbers. Like Rights (ONP-2400), a Payments
Object declares without enforcing: it names terms a Payment Provider
ecosystem MAY act upon, never a specific provider ONP requires.
Status of This Document
This document is part of the ONP Companion series (ONP-2000-2999).
It is directly implementable. Concurrently with its publication,
ONP-2100 (Article) and ONP-2200 (Media) are each updated with a new
OPTIONAL payment_ref field (Section 10.3). It is a Working Draft.
Normative Language
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174], per the interpretation established in ONP-0000.
1. Introduction
ONP-0000 Section 1.3.4 stated the pillar plainly: "not how paid, but for what and to whom." ONP-0003 Principle P4 turned that into a binding constraint before any Payments Companion existed to test it against. ONP-1002 Section 4.4, rule 2 went further and pre-committed this future document to a specific representational choice — money as strings, never JSON numbers — years, in specification-time, before this document was written. This is where all three commitments finally meet an actual schema.
2. Scope
2.1 In Scope
- the
onp:companion:paymentscontent schema:payment_model,price,currency,recipient_ref,revenue_shares,subscription_period,payment_provider_hint; - the settlement-neutrality boundary, restated as a binding requirement specific to this Companion;
- revenue-share declaration and its deliberately partial nature.
2.2 Out of Scope
This document does NOT define:
- any settlement mechanism, payment processor, card network, micropayment rail, or wallet protocol — per Principle P4, that remains entirely the concern of independent Payment Providers, never ONP;
- verification that revenue shares actually get paid out — a Payments Object is a declaration of intent, not a ledger of completed transactions;
- tax treatment, VAT, or any jurisdiction-specific financial regulation — consistent with Principle P5 (Jurisdiction Neutrality), applied here to money exactly as ONP-2400 applied it to law.
3. Terminology
This document is the owning specification for the following terms.
Payments Object
: An informal name for a News Object whose content_type is
onp:companion:payments.
Payment Model
: The payment_model field: a declared category
(free/one-time/subscription/donation/micropayment)
describing the general payment posture, not a settlement mechanism.
Revenue Share : A declared, partial allocation of payment proceeds to a named recipient, expressed as a percentage (Section 4.7).
Payment Provider Hint : A non-exclusive, informational pointer to a Payment Provider known to support these terms (Section 4.8) — never a requirement that only that provider may settle.
4. Requirements
4.1 content_type Declaration
Every Payments Object MUST declare content_type as exactly
onp:companion:payments.
4.2 Companion-vs-Extension Classification
Unlike Rights (ONP-2400 Section 4.2), no prior worked example exists for Payments; the test is applied fresh here, per ONP-0001 Section 4.4:
Does "Payments" have independent identity and an independent
lifecycle, separable from any Object it applies to?
- Payment terms (a subscription's price, a standing revenue-share
agreement) commonly apply across many Articles or Media Objects
and are updated independently of any single one of them — a price
change does not require touching every Article that references it.
- A Payments Object can be created, revised, and retracted on its
own lifecycle, exactly as Rights already established for a
structurally similar case.
- YES -> Companion.
4.3 Content Schema
payment_modelis REQUIRED: one of"free","one-time","subscription","donation","micropayment".price,currency,recipient_ref,revenue_shares,subscription_period, andpayment_provider_hintare OPTIONAL, per Sections 4.4-4.8.
4.4 Payment Model and Price
- When
payment_modelis"free",priceandcurrencySHOULD be absent. - When
priceis present,currencyMUST also be present, and MUST be a well-formed ISO 4217 currency code. priceMUST be represented as a string, never a JSON number, per ONP-1002 Section 4.4, rule 2 — this document is the binding case that rule was written for.
4.5 Settlement Neutrality (Restated as a Binding Requirement)
A Payments Object MUST NOT specify, require, or presume a specific settlement mechanism, payment processor, card network, micropayment rail, or wallet protocol. It declares terms only. This restates Principle P4 (ONP-0003) as a concrete, checkable requirement now that an actual schema exists to hold it to.
4.6 Recipient Reference
recipient_ref, if present, MUST be a single Object Reference (ONP-2000 Section 4.3): an OID identifying an Identity Object (ONP-2300).- If
recipient_refis absent, the default recipient MUST be understood as the referencing Object's ownpublisher.domain(ONP-1000 Section 4.3) — the publisher is the implicit recipient unless a Payments Object explicitly names someone else.
4.7 Revenue Shares
revenue_shares, if present, MUST be an array of objects, each with arecipient_ref(Object Reference to an Identity Object) and apercentage(string, e.g."20.00", following the same string-encoding rationale asprice, Section 4.4, rule 3, for the same precision reasons).revenue_sharesMAY be a partial specification. This document does NOT require declared percentages to sum to 100; a Node MUST NOT reject a Payments Object solely because its shares do not total 100. Any undeclared remainder is understood informally as accruing to the default recipient (Section 4.6, rule 2) unless a Payments Object states otherwise in a form outside this schema (e.g. viaonp:extensions, forward-looking, not defined here).
4.8 Payment Provider Hint
payment_provider_hint, if present, MUST be an array of strings
(informally, domain names or identifiers of Payment Providers known
to support these declared terms). It MUST NOT be interpreted as
exclusive or exhaustive: any Payment Provider MAY act on a Payments
Object's declared terms, whether or not it is named in this field.
This field exists purely as a discovery convenience, never as a
restriction — a restriction would violate Section 4.5.
5. Object Model
{
"content_type": "onp:companion:payments",
"content": {
"payment_model": "'free' | 'one-time' | 'subscription' | 'donation' | 'micropayment', REQUIRED",
"price": "string, OPTIONAL — decimal amount, never a JSON number",
"currency": "string (ISO 4217), REQUIRED if price present",
"recipient_ref": "onp:oid:..., OPTIONAL — default: publisher.domain",
"revenue_shares": [
{ "recipient_ref": "onp:oid:...", "percentage": "string" }
],
"subscription_period": "string (ISO 8601 duration), OPTIONAL",
"payment_provider_hint": ["string", "..."]
}
}
| Field | Required | Notes |
|---|---|---|
payment_model |
REQUIRED | Section 4.4 |
price |
OPTIONAL | String, never a number (Section 4.4, rule 3) |
currency |
REQUIRED if price present |
ISO 4217 |
recipient_ref |
OPTIONAL | Default: publisher.domain (Section 4.6) |
revenue_shares |
OPTIONAL | Partial specification permitted (Section 4.7) |
subscription_period |
OPTIONAL | ISO 8601 duration, e.g. "P1M" |
payment_provider_hint |
OPTIONAL | Non-exclusive discovery aid (Section 4.8) |
6. Processing Model
6.1 Resolution and Default Recipient
1. Resolve payment_ref on the referencing Article/Media Object
(ONP-2000 Section 6.2) to obtain the Payments Object.
2. If recipient_ref is present on the Payments Object, resolve it
to an Identity Object (Section 4.6, rule 1).
3. If recipient_ref is absent, treat the referencing Object's own
publisher.domain as the recipient (Section 4.6, rule 2).
4. If revenue_shares is present, apply each declared share; treat
any undeclared remainder as accruing to the default recipient
from step 2/3 (Section 4.7, rule 2).
6.2 Interoperability
A Node without Payments Companion support simply does not see
declared terms — the Article or Media Object it references remains
fully verifiable and usable, exactly as for any unrecognized
Companion (ONP-1000 Section 4.4, rule 3). This document does not
require every Object to carry a payment_ref, and free content
requires no Payments Object at all (Section 4.4, rule 1's own
guidance already covers the explicit case).
7. Examples
7.1 A Micropayment Payments Object
{
"oid": "onp:oid:regiopurmerend.nl:payments-fusie-onderzoek",
"vid": "onp:vid:sha-256:PqR678-example-digest-bytes",
"publisher": { "domain": "regiopurmerend.nl", "key_id": "onp:key:2026-07-01" },
"signed_at": "2026-07-28T10:00:00Z",
"signature": "onp:sig:ed25519:base64url-signature-bytes",
"content_type": "onp:companion:payments",
"content": {
"payment_model": "micropayment",
"price": "0.05",
"currency": "EUR"
}
}
This is the exact "this article costs €0.05" case discussed when Principle P4 was first motivated (ONP-0003) — now an actual, signed, verifiable declaration.
7.2 Revenue Share Between Publisher and a Freelance Photographer
{
"content_type": "onp:companion:payments",
"content": {
"payment_model": "one-time",
"price": "1.50",
"currency": "EUR",
"revenue_shares": [
{
"recipient_ref": "onp:oid:regiopurmerend.nl:freelance-fotograaf-jansen",
"percentage": "20.00"
}
]
}
}
The remaining 80% is undeclared and accrues to the default recipient (the publisher), per Section 6.1, step 4.
7.3 Subscription
{
"content_type": "onp:companion:payments",
"content": {
"payment_model": "subscription",
"price": "8.00",
"currency": "EUR",
"subscription_period": "P1M",
"payment_provider_hint": ["example-payment-provider.eu"]
}
}
payment_provider_hint names one known-compatible provider; any
other Payment Provider MAY still process these terms (Section 4.8).
8. Security Considerations
No funds move through ONP itself; a Payments Object is a declaration,
not a custody or settlement event. The material risk a compromised
publisher key (ONP-0004 Section 8.1) introduces here is
misattribution, not theft directly through ONP: a forged Payments
Object could misstate a price or redirect a revenue_shares entry
toward an attacker-controlled recipient_ref. Because ONP itself
never moves money, the actual financial harm depends entirely on
whether some external Payment Provider acts on the forged
declaration — this document does not, and cannot, prevent that; it
only makes the declaration itself tamper-evident and attributable to
whichever key signed it (Section 8's parallel already established in
ONP-2400 Section 8 for Rights).
9. Privacy Considerations
A recipient_ref naming a specific individual (a freelancer paid
directly rather than through the publisher) reveals a financial
relationship between that person and the publisher, which is more
sensitive than the general personal-data considerations already
noted for Identity Objects (ONP-2300 Section 9). This document
introduces no new privacy mechanism beyond what ONP-2300 already
establishes; publishers SHOULD apply the same consent guidance
(ONP-2300 Section 4.6) when naming an individual as a payment
recipient.
10. References
10.1 Normative References
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119.
- [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174.
- ONP-0000, Introduction — Section 1.3.4, the Payments pillar this document fulfills.
- ONP-0001, Architecture — Section 4.4, the decision test applied fresh in Section 4.2 of this document.
- ONP-0003, Design Principles — Principle P4 (Settlement Neutrality), restated as a binding requirement in Section 4.5; Principle P5 (Jurisdiction Neutrality, Section 2.2).
- ONP-1002, Serialization — Section 4.4, rule 2, the money-as-string rule this document is the binding instance of (Section 4.4, rule 3).
- ONP-2000, Companion Framework — Section 4.3 (Object Reference
mechanism, used for
recipient_ref). - ONP-2300, Identity — the recipient representation
recipient_refandrevenue_sharesentries point to. - ONP-2400, Rights — the structurally parallel declarative-not- enforcing pattern this document follows for money instead of permissions.
10.2 Informative References
- ONP-2100, Article; ONP-2200, Media (both updated concurrently,
Section 10.3) — the Companions expected to carry
payment_ref. - ISO 4217 — the currency code standard
currencyreuses. - ISO 8601 durations — the format
subscription_periodreuses.
10.3 Corresponding Updates to ONP-2100 and ONP-2200
As part of this document's publication, both ONP-2100 (Article) and
ONP-2200 (Media) are updated to add payment_ref (OPTIONAL, a
single OID string referencing a Payments Object), following the same
Object Reference pattern already established for contributor_refs,
creator_ref, and rights_ref. Both changes are classified MINOR
(additive) under ONP-0007 Section 4.1. This is now the third such
addition to each of those documents; readers should expect this
_ref convention to continue as further Companions are published.
Appendix A: Full Schema Reference
{
"content_type": "onp:companion:payments",
"content": {
"payment_model": "enum, REQUIRED",
"price": "string, OPTIONAL, never a JSON number",
"currency": "string (ISO 4217), REQUIRED if price present",
"recipient_ref": "string (OID), OPTIONAL, default publisher.domain",
"revenue_shares": "array of {recipient_ref, percentage}, OPTIONAL, partial permitted",
"subscription_period": "string (ISO 8601 duration), OPTIONAL",
"payment_provider_hint": "array of strings, OPTIONAL, non-exclusive"
}
}
Appendix B: Payments Object Checklist
[ ] payment_model present, one of the five recognized values
[ ] if price present: currency also present, both as strings
(price) / ISO 4217 code (currency), never JSON numbers
[ ] recipient_ref, if present, is an OID pointing to an Identity
Object; if absent, publisher.domain is understood as recipient
[ ] revenue_shares percentages need not sum to 100
[ ] payment_provider_hint, if present, is understood as
non-exclusive — no other provider is excluded by its presence
[ ] no settlement mechanism, processor, or rail is specified
anywhere in this Object
End of Document