# 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 the`Attestation Event`. |
| `Assertion Event` | Event being attested to by the `Attestor`. |
| `Attestation Event` | Event published by the `Attestor` to signal attestation of the `Assertion Event`. |

```mermaid
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. |

```mermaid
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` / `p` | Specific `Assertion Event`. Exactly one of `e` or `a` or `p` **must** be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]` | Yes |
| `v` | Validity claim. Conditional on `s` = `verified` | `["v", "valid"]` or `["v", "invalid"]` | Conditional |
| `s` | Marks an Attestation as being in only one of the following states:`accepted`- `rejected` - `verifying` - `verified` - `revoked` | `["s","accepted <> rejected <> verifying <> verified <> revoked"]` | Optional |
| `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 |
---
### 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`/`p` | Specific `Assertion Event` Exactly one of `e` or `a` or `p` must be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]`.| Yes |
| `p` | One or more requested `Attestators` | `["p", "<attestor_pubkey>"]` | 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 of a given`Attestor`. | `["d", "<attestor_pubkey>` | Yes |
| `k` | One or more event kinds the attestor is recommended for | `["k", "<kind>"]` (repeatable) | Yes |
| `desc` | Optional human-readable reason or context for the recommendation | `["desc", "Trustworthy for place attestations"]` | No |
---
### 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 |
| ------ | ----------------------------------------------------------------- | -------------------------------------------- | -------- |
| `p` | Attestorβs pubkey (the declaring party) | `["p", "<pubkey>"]` | Yes |
| `k` | One or more event kinds the attestor claims proficiency in | `["k", "<kind>"]` | Yes |
| `desc` | Optional human-readable description of proficiency or credentials | `["desc", "I verify places and attributes"]` | No |
---
# 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"],
["validity", "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.
)
```mermaid
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. |

```mermaid
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` / `p` | Specific `Assertion Event`. Exactly one of `e` or `a` or `p` **must** be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]` | Yes |
| `v` | Validity claim. Conditional on `s` = `verified` | `["v", "valid"]` or `["v", "invalid"]` | Conditional |
| `s` | Marks an Attestation as being in only one of the following states:`accepted`- `rejected` - `verifying` - `verified` - `revoked` | `["s","accepted <> rejected <> verifying <> verified <> revoked"]` | Optional |
| `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 |
---
### 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`/`p` | Specific `Assertion Event` Exactly one of `e` or `a` or `p` must be present. | `["e", "<event-id>"]` or `["a", "<kind>:<pubkey>:<d-tag>"]` or `["p", <pubkey>]`.| Yes |
| `p` | One or more requested `Attestators` | `["p", "<attestor_pubkey>"]` | 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 of a given`Attestor`. | `["d", "<attestor_pubkey>` | Yes |
| `k` | One or more event kinds the attestor is recommended for | `["k", "<kind>"]` (repeatable) | Yes |
| `desc` | Optional human-readable reason or context for the recommendation | `["desc", "Trustworthy for place attestations"]` | No |
---
### 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 |
| ------ | ----------------------------------------------------------------- | -------------------------------------------- | -------- |
| `p` | Attestorβs pubkey (the declaring party) | `["p", "<pubkey>"]` | Yes |
| `k` | One or more event kinds the attestor claims proficiency in | `["k", "<kind>"]` | Yes |
| `desc` | Optional human-readable description of proficiency or credentials | `["desc", "I verify places and attributes"]` | No |
---
# 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"],
["validity", "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.