nips/88.md
Believethehype eb30dbe04f Nip88: Adding dtag, typos
- A kind 37001 dtag is referenced in the 7003 description, but was missing in the example

-A etag is referenced in the  kind 7001 description but an a tag was referenced in the example
2024-03-13 11:27:11 -03:00

7.2 KiB

NIP-88

Recurring Subscriptions

draft optional

This NIP defines a way for a pubkey to create recurring subscription payments to another pubkey.

Actors in this flow:

  • Recipient: A pubkey that receives recurring payments
  • Subscriber: A pubkey that sends recurring payments
  • Payment verifier: An optional pubkey recipients can designate to verify payments on their behalf

Kinds

kind:37001 - Tier Event -- Optionally published by recipients kind:7001 - Subscribe Event -- Published by subscribers kind:7002 - Unsubscribe Event -- Published by subscribers kind:7003 - Subscription Payment Receipt -- Published by payment-verifier-pubkey

kind:37001: Tier Event

A pubkey that wants to provide others the ability to subscribe to them 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", "..." ],

        // Perks
        [ "perk", "<description>" ],
        [ "perk", "<description>" ],

        // Amount possibilities
        [ "amount", "<amount-in-base-unit>", "currency", "<monthly>" ],
        [ "amount", "<amount-in-base-unit>", "currency", "<quarterly>" ],

        // Zap-splits
        [ "zap", "<recipient-pubkey>", "relay-url", "19" ], // 95%
        [ "zap", "", "relay-url", "1" ], // 5%

        // Relay and payment-verification
        [ "r", "wss://my-subscribers-only-relay.com" ],
        [ "p", "<payment-verifier-pubkey>" ],

        // A unique identifier
        [ "d", "<random-id>" ],
    ]
}

.content: description of what subscribers can expect. Tag title is an optional title for the tier. Tag image is an optional image for the tier. Zero or more perk tags specify the benefits of the tier; these can be rendered as a list of benefits to the user in addition to the content. One or more amount tags specify the payment required for this tier and its cadence. * The first argument should be the stringified amount in cents or msats, 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.

An r tag can be included to specify a relay where clients can find special content for this tier.

Zero or more p tags can be included to specify a pubkey that is trusted by the tier creator to verify payments on their behalf.

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>" ],
        [ "e", "<supporting-tier-event-id>" ],
        [ "event", "<stringied-event-subscribed-to>" ],
        [ "amount", "<amount-in-base-unit>", "<currency>", "<cadence>" ],

        // Zap-splits
        [ "zap", "<recipient-pubkey>", "19" ], // 95%
        [ "zap", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52", "1" ], // 5% to client developer where subscription was created
    ]
}

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 e tag is optional; it should point to a kind:37001 support tier event. There MUST be exactly 0 or 1 e 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 1 event 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 the kind:37001 event if one is tagged. There MUST be exactly 1 amount 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.

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>" ],
    ]
}

Subscription Payment Receipt

When a subscription payment is made and a payment-verifier-pubkey is set on the kind:37001 this pubkey publishes kind:7003 events tagging the kind:7001 event that was paid and p-tagging the pubkey that received the payment.

{
    "kind": 7003,
    "content": "<optional-message>",
    "tags": [
        [ "p", "<recipient-pubkey>" ],
        [ "P", "<subscriber-pubkey>" ],
        [ "e", "<kind-7001-event-id>" ],
        [ "valid", "<from-timestamp>", "<to-timestamp>" ]
        [ "tier", "kind:37001-d-tag" ]
    ]
}

p is the pubkey that received the payment. P is the pubkey that made the payment. e is the kind:7001 event that was paid. valid is the period for which the payment is valid. tier is the d-tag of the kind:37001 that this subscription is for.

Appendix 0: 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 the kind:7001 event at the time of zap receipt.
  • Zap-receipts should include a zap request e-tagging the kind: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.

If kind:7003 events are published by the payment-verifier-pubkey, clients can use these to verify payments more simply.