Community

NIPs

NIP-67: EOSE Completeness Hint

NIP-67 adds optional finish and more hints to EOSE so clients can know whether a relay sent all stored events for a subscription or whether pagination should continue.

NIP-67: EOSE Completeness Hint visual
NIPs Under the hood Events, NIPs, relay behavior and the shared formats apps can trust.
Back to Nostr
NIPs

NIPs shelf

NIP pages connect standards to product behavior, event kinds, relay rules, wallets, media, privacy and implementation risk.

NIPs All NIPs pages NIPs route archiveNIP explainer pages, NIP reference pages, Protocol orientation Browse pagesClose shelf

Protocol orientation

Field guides

Awesome Nostr branches

NIP reference pages

Android Signer ApplicationBasic key derivation from mnemonic seed phraseBasic protocol flowbech32-encoded entitiesBLE CommunicationsBlossomBridged EventsCalendar EventsChatsChessClassified ListingsCode SnippetsCommentsComplete NIP Archive IndexCrays NIP StrategyCustom EmojiData Vending MachinesDealing with Unknown EventsDelegated Event SigningDraft EventsE2EE Messaging using MLSEcash Mint DiscoverabilityEncrypted Direct MessageEvent Deletion RequestExpiration TimestampExternal Content IDsExternal IdentitiesExtra metadata fields and tagsFile MetadataFollow ListForum ThreadsGeocachingGift Wrapgit stuffHandling MentionsHTTP AuthHTTP File Storage IntegrationLabelingListsLive ActivitiesMapping Nostr keys to DNS-based identifiersModerated CommunitiesNegentropy SyncingNIP and standards researchNIP-67: EOSE Completeness HintNIP-02: Follow ListNIP-03: OpenTimestamps AttestationsNIP-04: Encrypted Direct MessageNIP-05: Mapping Nostr keys to DNS-based identifiersNIP-5A: Static Websites / nsitesNIP-06: Basic key derivation from mnemonic seed phraseNIP-07: window.nostr capability for web browsersNIP-7D: Forum ThreadsNIP-08: Handling MentionsNIP-09: Event Deletion RequestNIP-10: Text Notes and ThreadsNIP-12: Generic tag queriesNIP-13: Proof of WorkNIP-14: Subject tagNIP-15: Nostr MarketplaceNIP-16: Event treatmentNIP-17: Private Direct MessagesNIP-18: RepostsNIP-19: bech32-encoded entitiesNIP-20: Command resultsNIP-21: nostr: URI schemeNIP-22: CommentsNIP-23: Long-form ContentNIP-24: Extra metadata fields and tagsNIP-25: ReactionsNIP-26: Delegated Event SigningNIP-27: Text Note ReferencesNIP-28: Public ChatNIP-29: Relay-based GroupsNIP-30: Custom EmojiNIP-31: Dealing with Unknown EventsNIP-32: LabelingNIP-33: Parameterized replaceable eventsNIP-34: git stuffNIP-35: TorrentsNIP-36: Sensitive ContentNIP-37: Draft EventsNIP-38: User StatusesNIP-39: External IdentitiesNIP-40: Expiration TimestampNIP-42: Authentication of clients to relaysNIP-43: Relay Access Metadata and RequestsNIP-44: Versioned EncryptionNIP-45: Counting ResultsNIP-46: Nostr Remote SigningNIP-67: EOSE Completeness HintNIP-48: Bridged EventsNIP-49: Private Key EncryptionNIP-50: Search CapabilityNIP-51: ListsNIP-52: Calendar EventsNIP-53: Live ActivitiesNIP-54: WikiNIP-55: Android Signer ApplicationNIP-56: ReportingNIP-57: Lightning ZapsNIP-58: BadgesNIP-59: Gift WrapNIP-60: Cashu WalletNIP-61: NutzapsNIP-62: Request to VanishNIP-64: ChessNIP-65: Relay List MetadataNIP-68: Picture-first feedsNIP-69: Peer-to-peer Order eventsNIP-70: Protected EventsNIP-71: Video EventsNIP-72: Moderated CommunitiesNIP-73: External Content IDsNIP-75: Zap GoalsNIP-77: Negentropy SyncingNIP-78: Application-specific dataNIP-84: HighlightsNIP-85: Trusted AssertionsNIP-86: Relay Management APINIP-87: Ecash Mint DiscoverabilityNIP-88: PollsNIP-89: Recommended Application HandlersNIP-90: Data Vending MachinesNIP-92: Media Attachments MetadataNIP-94: File MetadataNIP-96: HTTP File Storage IntegrationNIP-98: HTTP AuthNIP-99: Classified ListingsNIP-A0: Voice MessagesNIP-A4: Public MessagesNIP-B0: Web BookmarksNIP-B7: BlossomNIP-BE: BLE CommunicationsNIP-C0: Code SnippetsNIP-C7: ChatsNIP-CC: GeocachingNIP-EE: E2EE Messaging using MLSNIP-F4: PodcastsNIPs mirrorNostr NIPsNostr Remote Signingnostr-protocol/nipsnostr: URI schemeOpenTimestamps AttestationsPeer-to-peer Order eventsPicture-first feedsPodcastsPollsPrivate Direct MessagesPrivate Key EncryptionProof of WorkProtected EventsPublic ChatPublic MessagesReactionsReportingRepostsRequest to VanishSearch CapabilitySensitive ContentStatic Websites / nsitesSubject tagText Note ReferencesText Notes and ThreadsTorrentsTrusted AssertionsUser StatusesVersioned EncryptionVoice MessagesWeb BookmarksWikiwindow.nostr capability for web browsers

