5.3 KiB
NIP-88
Recurring Subscriptions
draft
optional
This NIP defines a way for a pubkey to create recurring subscription payments to another pubkey.
Tier Event
A pubkey can create "tiers". These tiers might provide certain benefits to the supporters who subscribe to these.
{
"kind": 37001,
"content": "<description of the tier>",
"tags": [
[ "title", "..." ],
[ "image", "..." ],
[ "amount", "<amount-in-base-unit>", "currency", "<monthly>" ],
[ "amount", "<amount-in-base-unit>", "currency", "<quarterly>" ],
[ "zap", "<recipient-pubkey>", "relay-url", "19" ], // 95%
[ "zap", "", "relay-url", "1" ], // 5%
]
}
This event is generated by a pubkey who wants to allow users to support with different tiers.
.content
SHOULD be a description of what users who subscribe can expect.
Tag title
is an optional title for the tier.
Tag image
is an optional image for the tier.
Tag amount
MUST specify the payment required for this tier and its cadence.
* The first argument should be the stringified amount and the second argument the currency
* The third argument SHOULD be one of daily
, monthly
, yearly
One or more amount
tags MUST exist.
Zero or more zap
tags can exist as defined in NIP-57.
A zap
tag with no pubkey indicates that the client can include any pubkey in the kind:7001
event (and in the resulting recurring zaps). This way, users can offer a "referral" fee to other clients.
Examples
[ "amount", "100", "usd", "daily" ]
, $1.00 a day.[ "amount", "1000000", "msats", "daily" ]
, 1000000 millisats a day.
Subscribe Event
{
"kind": 7001,
"content": "<optional-message>",
"tags": [
[ "p", "<recipient-pubkey>" ],
[ "a", "<supporting-tier-event-id>" ],
[ "event", "<stringied-event-subscribed-to>" ],
[ "amount", "<amount-in-base-unit>", "<currency>", "<cadence>" ],
[ "zap", "<recipient-pubkey>", "19" ], // 95%
[ "zap", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", "1" ], // 5% to client developer where subscription was created
[ "alt", "This is a subscription event" ],
[ "client", "highlighter", "31990:73c6bb92440a9344279f7a36aa3de1710c9198b1e9e8a394cd13e0dd5c994c63:1704502265408" ],
]
}
When a user wants to subscribe to support a user they create a kind:7001
event.
.content
is an optional message the supporter can write.- The
p
tag MUST tag the pubkey being supported. - The
a
tag is optional; it should point to akind:37001
support tier event. There MUST be exactly 0 or 1a
tag. - The
event
tag is optional; subscribers can opt to keep the version of the event they subscribed to. There MUST be exactly 0 or 1event
tag. - The
amount
tag specifies what the supporters is committing to pay to the supported pubkey and the cadence. MUST be equal to one of the amounts specified in thekind:37001
event if one is tagged. There MUST be exactly 1amount
tag.
The kind:7001
event can be created without an e
tag so that users can create recurring support events without the pubkey receiving the support having explicitly created a support tier.
Zap splits
kind:7001
events can include zap splits as defined in NIP-57. Zap splits MUST be copied by clients as they exist in the kind:37001
event being subscribed to. When an event has a zap
tag with no pubkey, clients can discard it, or add the client developer's pubkey, or any other user they wish to receive a share of recurring subscriptions.
Paying
The supporting user should create a zap p
-tagging the receiver and e-tagging the kind:7001
. There MUST be a single p
and a single e
tag in the zap request.
{
"kind": 9734,
"content": "",
"tags": [
[ "p", "<recipient-pubkey>" ],
[ "e", "<kind-7001-event-id>" ]
]
Clients supporting this NIP can check for zaps e-tagging the kind:7001
event to find the pubkeys that have a valid, paid subscriptions at each different period.
The same kind:7001
is re-zapped on a regular basis per the cadence specified in the event.
Verifying Payment
The following conditions must be met to verify a payment:
- Time between zap receipts should be equal or less than the cadence specified in the
kind:7001
event. - Amount of the zap receipt should be equal or greater than the amount specified in the
kind:7001
event. For currencies not directly supported by the zap spec, clients should do a best effort conversion to the currency specified in thekind:7001
event at the time of zap receipt. - Zap-receipts should include a zap request
e
-tagging thekind:7001
event. Zap-receipts might not include a signature (for NWC-automated payments where the subscriber is not present to sign the zap request). - Validations specified in NIP-57.
Stopping a subscription
A user who wants to signal they are no longer subscribed can publish a kind:7002
event tagging the kind:7001
they are stopping and p
-tagging the pubkey they are no longer subscribed to.
{
"kind": 7002,
"content": "<optional-message>",
"tags": [
[ "p", "<recipient-pubkey>" ],
[ "e", "<kind-7001-event-id>" ],
]
}