NIPs by PolleramaCommunity NIPs, surfaced by trustConnect
npub1jafe6gzygn8...

Testimony

Published Aug 21, 2026
kind 31675 · Testimony

Testimony

draft optional

A testimony is one person's written opinion about another person.

Event

Kind 31675, addressable.

{
  "kind": 31675,
  "tags": [
    ["d", "<subject pubkey, 64 lowercase hex>"],
    ["p", "<same pubkey>"]
  ],
  "content": "She flagged the data-loss bug nobody else wanted to look at, three weeks before it would have bitten us. I would work with her again without hesitating."
}
  • d — the subject. Exactly one, always the raw 64-char lowercase-hex pubkey, never an npub.
  • p — the same pubkey, so the testimony routes to the subject's inbox relays (NIP-65) and

shows up in normal #p tooling. A relay hint MAY be added as the second value.

  • content — free-form plain text. This NIP says nothing about what a testimony may say.

Social convention decides that.

Nothing else. No rating, no score, no label, no relationship field, no expiration.

Because the address is 31675:<author>:<subject>, an author has one testimony per person. Writing another one about the same person replaces it. Writing about someone else is a different address, so there is no limit on how many people you may write about.

Rules

Authors:

  • MUST NOT write a testimony about themselves (d equal to their own pubkey). That is kind:0.
  • Revise by republishing at the same address.
  • Retract by republishing at the same address with empty content and a strictly greater

created_at. (Equal timestamps are resolved by lowest event id, so a same-second retraction loses about half the time.)

Clients:

  • MUST ignore any 31675 event that does not have exactly one d tag, whose d is not 64

lowercase hex, whose first p value differs from d, or whose d equals its own pubkey. This validation is what enforces one-per-pair — relays do not. An event carrying a second d tag gets its own address but still matches a #d query, so an unvalidating client can be flooded.

  • MUST discover testimonies about a person with #d, never with #p. #p is for routing and

notifications only, and is unconstrained.

  • MUST fold results by (kind, pubkey, d) keeping the highest created_at. Relays serve stale

versions.

  • MUST treat empty content as retracted and not render it.
  • SHOULD scope the default view of testimonies about a person to the reader's own social graph

rather than showing every one that exists.

  • SHOULD NOT derive a count, average or score from testimonies.

Relays need no changes to store and serve testimonies. They MAY validate the rules above at ingest, and MAY refuse the kind entirely.

Queries

{"kinds":[31675],"#d":["<subject>"]}                      // about a person
{"kinds":[31675],"authors":["<author>"]}                  // written by a person
{"kinds":[31675],"authors":["<me>"],"#d":["<subject>"]}   // have I already written one?

Notes

A subject cannot suppress a testimony about themself, only decline to endorse it. Relays that honour NIP-62 (Request to Vanish) SHOULD also drop 31675 events whose d is the vanishing pubkey — otherwise erasure removes a person's own history and leaves what others wrote standing.

Replacing in place means there is no record of earlier versions. A testimony is a current standing statement, not a historical one.

Prior art

  • NIP-87 kind 38000 is this exact shape — addressable, d = the subject's pubkey, free

prose, no rating, no consent gate — applied to mints. This applies it to people.

  • NIP-56 kind 1984 is the only merged kind where one person writes prose about another's

pubkey. Testimony is that with the sign flipped and the taxonomy removed.

  • PR #2198 (kind 63) proposes testimonials as a regular, recipient-approved event.

This is the opposite trade: public, unilateral, and capped at one per pair.