Research and library

Source inventory

Deep Research: Standards and NIPsResearch Source: Android Signer ApplicationResearch Source: Application-specific dataResearch Source: Authentication of clients to relaysResearch Source: Basic key derivation from mnemonic seed phraseResearch Source: Basic protocol flowResearch Source: BLE CommunicationsResearch Source: BlossomResearch Source: Bridged EventsResearch Source: Calendar EventsResearch Source: ChatsResearch Source: ChessResearch Source: Classified ListingsResearch Source: Code SnippetsResearch Source: CommentsResearch Source: Counting ResultsResearch Source: Custom EmojiResearch Source: Data Vending MachinesResearch Source: Dealing with Unknown EventsResearch Source: Delegated Event SigningResearch Source: Draft EventsResearch Source: E2EE Messaging using MLSResearch Source: Ecash Mint DiscoverabilityResearch Source: Encrypted Direct MessageResearch Source: Event Deletion RequestResearch Source: Expiration TimestampResearch Source: External Content IDsResearch Source: External IdentitiesResearch Source: Extra metadata fields and tagsResearch Source: File MetadataResearch Source: Follow ListResearch Source: Forum ThreadsResearch Source: GeocachingResearch Source: Gift WrapResearch Source: Groups NIP-29Research Source: Handling MentionsResearch Source: HighlightsResearch Source: HTTP AuthResearch Source: HTTP File Storage IntegrationResearch Source: LabelingResearch Source: ListsResearch Source: Live ActivitiesResearch Source: Mapping Nostr keys to DNS-based identifiersResearch Source: Moderated CommunitiesResearch Source: NIP-03: OpenTimestamps AttestationsResearch Source: NIP-5A: Static Websites / nsitesResearch Source: NIP-07: window.nostr capability for web browsersResearch Source: NIP-10: Text Notes and ThreadsResearch Source: NIP-11: Relay Information DocumentResearch Source: NIP-13: Proof of WorkResearch Source: NIP-14: Subject tagResearch Source: NIP-17: Private Direct MessagesResearch Source: NIP-18: RepostsResearch Source: NIP-19: bech32-encoded entitiesResearch Source: NIP-21: nostr: URI schemeResearch Source: NIP-25: ReactionsResearch Source: NIP-27: Text Note ReferencesResearch Source: NIP-28: Public ChatResearch Source: NIP-29 Groups RelayResearch Source: NIP-29: Relay-based GroupsResearch Source: NIP-34: git stuffResearch Source: NIP-35: TorrentsResearch Source: NIP-36: Sensitive ContentResearch Source: NIP-38: User StatusesResearch Source: NIP-43: Relay Access Metadata and RequestsResearch Source: NIP-44: Versioned EncryptionResearch Source: NIP-46: Nostr Remote SigningResearch Source: NIP-49: Private Key EncryptionResearch Source: NIP-50: Search CapabilityResearch Source: NIP-54: WikiResearch Source: NIP-56: ReportingResearch Source: NIP-62: Request to VanishResearch Source: NIP-65: Relay List MetadataResearch Source: NIP-66 / nostr-watch stackResearch Source: NIP-66: Relay Liveness MonitoringResearch Source: NIP-68: Picture-first feedsResearch Source: NIP-69: Peer-to-peer Order eventsResearch Source: NIP-70: Protected EventsResearch Source: NIP-77: Negentropy SyncingResearch Source: NIP-85: Trusted AssertionsResearch Source: NIP-86: Relay Management APIResearch Source: NIP-88: PollsResearch Source: NIP-89: Recommended Application HandlersResearch Source: NIP-A0: Voice MessagesResearch Source: NIP-A4: Public MessagesResearch Source: NIP-B0: Web BookmarksResearch Source: NIP-F4: PodcastsResearch Source: NIPs mirrorResearch Source: nostr-protocol/nips GitHub
Core protocoldraftoptionalpagination

