diff --git a/63.md b/63.md new file mode 100644 index 0000000000..f0191d0675 --- /dev/null +++ b/63.md @@ -0,0 +1,83 @@ +NIP-63 +====== + +Relay-based Paywalls +-------------------- + +`draft` `optional` + +This NIP specifies how relays can support _paywalled content_. Well, "paywall" is a misnomer as this NIP doesn't imply payment necessarily, it's agnostic about that, so better call it **premium content**. + +The idea is that a _content-creator_ should be able to manage a list of _premium-reader_ who have access to their premium content, then choose some specific relays to publish their content based on their known support for this NIP. + +Relays that support this NIP (as they could indicate in their [NIP-11](11.md) responses) should receive the list of users and use it together with [NIP-42](42.md) authentication in order to decide what content will be readable by each requester. + +### Premium event + +Any event can be premium, all it needs is a [NIP-70](70.md) `["-"]` tag and another tag `["nip63"]` that clearly indicates its situation. + +Because normal relays won't care about these tags it's enough for the _content-creator_ to release the event to these relays in order to make it "public" to everybody. + +### Membership Event + +Membership events must be sent directly to the relays that will implement the paywall. By default relays should not serve these events to anyone, only to the _content-creator_ directly. Because of this, these lists can be kept reasonably private as long as the _content-creator_ is discreet in his publishing, but can also be made public by being published to other relays. + +The lists are constituted of one event for each _premium-reader_, and their removal/update must be done with a [NIP-09](09.md) deletion request. + +```yaml +{ + "kind": 1163, + "pubkey": "", + "tags": [ + ["p", ""] + ], + // ...other fields +} +``` + +### Relay behavior + +A relay that implements this NIP should: + +- signal `63` in its `supported_nips` NIP-11 field; +- accept `kind:1163` events and not serve them to anyone except to their creator; +- accept deletion requests for such events; +- accept premium events containing `["-"]` and `["nip63"]` tags only from their creator; +- only serve the premium events to users that have a matching `kind:1163`; +- serve an `AUTH` challenge to any client opening a connection immediately. + +### Client behavior + +A client doesn't have to do much in order to access premium content: if a client is already very liberal with its authentication policies it will automatically perform NIP-42 AUTH whenever it connects to the relay; otherwise it may want to check if such relay supports `63` before deciding. + +After that, any `REQ`s should include premium content automatically and transparently. This means that while constructiing a normal "following" feed a client will get the premium content automatically and place it in front of the user. + +A client may decide to display these events differently if they have the `["nip63"]` tag. + +### Announcement + +Optionally a _content-creator_ can announce that they have premium content available by publishing an event: + +``` +{ + "kind": 10163, + "content": "", + "tags": [ + ["url", ""] + ] +} +``` + +Where `` is a normal webpage that may have anything in it. From there on, payments are handled off-protocol. The entity that handled the payment is expected to somehow modify the list of _premium-readers_ or enable the user to modify it later. + +#### Zap relationship + +This NIP is payment agnostic, but that doesn't mean one shouldn't use zaps or nutzaps for this. Clients or third-party services may offer a feature to read all zaps, compute their sums according to any criteria and use that information to modify the list of _premium-readers_. + +### Future additions + +- more private list membership: perhaps doing an HMAC with the public key of the reader and a key that is shared with the relays will be enough for this. +- tiered membership: custom tiers for fine-grained content access control can be added by adding a tag like `["tier", "a"]` to the `kind:1163` event and using a `["nip63", "a"]` tag in the events, for example. +- teaser events: perhaps a `["nip63", "", "-"]` (negative) tag could cause an event to be displayed only to those that do not have access to its premium counterpart, this would also be managed by the relay. +- relays for premium content different from the outbox relays? +- individual "pay-per-view" content.