← All NIPs

NIP-66

Relay Discovery and Liveness Monitoring

DraftEventsRelay

Monitors probe relays and publish what they find (uptime, speed, supported NIPs, rules), so clients can discover relays and skip dead ones.

At a glance

Status
In use and still allowed to change.
Kinds
Tags
  • c
  • d
  • frequency
  • g
  • l
  • n
  • N
  • R
  • rtt-open
  • t
  • timeout
Last changed
May 28, 2026

Try it

Edit the form or the JSON: both stay in sync, the badge says whether the result is valid, and tapping any field explains it.

What to build

How the parts connect: Monitoring relays

Examples
Valid 1 note

Not signed yet · Demo keys only. These personas' secret keys are public on purpose.

Form
Jan 1, 2025, 12:00 AM UTC

Content

Optional: the relay's NIP-11 document as a JSON string. Empty is fine.

Tags

  1. d Required

    Which relay this report is about.

  2. n Optional

    Network the relay is on.

  3. T Optional

    Relay type in PascalCase, e.g. PrivateInbox or PublicOutbox.

  4. N Optional

    A NIP the relay supports. One tag per NIP.

  5. N Optional

    A NIP the relay supports. One tag per NIP.

  6. N Optional

    A NIP the relay supports. One tag per NIP.

  7. N Optional

    A NIP the relay supports. One tag per NIP.

  8. R Optional

    A requirement from NIP-11 limitations: auth, writes, pow, payment.

  9. R Optional

    A requirement from NIP-11 limitations: auth, writes, pow, payment.

  10. R Optional

    A requirement from NIP-11 limitations: auth, writes, pow, payment.

  11. k Optional

    A kind the relay accepts, or refuses with a ! prefix.

  12. g Optional

    Where the relay is, as a geohash.

  13. l Optional

    A label, e.g. the relay's main language.

  14. rtt-open Optional

    How long opening a connection took.

  15. rtt-read Optional

    How long a read (REQ to first answer) took.

  16. rtt-write Optional

    How long a write (EVENT to OK) took.

Add tag

How this NIP works

Step 1 of 5

A monitor announces itself

A kind 10166 event says this key publishes relay reports regularly: how often, which checks it runs and its timeouts.

In the course

Builds on

See also

Specification

Specification text is quoted in English from the nostr-protocol/nips repository. Our explanations and the interface are translated. Source on GitHub at commit 0046368

Read the spec598 words, quoted from the repository at commit 0046368.

This NIP defines events for relay discovery and the announcement of relay monitors.

Relay Discovery Events

30166 relay discovery events document relay characteristics inferred either from a relay's NIP 11 document, or via probing.

Information corresponding to field in a relay's NIP 11 document MAY contradict actual values if monitors find that a different policy is implemented than is advertised.

content MAY include the stringified JSON of the relay's NIP-11 informational document.

The only required tag is the d tag, which MUST be set to the relay's normalized URL. For relays not accessible via URL, a hex-encoded pubkey MAY be used instead.

Other tags include:

  • rtt-open - The relay's open round-trip time in milliseconds.
  • rtt-read - The relay's read round-trip time in milliseconds.
  • rtt-write - The relay's write round-trip time in milliseconds.
  • n - The relay's network type. SHOULD be one of clearnet, tor, i2p, loki
  • T - The relay type. Enumerated relay type formatted as PascalCase, e.g. PrivateInbox
  • N - NIPs supported by the relay
  • R - Keys corresponding to requirements per NIP 11's limitations array, including auth, writes, pow, and payment. False values should be specified using a ! prefix, for example !auth.
  • t - A topic associated with this relay
  • k - Accepted and unaccepted kinds (false values prepended by !)
  • g - A NIP-52 geohash

Tags with more than one value should be repeated, rather than putting all values in a single tag, for example [["t", "cats"], ["t", "dogs"]], rather than [["t", "cats", "dogs"]].

Example:

{
  "id": "<eventid>",
  "pubkey": "<monitor's pubkey>",
  "created_at": "<created_at  [some recent date ...]>",
  "signature": "<signature>",
  "content": "<optional nip 11 document>",
  "kind": 30166,
  "tags": [
    ["d","wss://some.relay/"],
    ["n", "clearnet"],
    ["N", "40"],
    ["N", "33"],
    ["R", "!payment"],
    ["R", "auth"],
    ["g", "ww8p1r4t8"],
    ["l", "en", "ISO-639-1"],
    ["t", "nsfw" ],
    ["rtt-open", "234" ]
  ]
}

Relay Monitor Announcements

Kind 10166 relay monitor announcements advertise the author's intent to publish 30166 events. This event is optional and is intended for monitors who intend to provide monitoring services at a regular and predictable frequency.

Tags include:

  • frequency - The frequency in seconds at which the monitor publishes events.
  • timeout (optional) - The timeout values for various checks conducted by a monitor. Index 1 is the monitor's timeout in milliseconds. Index 2 describes what test the timeout is used for. If no index 2 is provided, it is inferred that the timeout provided applies to all tests.
  • c - a lowercase string describing the checks conducted by a monitor. Examples include open, read, write, auth, nip11, dns, and geo.
  • g - NIP-52 geohash tag

Monitors SHOULD also publish a kind 0 profile and a kind 10002 relay selections event.

Example:

{
  "id": "<eventid>",
  "pubkey": "<monitor's pubkey>",
  "created_at": "<created_at  [some recent date ...]>",
  "signature": "<signature>",
  "content": "",
  "tags": [
    [ "timeout", "open", "5000"  ],
    [ "timeout", "read", "3000"  ],
    [ "timeout", "write", "3000" ],
    [ "timeout", "nip11", "3000" ],
    [ "frequency", "3600" ],
    [ "c", "ws" ],
    [ "c", "nip11" ],
    [ "c", "ssl" ],
    [ "c", "dns" ],
    [ "c", "geo" ]
    [ "g", "ww8p1r4t8" ]
  ]
}

Risk Mitigation

  • Clients MUST NOT require 30166 events to function. Absence of monitoring data MUST NOT prevent relay connections.
  • A monitor may publish erroneous 30166 events, either by misconfiguration or malicious intent.
  • Clients SHOULD NOT trust a single source. Defenses include: web-of-trust filtering, querying multiple monitors, and discarding filter results if they would remove an unreasonable proportion of relays.