NIP-67: EOSE Completeness Hint

NIP-67 adds optional finish and more hints to EOSE so clients can know whether a relay sent all stored events for a subscription or whether pagination should continue.

The quick readNIP-67 adds optional finish and more hints to EOSE so clients can know whether a relay sent all stored events for a subscription or whether pagination should continue.
NIP67Statusdraft / optionalExtended messageEOSEHintsfinish, moreScopestored events onlyAddedJune 2026

EOSE used to say boundary, not completeness

In NIP-01, EOSE marks the end of stored events for a subscription before real-time events continue. It does not tell a client whether the relay sent every stored match or stopped because of an internal cap. That ambiguity is a real pagination problem.

Clients have historically guessed. If fewer events than the requested limit arrive, assume complete. If the limit is filled, paginate with until and ask again. That breaks when a relay's internal cap is lower than the client's requested limit, and it wastes requests when the result count exactly hits the cap.

NIP-67 adds a small hint array to EOSE. It is a tiny protocol change with large practical value for clients that sync history.

finish, more and safe fallback

A relay may send ["EOSE", subscription_id, [hints...]]. The current defined hints are finish and more. finish means the relay has sent every stored event matching the filters and the client should not paginate further. more means the relay holds more matching stored events than it has sent and the client should paginate.

Unknown hints must be ignored. Absence of hints is not definitive, so clients fall back to legacy pagination. The hint applies only to stored events. It does not stop real-time delivery.

The NIP also discusses created_at ties. If several events share the oldest timestamp in a page, naive pagination can skip events. Relays should include boundary-timestamp events where possible and emit finish only when no older events remain.

A fresh pagination NIP from June 2026

NIP-67 is extremely recent. mattn added the visible EOSE Completeness Hint in June 2026 through PR #2317. There is no long adoption history yet, which should be stated plainly.

Its freshness does not make it unimportant. Sync correctness is a core client problem. If a client silently misses older events because it guessed wrong, users see incomplete profiles, broken threads and unreliable archives.

The right reading is practical: implement it where possible, advertise support in NIP-11 and keep fallback behavior for relays that still send old two-element EOSE messages.

First visible addition2026-06-06 by mattnPull requestPR #2317Open Git history

The client gets to stop guessing

A relay implementing NIP-67 appends the hint array and advertises 67 in NIP-11 supported_nips. It should send finish only when it knows the stored result set is complete, and more when it knows more stored events remain.

A client implementing it should trust explicit finish, paginate on explicit more, ignore unknown hints and use its old pagination heuristic when hints are absent. This keeps compatibility with older relays and clients.

The UI effect is mostly invisible when it works. History loads completely with fewer wasted requests. That is exactly the kind of infrastructure NIP a reader may never notice but will feel when it is missing.

finishStored result set is complete; stop paginating.
moreMore stored results exist; paginate.
No hintFall back to legacy heuristic.
ScopeStored events only; real-time delivery continues.

A wrong hint is worse than no hint

If a relay sends finish incorrectly, a client can miss data with confidence. That is worse than old uncertainty. Relays should be conservative.

There is also boundary-timestamp risk. Pagination around equal created_at values needs care, or clients can lose events even while following the hint model.

Direct sources

The links below are part of the article, not decoration. Start with the official NIP, then read the file history, implementation references and adjacent standards before treating the page as product guidance.

Back to the NIPs atlas
NIPs route visual cue 1
NIPs route visual cue 2
NIPs route visual cue 3
NIPs route visual cue 4
NIPs route visual cue 5

How to use this page

Use the NIPs route when product behavior needs a standard.

Search NIP numbers, event kinds, signers, media, wallets and moderation standards before a detail turns into confusion.

NIPsThe full NIPs route stays openNIPs route archiveStandards, event kinds, implementation notes and consequences.Browse pages
NIPs route visual cue 1
NIPs route visual cue 2
NIPs route visual cue 3
NIPs route visual cue 4
NIPs route visual cue 5

Bring something back

Ask, suggest, submit or nominate.

Ask a question, send a source, suggest a fix, submit a project or nominate a public Nostr account. The page stays stable; your contribution gets reviewed beside it.