Attestations

Specifies: kind 31871 kind 31872 kind 31873 kind 11871

Abstract

Nostr lacks a standardized, interoperable way to make, track, and revoke truthfulness claims about Nostr events.

This NIP introduces Attestations, which provides a base structure to:

  • Make attestations about that validity of any other event on Nostr of any kind;
  • Revoke attestations about previous validity claims.

This base Attestation structure can optionally be extended to:

  • Manage simple attestation lifecycles;
  • Request attestations from other npubs;
  • Recommend individual attestation providers based on their proficiency in verifying given kinds;
  • Publish your verification proficiency for given kinds.

Attestations enable a web of-trust for notes.


Definitions

Base Definitions

Entity Definition
Assertor Signer of the Assertion Event. Interchangeable with Attestee.
Attestor Verifying party and signer of theAttestation Event.
Assertion Event Event being attested to by the Attestor.
Attestation Event Event published by the Attestor to signal attestation of the Assertion Event.

Simple Entity Relationship Diagram

erDiagram
    ATTESTOR ||--o{ ATTESTATION_EVENT : signs
    ASSERTOR ||--o{ ASSERTION_EVENT : signs
	
	ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to

Extended Definitions

Entity Definition
Requestor Signer of the Attestation Request Event.
Reccomender Signer of the Attestation Recommendation Event.
Attestation Request Event The request for an Attestation Event from an Attestor.
Attestor Recommendation Event The recommendation of a given Attestor for proficiency in the verification of given kinds.
Attestor Proficiency Declaration Event A declaration of proficiency from a given Attestor in the verification of given kinds.

Extended Entity Relationship Diagram

erDiagram
    ATTESTOR o|--o{ ATTESTATION_EVENT : signs
    ATTESTOR o|--|| ATTESTOR_PROFICIENCY_DECLARATION_EVENT : signs
    ASSERTOR o|--o{ ASSERTION_EVENT : signs
    ASSERTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
	REQUESTOR o|--o{ ATTESTATION_REQUEST_EVENT : signs
	RECOMMENDER o|--o{ ATTESTOR_RECOMMENDATION_EVENT : signs
	
	ATTESTATION_EVENT ||--|| ASSERTION_EVENT : attests_to
    ATTESTATION_REQUEST_EVENT ||--|| ASSERTION_EVENT : requests_attestation_of
    ATTESTOR_RECOMMENDATION_EVENT ||--|| ATTESTOR: recommends
    ATTESTOR_PROFICIENCY_DECLARATION_EVENT ||--|| ATTESTOR: declares_proficiency_of

Specification

Event Kinds

Kind Description Type
31871 Attestation Addressable
31872 Attestation Request Addressable
31873 Attestor Recommendation Addressable
11871 Attestor Proficiency Declaration Replaceable

Tags

Attestation Event (31871)

Event signed by the Attestor. The Attestor should only sign an Attestation Event after verifying the validity of the Assertion Event to a degree appropriate for its kind type.

Tag Description Format Required
d Unique identifier for addressable attestation. ["d", "<npub>:my-claim-id"] Yes
e / a Specific Assertion Event. Exactly one of e or a must be present. ["e", "<event-id>"] or ["a", "<kind>:<pubkey>:<d-tag>"] Yes
s Marks an Attestation as being in only one of the following states: verifying - valid - invalid - revoked ["s","verifying" <> "valid" <> "invalid" <> "revoked"] Yes
valid_from Unix timestamp (seconds). The earliest time (inclusive) at which the attestation is valid from. Clients should interpret the absence of valid_from tag as having validity/invalidity from the created_at timestamp of the Assertion Event ["valid_from",1671217411] Optional
valid_to UNIX timestamp (seconds). The latest time (inclusive) at which the attestation is valid from. Clients should interpret the absence of valid_to tag as having validity/invalidity in perpetuity. ["valid_from",1671567643] Optional
expiration UNIX timestamp (seconds). The time (inclusive) at which the Attestation Event will expire and be treated as such by relays in accordance to NIP-40. Clients should set this it be the same value as valid_to if there is no value in the Attestation Event being long-lived. ["expiration",1671567643] Optional
request Attestation Request Event that prompted this attestation. ["request", "31872:<requestor_pubkey>:<d-tag>"] Optional

content key should be used for optional human-readable description.


Attestation Request (31872)

Event signed by the Requestor (usually the Assertor) requesting an Attestation Event from an Attestor.

Tag Description Format Required
d Unique identifier for addressable attestation request. ["d", "<requestor_pubkey>:my-request-id"] Yes
e/a Specific Assertion Event Exactly one of e or a must be present. ["e", "<event-id>"] or ["a", "<kind>:<pubkey>:<d-tag>"]. Yes
p One or more requested Attestators. Repeatable. ["p", "<attestor_pubkey1>"] No
cashu_token A Cashu token locked to given spending conditions (HLTC, P2PK, etc.). Spending conditions may be locked to the observation of requested Attestation Events. ["cashu_token", "<cashuBo...>"] No

Attestor Recommendation (31873)

Event signed by the Recommender.

Allows any npub to recommend an Attestor for verification proficiency in one or more event kinds.

Tag Description Format Required
d Unique identifier for the recommendation. ["d", "<attestor_pubkey>:<recommendationid> Yes
p Pubkey of recommended Attestator. ["p", "<attestor_pubkey>"]
k One or more event kinds the attestor is recommended for verifying. Repeatable. ["k", "<kind1>"] Yes

content key should be used for optional human-readable description.


Attestor Proficiency Declaration (11871)

Event signed by the Attestor.

Enables an attestor to publicly declare which event kinds they are proficient in verifying; facilitating discovery of suitable attestors for specific verification needs.

Tag Description Format Required
k One or more event kinds the attestor claims verification proficiency in. Repeatable. ["k", "<kind>,"] Yes

content key should be used for optional human-readable description.


Worked Examples

1. Attestation Request

{
  "kind": 31872,
  "tags": [
	["d", "npub1requestor...:my-request-id"],
    ["a", 12345:npub1...:central-park-saftey-assertation"],
    ["p", "npub1attestor1..."]
    ["p", "npub1attestor2..."]
  ],
  "content": "Verify safety status for Central Park"
}

2. Attestation

{
  "kind": 31871,
  "tags": [
    ["d", "npub:safety-verification-2025"],
    ["a", "12345:npub1...:central-park-saftey-assertation"],
    ["s", "valid"],
    ["valid_from", "1760227200"], // Sept 12, 2025 @ 00:00 UTC
    ["valid_to",   "1760486400"],  // Sept 15, 2025 @ 00:00 UTC
    ["request", "request-event-id-123"]
  ],
  "content": "Safety inspection valid"
}

3. Revocation

{
  "kind": 31871,
  "tags": [
    ["d", "npub:safety-verification-2025"],
    ["s", "revoked"]
  ],
  "content": "Retracted due to new safety concerns"
}

Related NIPs

NIP-03 - OpenTimeStamps Attestations

An Attestor, Assertor or any other npub may choose to issue a kind:1040 OpenTimestamps Attestations for Events event to anchor the Attestation Event to a given blockheight on the Bitcoin timechain.

NIP-58 - Badges

An Attestor or any other npub may choose to issue a badge for a given Attestation should they wish.


Looking for comments…

Searching Nostr relays. This may take a moment the first time this article is opened.