Attestations
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_toExtended 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_ofSpecification
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.