Référence du protocole relais Nostr (NIP-01) : les 8 messages
Tout le protocole client-relais de Nostr tient sur une page : huit messages en tableaux JSON et un objet filtre. Ce minimalisme est voulu — c’est ce qui permet à quiconque d’exploiter un relais et ce qui rend le réseau résistant à la capture. Cette référence détaille chaque message NIP-01 avec sa syntaxe exacte, les champs du filtre REQ et leurs règles de correspondance, et les préfixes de rejet normalisés qu’un relais renvoie. Elle complète notre canon Nostr aux côtés de l’index des NIP, de la référence des types d’événements et de la référence des tags standardisés. Les descriptions sont conservées en anglais.
Réponse rapide
Le protocole Nostr est étonnamment petit : un client et un relais échangent seulement 8 types de messages, tous des tableaux JSON. Le client envoie EVENT (publier), REQ (s'abonner avec des filtres) et CLOSE (se désabonner); le relais répond EVENT (un événement correspondant), OK (accepté/refusé), EOSE (fin des événements stockés, début du temps réel), CLOSED (abonnement refusé) et NOTICE (message lisible). Cette référence détaille chaque message avec sa syntaxe et son rôle, les champs de l'objet filtre du REQ (ids/authors/kinds/#tag/since/until/limit) et leurs règles de correspondance, et les 8 préfixes normalisés lisibles par machine des messages OK/CLOSED. Sourcé du NIP-01 canonique. Les descriptions sont conservées en anglais.
La règle de filtrage à retenir : au sein d'un filtre, toutes les conditions doivent correspondre (ET); entre plusieurs filtres d'un même REQ, un événement passe s'il correspond à N'IMPORTE lequel (OU). EOSE est le signal clé — il dit au client « rattrapage terminé, la suite est en direct ». AUTH n'est PAS ici (c'est NIP-42). CSV/JSON gratuits sous CC BY 4.0.
Télécharger le CSV Télécharger le JSON API REST →
Messages client → relais 3
| Message | Syntax | Rôle |
|---|---|---|
EVENT | ["EVENT", <event JSON>] | Publishes an event to the relay. The event is the full signed object (id, pubkey, created_at, kind, tags, content, sig). |
REQ | ["REQ", <subscription_id>, <filters1>, <filters2>, ...] | Requests stored events and subscribes to new ones. subscription_id is an arbitrary non-empty string up to 64 chars, scoped per connection; a new REQ with the same id replaces the old subscription. |
CLOSE | ["CLOSE", <subscription_id>] | Stops a previously opened subscription identified by subscription_id. |
Messages relais → client 5
| Message | Syntax | Rôle |
|---|---|---|
EVENT | ["EVENT", <subscription_id>, <event JSON>] | Sends an event matching a subscription. MUST carry a subscription_id from a REQ the client previously opened. |
OK | ["OK", <event_id>, <true|false>, <message>] | Reports acceptance (true) or rejection (false) of a client EVENT. The 4th parameter MUST be present; it MAY be empty when true, otherwise MUST be a machine-readable prefix + ':' + human message. |
EOSE | ["EOSE", <subscription_id>] | End Of Stored Events: marks the boundary between stored events and real-time events newly streamed for that subscription. |
CLOSED | ["CLOSED", <subscription_id>, <message>] | Sent when the relay refuses or terminates a subscription from its side. Uses the same prefix:message convention as OK. |
NOTICE | ["NOTICE", <message>] | Sends a human-readable message (usually an error) to the client. NIP-01 defines no rules for how NOTICEs are sent or handled. |
Champs de l'objet filtre (REQ)
| Champ | Type | Signification |
|---|---|---|
ids | array of strings | Event ids to match. MUST contain exact 64-char lowercase hex (exact match; no prefix matching in current NIP-01). |
authors | array of strings | The event pubkey must be one of these. MUST contain exact 64-char lowercase hex. |
kinds | array of integers | The event kind must be in the list. |
#<single-letter> | array of strings | Tag filter (e.g. #e = event ids, #p = pubkeys). Relays index single-letter tags; only the FIRST value of a tag is indexed. #e/#p MUST use exact 64-char lowercase hex. Event and filter must share at least one value. |
since | integer (unix seconds) | Event created_at must be >= since. |
until | integer (unix seconds) | Event created_at must be <= until. In short: since <= created_at <= until. |
limit | integer | Max events the relay SHOULD return for the initial query only (ignored afterwards). Returns the newest n by created_at (ties broken by lowest id). |
Préfixes normalisés OK / CLOSED
duplicate: The event was already received / stored.pow: The event does not meet a required proof-of-work difficulty.blocked: The pubkey or event is blocked by relay policy.rate-limited: The client is sending too fast.invalid: The event or request is malformed / fails validation.restricted: The action requires an authorization the client does not have.mute: The event was accepted-but-ignored (e.g. nobody was listening).error: Catch-all for when none of the other prefixes fit.Source : le NIP-01 canonique de nostr-protocol/nips (consulté le 2026-07-26). Complète la référence des NIP, des types d'événements et des tags standardisés — le quatrième pilier du canon Nostr sur le site.
Produits, réparations et guides connexes
- hub de souveraineté pour Bitcoiners
- la stack souveraine des plebs
- Nostr pour les Bitcoiners
- héberger votre propre relais Nostr
- débuter avec Meshtastic
- Bitcoin sur les réseaux mesh Meshtastic
- répertoire d’outils matériels open source
- minage Bitcoin hors réseau
Dernière révision: 26 juillet 2026.
