Nostr NIPS 85

 

Page content

NIP-85

Trusted Assertions

draft optional

Certain Webs of Trust calculations require access to a large volume of events and/or computing power, making it virtually impossible to perform them directly on clients. This NIP allows users to offload such calculations to declared trusted service providers, and for these providers to publish signed “Trusted Assertion” events for the user client’s consumption.

Assertion Events

Trusted Assertions are always addressable (replaceable) events with the d tag pointing to the “subject” of the assertion. This NIP currently recognizes four distinct target “subjects” on which such calculations can be performed: pubkeys, regular events, addressable events, and nip73 identifiers. Each subject type is mapped to an event kind:

SubjectEvent Kindd tag value
User30382<pubkey>
Event30383<event_id>
Addressable Event30384<event_address>
NIP-73 Identifier30385<i-tag>

Calculation results are saved in pre-defined tags whose syntax and semantics are agreed upon by providers and clients.

Example of ranking a pubkey with a web of trust score of 89:

{
  "kind": 30382,
  "pubkey": "<service pubkey>",
  "tags": [
    ["d", "e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411"], // target user's public key
    ["rank", "89"],
  ],
  "content": "",
  //...
}

Service providers MUST use different service keys for distinct algorithms, including a key per user when the algorithm is personalized to that user’s point of view or settings.

Kind 30382: Users as Subject:

The following result types have been declared:

Result typeTag nameTag value format
Follower Countfollowersint
User Rankrankint, norm 0-100
First Post Timefirst_created_atunix timestamp
Post Countpost_cntint
Reply Countreply_cntint
Reactions Countreactions_cntint
Zap Amount Receivedzap_amt_recdint, sats
Zap Amount Sentzap_amt_sentint, sats
Zap Number Receivedzap_cnt_recdint
Zap Number Sentzap_cnt_sentint
Avg Zap Amount/day recdzap_avg_amt_day_recdint, sats
Avg Zap Amount/day sentzap_avg_amt_day_sentint, sats
Reports Receivedreports_cnt_recdint
Reports Sentreports_cnt_sentint
Common Topicststring
Generally active startactive_hours_startint, 0-24, UTC
Generally active endactive_hours_endint, 0-24, UTC

Each provider can offer their own ways to calculate such values. For instance, the Follower Count of one trust provider might remove the user’s muted public keys while another provider keeps them. Users can then choose how they want to see this information in their preferred client by picking a provider that aligns with their view.

Kind 30383: Events as Subject

Providers can rate individual events with the following tags:

Result typeTag nameTag value format
Event Rankrankint, norm 0-100
Event Comment Countcomment_cntint
Event Quote Countquote_cntint
Event Repost Countrepost_cntint
Event Reaction Countreaction_cntint
Event Zap Countzap_cntint
Event Zap Amountzap_amountint, sats

Kind 30384: Addressables as Subject

Providers can rate all versions of addressable events using the following tags:

Result typeTag nameTag value format
Address Rankrankint, norm 0-100
Address Comment Countcomment_cntint
Address Quote Countquote_cntint
Address Repost Countrepost_cntint
Address Reaction Countreaction_cntint
Address Zap Countzap_cntint
Address Zap Amountzap_amountint, sats

Kind 30385: External identifier as Subject

Providers can rate books, locations, movies, websites, and hashtags using NIP-73 identifiers.

Result typeTag nameTag value format
Rankrankint, norm 0-100
Comment Countcomment_cntint
Reaction Countreaction_cntint

NIP-73 k tags should be added to the event as well.

Declaring Trusted Service Providers

Kind 10040 lists the user’s authorized providers for each result. Each kind:tag is followed by the pubkey of the service and the relay where the results are published. Users can specify these publicly or privately by JSON-stringifying and encrypting the tag list in the .content using NIP-44.

{
  "kind": 10040,
  "tags": [
    ["<kind:tag>", "<service key>", "<relay hint>"],

    // examples
    ["30382:rank", "4fd5e210530e4f6b2cb083795834bfe5108324f1ed9f00ab73b9e8fcfe5f12fe", "wss://nip85.nostr.band"],
    ["30382:rank", "3d842afecd5e293f28b6627933704a3fb8ce153aa91d790ab11f6a752d44a42d", "wss://nostr.wine"],
    ["30382:zap_amt_sent", "4fd5e210530e4f6b2cb083795834bfe5108324f1ed9f00ab73b9e8fcfe5f12fe", "wss://nip85.nostr.band"],
  ],
  "content": nip44Encrypt(JSON.stringify([
    ["<kind:tag>", "<service key>", "<relay hint>"],

     // examples
    ["30383:rank", "4fd5e210530e4f6b2cb083795834bfe5108324f1ed9f00ab73b9e8fcfe5f12fe", "wss://nip85.nostr.band"],
    ["30384:rank", "4fd5e210530e4f6b2cb083795834bfe5108324f1ed9f00ab73b9e8fcfe5f12fe", "wss://nip85.nostr.band"],
  ]),
  //...
}

If the provider offers several algorithms or multiple points of view of an algorithm, the key listed in each tag SHOULD point to the key created for each algorithm or point of view.

Final Considerations

Service providers SHOULD update Trusted Assertions as fast as new information arrives, but only if the contents of each event actually change to avoid re-downloading the same information.

Service providers MAY limit access to the results by using paid relays.

In TAs, p, e, and a tags with the same value as the d tag MAY be used to add a relay hint to the home relay of that user or event.

Appendix 1: Service provider discoverability

Service Providers SHOULD sign a kind 0 of each service key that explains who controls the key and what the current version of the algorithm is about.

{
  "kind": 0,
  "pubkey": "<service pubkey>",
  "tags": [],
  "content": "{
   \"name\" = \"Vitor's Brainstormer\", 
   \"about\" = \"A Web of Trust algorithm from Vitor's point of view that considers Follows and Mutes, but no reports, and gives extra score points for anyone around Boston\",
   \"picture\" = \"https://brainstorm.com/logo.png\",
   \"website\" = \"https://brainstorm.com\"
  }",
  // other fields...
}

Clients wishing to offer a list of Service Providers to their users SHOULD:

  1. Download kind 10040 events of the user’s follow list
  2. Connect to each of the listed relays and download the kind 0 of the respective service keys
  3. Parse the kind 0 and collect the website property
  4. Load the OpenGraph tags of that website and display them as clickable items

Source: nostr-protocol/nips/85.md version: 6df3a21 2026-02-17T05:41:06-05:00