REST API, WebSocket feeds, and Nostr relay protocols for building on Nostr Archives.
| Service | URL | Protocol |
|---|---|---|
| REST API | https://api.nostrarchives.com | HTTP JSON |
| Live Metrics | wss://api.nostrarchives.com | WebSocket |
| Search Relay | wss://search.nostrarchives.com | Nostr NIP-50 |
| Feed Relay | wss://feeds.nostrarchives.com | Nostr NIP-01 |
| Scheduler Relay | wss://scheduler.nostrarchives.com | Nostr NIP-42 |
| Indexer Relay | wss://indexer.nostrarchives.com | Nostr NIP-01 |
https://api.nostrarchives.com — Rate limit: 120 requests/min per IP
HTTP JSON API for querying events, profiles, search, trending content, analytics, and admin operations.
/healthHealth check. Returns 200 OK when the service is running.
{ "status": "ok" }/v1/statsGlobal statistics: total events, unique pubkeys, event kind counts.
{
"total_events": 12345678,
"total_pubkeys": 234567,
"kinds": { "0": 150000, "1": 8000000, ... }
}/v1/stats/dailyDaily network stats: daily active users, total sats sent, daily posts. Served from Redis HyperLogLog counters for O(1) lookups.
{
"daily_active_users": 8234,
"total_sats_sent": 1456789,
"daily_posts": 45678
}/v1/stats/follower-cacheCache monitoring: Web of Trust, follower cache, and profile search cache statistics.
{
"wot": {
"passing_count": 45000,
"threshold": 21,
"last_refresh_ago_secs": 120,
"refresh_interval_secs": 900
},
"follower_cache": { ... },
"profile_search": { ... }
}/v1/crawler/statsCrawler queue progress and statistics. Returns `{ "enabled": false }` if the crawler is disabled.
{
"enabled": true,
"queue_size": 1234,
"processed": 56789,
"errors": 12
}/v1/eventsQuery events with filters. Returns events enriched with engagement stats (reactions, replies, reposts, zap_sats).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | no | — | Filter by author pubkey (hex or npub) |
| kind | integer | no | — | Filter by event kind |
| since | integer | no | — | Unix timestamp — events after this time |
| until | integer | no | — | Unix timestamp — events before this time |
| search | string | no | — | Full-text search query |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"events": [
{
"id": "abc123...",
"pubkey": "def456...",
"kind": 1,
"content": "Hello Nostr!",
"created_at": 1700000000,
"reactions": 42,
"replies": 5,
"reposts": 3,
"zap_sats": 21000
}
],
"count": 1
}/v1/events/{id}Get a single event by its ID (hex).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
{
"id": "abc123...",
"pubkey": "def456...",
"kind": 1,
"content": "Hello Nostr!",
"created_at": 1700000000,
"tags": [["e", "..."], ["p", "..."]]
}/v1/events/{id}/threadGet full thread context: parent/root references, replies, reactions, reposts, and zaps.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
| limit | integer | no | 50 | Max replies (1–500) |
{
"event": { ... },
"ancestors": [ ... ],
"replies": [ ... ],
"reactions": 42,
"reposts": 3,
"zap_sats": 21000
}/v1/pages/note/{id}Frontend-optimized note detail. Single SQL round-trip returns the event, thread refs, interaction stats, replies, and profile metadata for all involved pubkeys.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
| limit | integer | no | 50 | Max replies (1–200) |
{
"event": { ... },
"replies": [ ... ],
"profiles": { "<pubkey>": { "name": "...", "picture": "..." } },
"interactions": { "reactions": 42, "replies": 5, ... }
}/v1/events/{id}/interactionsLightweight interaction counts for an event. No full events returned.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
{
"reactions": 42,
"replies": 5,
"reposts": 3,
"zap_sats": 21000
}/v1/events/{id}/refs/{ref_type}Get events that reference a target event, filtered by reference type.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Target event ID (64-char hex) |
| ref_type | string | yes | — | Reference type(reply, reaction, repost, zap, mention, root) |
| limit | integer | no | 50 | Max results (1–500) |
{
"events": [ ... ],
"count": 5,
"ref_type": "reply"
}/v1/profiles/metadataBatch fetch profile metadata for multiple pubkeys. Accepts hex pubkeys or npubs. Cached for 5 minutes.
JSON body with array of pubkeys (max 500).
{ "pubkeys": ["abc123...", "npub1..."] }{
"profiles": [
{
"pubkey": "abc123...",
"display_name": "Alice",
"name": "alice",
"preferred_name": "Alice",
"picture": "https://...",
"about": "Nostr enthusiast",
"nip05": "alice@example.com",
"lud16": "alice@walletofsatoshi.com"
}
]
}/v1/profiles/{pubkey}/notesRoot notes (non-replies) by a specific author, with engagement stats and profile metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Author pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"events": [
{ "id": "...", "content": "...", "reactions": 10, "replies": 2, ... }
],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/profiles/{pubkey}/repliesReplies by a specific author, with engagement stats and profile metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Author pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"events": [ ... ],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/profiles/{pubkey}/zaps/sentZaps sent by a specific pubkey, with recipient metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Sender pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"zaps": [
{ "event": { ... }, "amount_sats": 1000, "recipient": "...", "zapped_event_id": "..." }
],
"total": 42,
"profiles": { ... }
}/v1/profiles/{pubkey}/zaps/receivedZaps received by a specific pubkey, with sender metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Recipient pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"zaps": [
{ "event": { ... }, "amount_sats": 5000, "sender": "...", "zapped_event_id": "..." }
],
"total": 128,
"profiles": { ... }
}/v1/profiles/{pubkey}/zap-statsZap statistics for a pubkey: total sats sent/received and zap counts.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Pubkey (hex or npub) |
{
"sent": { "total_sats": 150000, "count": 42 },
"received": { "total_sats": 500000, "count": 128 }
}/v1/searchFull-text search across profiles and notes. Automatically detects and resolves Nostr entities (npub, nprofile, nevent, note1, 64-char hex).
If the query resolves to a Nostr entity, a `resolved` object is returned instead of search results.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | yes | — | Search query |
| type | string | no | all | Result type filter(all, profiles, notes) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"query": "bitcoin",
"profiles": [
{ "pubkey": "...", "name": "...", "display_name": "...", "picture": "...", "nip05": "...", "follower_count": 1234 }
],
"notes": [
{ "id": "...", "pubkey": "...", "content": "...", "created_at": 1700000000, "reactions": 10 }
]
}/v1/search/suggestAutocomplete suggestions for search-as-you-type. Returns profile suggestions ranked by prefix match quality and follower count. Also resolves Nostr entities.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | yes | — | Search query (min 2 characters) |
| limit | integer | no | 5 | Max suggestions (1–10) |
{
"query": "al",
"suggestions": [
{ "pubkey": "...", "name": "alice", "display_name": "Alice", "picture": "...", "follower_count": 5000 }
]
}/v1/notes/searchAdvanced note search with filters for author, reply context, and sort order.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | no | — | Full-text search query |
| exclude | string | no | — | Exclude notes containing this term |
| author | string | no | — | Filter by author pubkey (hex or npub) |
| reply_to | string | no | — | Filter to replies to this pubkey (hex or npub) |
| order | string | no | newest | Sort order(newest, oldest, engagement) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"notes": [
{ "event": { ... }, "reactions": 10, "replies": 2, "reposts": 1, "zap_sats": 5000 }
],
"total": 142,
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/notes/topTop notes ranked by a specific engagement metric within a time range. Aggressively cached in Redis (90s for today, up to 1h for all-time).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| metric | string | no | reactions | Engagement metric(reactions, replies, reposts, zaps) |
| range | string | no | today | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"metric": "reactions",
"range": "today",
"notes": [
{
"count": 150,
"total_sats": 50000,
"reactions": 150,
"replies": 20,
"reposts": 10,
"zap_sats": 50000,
"event": { "id": "...", "content": "...", ... }
}
],
"profiles": { "<pubkey>": { "name": "...", "picture": "..." } }
}/v1/notes/trendingTrending notes ranked by a composite engagement score (reactions + replies + reposts + zap sats). Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "notes": [ ... ] }/v1/users/newRecently joined users (first seen in the last 24 hours). Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "users": [ { "pubkey": "...", "name": "...", "created_at": 1700000000 } ] }/v1/users/trendingTrending users ranked by new follower count in the last 24 hours. Cached 24 hours.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "users": [ ... ] }/v1/users/zappersTop zappers by sats sent or received in a time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| direction | string | no | received | Zap direction(sent, received) |
| range | string | no | 7d | Time range(today, 7d, 30d, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"direction": "received",
"range": "7d",
"zappers": [ { "pubkey": "...", "total_sats": 500000, "zap_count": 42 } ]
}/v1/hashtags/{tag}/notesNotes tagged with a specific hashtag, with profile metadata. Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| tag | string | yes | — | Hashtag (without #) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"hashtag": "bitcoin",
"notes": [ ... ],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/analytics/dailyDaily analytics for the last N days. Cached 24 hours (immutable once computed).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | no | 30 | Number of days (1–365) |
{
"data": [
{ "date": "2025-01-15", "dau": 8234, "posts": 45678, "zap_sats": 1456789 }
],
"range": { "from": "2024-12-16", "to": "2025-01-15" }
}/v1/analytics/top-postersAuthors ranked by number of kind-1 notes published in the time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| range | string | no | 7d | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "range": "7d", "authors": [ { "pubkey": "...", "count": 234 } ] }/v1/analytics/most-likedAuthors whose notes received the most reactions (kind-7) in the time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| range | string | no | 7d | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "range": "7d", "authors": [ { "pubkey": "...", "count": 567 } ] }/v1/clients/leaderboardNostr clients ranked by note count and distinct user count. Cached 10 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "clients": [ { "client_name": "Damus", "note_count": 500000, "user_count": 12000 } ] }/v1/clients/{client_name}/usersTop users of a specific Nostr client, ranked by note count. Cached 10 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| client_name | string | yes | — | Client name (case-insensitive) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"client_name": "damus",
"users": [ { "pubkey": "...", "note_count": 1234 } ],
"profiles": { ... }
}/v1/relays/leaderboardTop relays ranked by event count. Cached 30 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "relays": [ { "url": "wss://relay.damus.io", "event_count": 5000000 } ] }All admin endpoints require NIP-98 HTTP Auth (signed kind-27235 event). Rate limited to 10 req/min per IP.
/v1/admin/check-authVerify admin authentication status.
{ "authenticated": true, "pubkey": "abc123..." }/v1/admin/block-pubkeyBlock a pubkey. Queues data for deletion.
Pubkey to block with reason.
{ "pubkey": "abc123...", "reason": "spam" }{ "blocked": true, "pubkey": "abc123..." }/v1/admin/block-pubkeyUnblock a previously blocked pubkey.
Pubkey to unblock.
{ "pubkey": "abc123..." }{ "unblocked": true }/v1/admin/blocked-pubkeysList all blocked pubkeys.
[ { "pubkey": "abc123...", "reason": "spam", "blocked_at": "2025-01-01T00:00:00Z" } ]/v1/admin/purge-status/{pubkey}Check data deletion progress for a blocked pubkey.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Pubkey (64-char hex) |
{ "pubkey": "abc123...", "status": "completed", "events_deleted": 1234 }/v1/admin/block-hashtagBlock a hashtag from trending and search results.
Hashtag to block with reason.
{ "hashtag": "spam", "reason": "abuse" }{ "blocked": true }/v1/admin/block-hashtagUnblock a hashtag.
Hashtag to unblock.
{ "hashtag": "spam" }{ "unblocked": true }/v1/admin/block-search-termBlock a search term from returning results.
Term to block with reason.
{ "term": "badterm", "reason": "abuse" }{ "blocked": true }/v1/admin/block-search-termUnblock a search term.
Term to unblock.
{ "term": "badterm" }{ "unblocked": true }/v1/admin/blocked-search-termsList all blocked search terms.
[ { "term": "badterm", "reason": "abuse" } ]wss://api.nostrarchives.com/v1/ws/live-metricsReal-time network metrics stream. Sends an initial snapshot then streams updates every 2–5 seconds. Keepalive ping every 30 seconds.
Current online user count, sats zapped, and notes posted (10-minute sliding window).
{ "online": 1234, "sats": 56789, "notes": 4567 }wss://api.nostrarchives.com/v1/ws/online-usersLive online users stream. Sends an initial snapshot of all active users, then batched updates (max 2/sec).
Full list of currently active users.
{ "type": "snapshot", "users": [{ "pubkey": "...", "last_active_ms": 1700000000000, "activity_kind": 1 }] }Incremental updates as users become active.
{ "type": "update", "users": [{ "pubkey": "...", "last_active_ms": 1700000000000, "activity_kind": 1 }] }wss://search.nostrarchives.com
NIP-50 full-text search relay. Connects at the root path and uses standard Nostr NIP-01 protocol with NIP-50 search extension.
wss://search.nostrarchives.comFull-text search across profiles (kind 0) and notes (kind 1). Supports hashtag filtering via `#t` tags, NIP-19 entity resolution (npub, nprofile, nevent, note1), and 64-char hex lookups.
Subscribe with a NIP-50 search filter. Omit `kinds` to search both profiles and notes.
["REQ", "sub1", { "search": "bitcoin", "kinds": [0, 1], "limit": 20 }]Search notes by hashtag using the `#t` tag filter.
["REQ", "sub1", { "search": "#bitcoin", "kinds": [1], "#t": ["bitcoin"], "limit": 20 }]Each matching event is sent as a raw Nostr event.
["EVENT", "sub1", { "id": "...", "pubkey": "...", "kind": 1, "content": "...", "created_at": 1700000000, "tags": [...], "sig": "..." }]Signals all matching events have been sent for this subscription.
["EOSE", "sub1"]
Close an active subscription.
["CLOSE", "sub1"]
wss://feeds.nostrarchives.com
Pre-computed Nostr feeds served via NIP-01 protocol. Connect to specific path-based endpoints for trending notes, user feeds, profile rankings, and hashtags.
wss://feeds.nostrarchives.com/notes/trending/{metric}/{range}Trending notes ranked by engagement metric within a time range. Notes are pre-ranked — events arrive in ranked order.
Request trending notes. Limit is clamped to 1–200.
["REQ", "sub1", { "limit": 20 }]Events arrive in ranked order (highest engagement first).
["EVENT", "sub1", { "id": "...", "kind": 1, "content": "...", ... }]All ranked events have been sent.
["EOSE", "sub1"]
wss://feeds.nostrarchives.com/users/upandcomingEmerging users — returns kind-0 profile events for trending new users. Cached 24 hours.
Request emerging user profiles.
["REQ", "sub1", { "limit": 20 }]Kind-0 metadata events for emerging users.
["EVENT", "sub1", { "id": "...", "kind": 0, "content": "{...}", ... }]wss://feeds.nostrarchives.com/profiles/followersFollower profiles for a pubkey. Returns kind-0 profile events. Cached 10 minutes.
Pass the target pubkey in the `authors` filter to get their followers' profiles.
["REQ", "sub1", { "authors": ["<target_pubkey>"] }]Kind-0 metadata events for each follower.
["EVENT", "sub1", { "kind": 0, "content": "{...}", ... }]wss://feeds.nostrarchives.com/profiles/{note_type}/{metric}Ranked notes for a specific profile. Returns the author's top-performing notes sorted by the chosen metric. Cached 5 minutes.
Pass the author's pubkey in the `authors` filter.
["REQ", "sub1", { "authors": ["<pubkey>"] }]Notes arrive ranked by the selected metric.
["EVENT", "sub1", { "kind": 1, "content": "...", ... }]wss://scheduler.nostrarchives.com
Authenticated relay for scheduling future-dated Nostr events. Events are held and published at their `created_at` timestamp to the author's NIP-65 write relays.
wss://scheduler.nostrarchives.comConnect and authenticate via NIP-42, then submit future-dated events, query your pending events, or cancel them via NIP-09 deletion.
Sent immediately on connection. You must respond with a signed auth event before sending other messages.
["AUTH", "<challenge_string>"]
Sign a kind-22242 event with the challenge tag to authenticate.
["AUTH", { "kind": 22242, "content": "", "tags": [["relay", "wss://scheduler.nostrarchives.com"], ["challenge", "<challenge_string>"]], "created_at": 1700000000, "pubkey": "...", "id": "...", "sig": "..." }]Submit a future-dated event. The `created_at` must be 60 seconds to 90 days in the future. Pubkey must match authenticated user.
["EVENT", { "kind": 1, "content": "Scheduled post!", "created_at": 1700100000, "pubkey": "...", "id": "...", "sig": "...", "tags": [] }]Confirmation that the event was accepted for scheduling.
["OK", "<event_id>", true, ""]
Submit a kind-5 deletion event referencing the scheduled event(s) to cancel.
["EVENT", { "kind": 5, "content": "", "tags": [["e", "<event_id_to_cancel>"]], "pubkey": "...", "id": "...", "sig": "..." }]Query your own scheduled events. The `authors` filter is ignored — only your own events are returned.
["REQ", "sub1", { "kinds": [1] }]Close an active subscription.
["CLOSE", "sub1"]
wss://indexer.nostrarchives.com — Rate limit: 30 requests/min per IP
Read-only metadata relay for efficient bulk profile discovery. Only serves kinds 0 (metadata), 3 (contact lists), and 10002 (relay lists).
wss://indexer.nostrarchives.comQuery metadata, contact lists, and relay lists for batches of pubkeys. No event publishing allowed.
Request metadata for a batch of pubkeys. The `authors` filter is required (1–500 hex pubkeys).
["REQ", "sub1", { "authors": ["<pubkey1>", "<pubkey2>", "..."], "kinds": [0, 3, 10002] }]Raw Nostr events for the requested kinds.
["EVENT", "sub1", { "kind": 0, "pubkey": "...", "content": "{"name":"Alice",...}", ... }]All matching events have been sent.
["EOSE", "sub1"]
Close an active subscription.
["CLOSE", "sub1"]
| Service | URL | Protocol |
|---|---|---|
| REST API | https://api.nostrarchives.com | HTTP JSON |
| Live Metrics | wss://api.nostrarchives.com | WebSocket |
| Search Relay | wss://search.nostrarchives.com | Nostr NIP-50 |
| Feed Relay | wss://feeds.nostrarchives.com | Nostr NIP-01 |
| Scheduler Relay | wss://scheduler.nostrarchives.com | Nostr NIP-42 |
| Indexer Relay | wss://indexer.nostrarchives.com | Nostr NIP-01 |
https://api.nostrarchives.com — Rate limit: 120 requests/min per IP
HTTP JSON API for querying events, profiles, search, trending content, analytics, and admin operations.
/healthHealth check. Returns 200 OK when the service is running.
{ "status": "ok" }/v1/statsGlobal statistics: total events, unique pubkeys, event kind counts.
{
"total_events": 12345678,
"total_pubkeys": 234567,
"kinds": { "0": 150000, "1": 8000000, ... }
}/v1/stats/dailyDaily network stats: daily active users, total sats sent, daily posts. Served from Redis HyperLogLog counters for O(1) lookups.
{
"daily_active_users": 8234,
"total_sats_sent": 1456789,
"daily_posts": 45678
}/v1/stats/follower-cacheCache monitoring: Web of Trust, follower cache, and profile search cache statistics.
{
"wot": {
"passing_count": 45000,
"threshold": 21,
"last_refresh_ago_secs": 120,
"refresh_interval_secs": 900
},
"follower_cache": { ... },
"profile_search": { ... }
}/v1/crawler/statsCrawler queue progress and statistics. Returns `{ "enabled": false }` if the crawler is disabled.
{
"enabled": true,
"queue_size": 1234,
"processed": 56789,
"errors": 12
}/v1/eventsQuery events with filters. Returns events enriched with engagement stats (reactions, replies, reposts, zap_sats).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | no | — | Filter by author pubkey (hex or npub) |
| kind | integer | no | — | Filter by event kind |
| since | integer | no | — | Unix timestamp — events after this time |
| until | integer | no | — | Unix timestamp — events before this time |
| search | string | no | — | Full-text search query |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"events": [
{
"id": "abc123...",
"pubkey": "def456...",
"kind": 1,
"content": "Hello Nostr!",
"created_at": 1700000000,
"reactions": 42,
"replies": 5,
"reposts": 3,
"zap_sats": 21000
}
],
"count": 1
}/v1/events/{id}Get a single event by its ID (hex).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
{
"id": "abc123...",
"pubkey": "def456...",
"kind": 1,
"content": "Hello Nostr!",
"created_at": 1700000000,
"tags": [["e", "..."], ["p", "..."]]
}/v1/events/{id}/threadGet full thread context: parent/root references, replies, reactions, reposts, and zaps.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
| limit | integer | no | 50 | Max replies (1–500) |
{
"event": { ... },
"ancestors": [ ... ],
"replies": [ ... ],
"reactions": 42,
"reposts": 3,
"zap_sats": 21000
}/v1/pages/note/{id}Frontend-optimized note detail. Single SQL round-trip returns the event, thread refs, interaction stats, replies, and profile metadata for all involved pubkeys.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
| limit | integer | no | 50 | Max replies (1–200) |
{
"event": { ... },
"replies": [ ... ],
"profiles": { "<pubkey>": { "name": "...", "picture": "..." } },
"interactions": { "reactions": 42, "replies": 5, ... }
}/v1/events/{id}/interactionsLightweight interaction counts for an event. No full events returned.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Event ID (64-char hex) |
{
"reactions": 42,
"replies": 5,
"reposts": 3,
"zap_sats": 21000
}/v1/events/{id}/refs/{ref_type}Get events that reference a target event, filtered by reference type.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | yes | — | Target event ID (64-char hex) |
| ref_type | string | yes | — | Reference type(reply, reaction, repost, zap, mention, root) |
| limit | integer | no | 50 | Max results (1–500) |
{
"events": [ ... ],
"count": 5,
"ref_type": "reply"
}/v1/profiles/metadataBatch fetch profile metadata for multiple pubkeys. Accepts hex pubkeys or npubs. Cached for 5 minutes.
JSON body with array of pubkeys (max 500).
{ "pubkeys": ["abc123...", "npub1..."] }{
"profiles": [
{
"pubkey": "abc123...",
"display_name": "Alice",
"name": "alice",
"preferred_name": "Alice",
"picture": "https://...",
"about": "Nostr enthusiast",
"nip05": "alice@example.com",
"lud16": "alice@walletofsatoshi.com"
}
]
}/v1/profiles/{pubkey}/notesRoot notes (non-replies) by a specific author, with engagement stats and profile metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Author pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"events": [
{ "id": "...", "content": "...", "reactions": 10, "replies": 2, ... }
],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/profiles/{pubkey}/repliesReplies by a specific author, with engagement stats and profile metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Author pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"events": [ ... ],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/profiles/{pubkey}/zaps/sentZaps sent by a specific pubkey, with recipient metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Sender pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"zaps": [
{ "event": { ... }, "amount_sats": 1000, "recipient": "...", "zapped_event_id": "..." }
],
"total": 42,
"profiles": { ... }
}/v1/profiles/{pubkey}/zaps/receivedZaps received by a specific pubkey, with sender metadata.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Recipient pubkey (hex or npub) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
| sort | string | no | recent | Sort order(recent, engagement) |
{
"zaps": [
{ "event": { ... }, "amount_sats": 5000, "sender": "...", "zapped_event_id": "..." }
],
"total": 128,
"profiles": { ... }
}/v1/profiles/{pubkey}/zap-statsZap statistics for a pubkey: total sats sent/received and zap counts.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Pubkey (hex or npub) |
{
"sent": { "total_sats": 150000, "count": 42 },
"received": { "total_sats": 500000, "count": 128 }
}/v1/searchFull-text search across profiles and notes. Automatically detects and resolves Nostr entities (npub, nprofile, nevent, note1, 64-char hex).
If the query resolves to a Nostr entity, a `resolved` object is returned instead of search results.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | yes | — | Search query |
| type | string | no | all | Result type filter(all, profiles, notes) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"query": "bitcoin",
"profiles": [
{ "pubkey": "...", "name": "...", "display_name": "...", "picture": "...", "nip05": "...", "follower_count": 1234 }
],
"notes": [
{ "id": "...", "pubkey": "...", "content": "...", "created_at": 1700000000, "reactions": 10 }
]
}/v1/search/suggestAutocomplete suggestions for search-as-you-type. Returns profile suggestions ranked by prefix match quality and follower count. Also resolves Nostr entities.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | yes | — | Search query (min 2 characters) |
| limit | integer | no | 5 | Max suggestions (1–10) |
{
"query": "al",
"suggestions": [
{ "pubkey": "...", "name": "alice", "display_name": "Alice", "picture": "...", "follower_count": 5000 }
]
}/v1/notes/searchAdvanced note search with filters for author, reply context, and sort order.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | no | — | Full-text search query |
| exclude | string | no | — | Exclude notes containing this term |
| author | string | no | — | Filter by author pubkey (hex or npub) |
| reply_to | string | no | — | Filter to replies to this pubkey (hex or npub) |
| order | string | no | newest | Sort order(newest, oldest, engagement) |
| limit | integer | no | 20 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"notes": [
{ "event": { ... }, "reactions": 10, "replies": 2, "reposts": 1, "zap_sats": 5000 }
],
"total": 142,
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/notes/topTop notes ranked by a specific engagement metric within a time range. Aggressively cached in Redis (90s for today, up to 1h for all-time).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| metric | string | no | reactions | Engagement metric(reactions, replies, reposts, zaps) |
| range | string | no | today | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"metric": "reactions",
"range": "today",
"notes": [
{
"count": 150,
"total_sats": 50000,
"reactions": 150,
"replies": 20,
"reposts": 10,
"zap_sats": 50000,
"event": { "id": "...", "content": "...", ... }
}
],
"profiles": { "<pubkey>": { "name": "...", "picture": "..." } }
}/v1/notes/trendingTrending notes ranked by a composite engagement score (reactions + replies + reposts + zap sats). Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "notes": [ ... ] }/v1/users/newRecently joined users (first seen in the last 24 hours). Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "users": [ { "pubkey": "...", "name": "...", "created_at": 1700000000 } ] }/v1/users/trendingTrending users ranked by new follower count in the last 24 hours. Cached 24 hours.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "users": [ ... ] }/v1/users/zappersTop zappers by sats sent or received in a time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| direction | string | no | received | Zap direction(sent, received) |
| range | string | no | 7d | Time range(today, 7d, 30d, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"direction": "received",
"range": "7d",
"zappers": [ { "pubkey": "...", "total_sats": 500000, "zap_count": 42 } ]
}/v1/hashtags/{tag}/notesNotes tagged with a specific hashtag, with profile metadata. Cached 5 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| tag | string | yes | — | Hashtag (without #) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"hashtag": "bitcoin",
"notes": [ ... ],
"profiles": { "<pubkey>": { "name": "...", ... } }
}/v1/analytics/dailyDaily analytics for the last N days. Cached 24 hours (immutable once computed).
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| days | integer | no | 30 | Number of days (1–365) |
{
"data": [
{ "date": "2025-01-15", "dau": 8234, "posts": 45678, "zap_sats": 1456789 }
],
"range": { "from": "2024-12-16", "to": "2025-01-15" }
}/v1/analytics/top-postersAuthors ranked by number of kind-1 notes published in the time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| range | string | no | 7d | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "range": "7d", "authors": [ { "pubkey": "...", "count": 234 } ] }/v1/analytics/most-likedAuthors whose notes received the most reactions (kind-7) in the time range.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| range | string | no | 7d | Time range(today, 7d, 30d, 1y, all) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "range": "7d", "authors": [ { "pubkey": "...", "count": 567 } ] }/v1/clients/leaderboardNostr clients ranked by note count and distinct user count. Cached 10 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "clients": [ { "client_name": "Damus", "note_count": 500000, "user_count": 12000 } ] }/v1/clients/{client_name}/usersTop users of a specific Nostr client, ranked by note count. Cached 10 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| client_name | string | yes | — | Client name (case-insensitive) |
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{
"client_name": "damus",
"users": [ { "pubkey": "...", "note_count": 1234 } ],
"profiles": { ... }
}/v1/relays/leaderboardTop relays ranked by event count. Cached 30 minutes.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | integer | no | 100 | Max results (1–100) |
| offset | integer | no | 0 | Pagination offset |
{ "relays": [ { "url": "wss://relay.damus.io", "event_count": 5000000 } ] }All admin endpoints require NIP-98 HTTP Auth (signed kind-27235 event). Rate limited to 10 req/min per IP.
/v1/admin/check-authVerify admin authentication status.
{ "authenticated": true, "pubkey": "abc123..." }/v1/admin/block-pubkeyBlock a pubkey. Queues data for deletion.
Pubkey to block with reason.
{ "pubkey": "abc123...", "reason": "spam" }{ "blocked": true, "pubkey": "abc123..." }/v1/admin/block-pubkeyUnblock a previously blocked pubkey.
Pubkey to unblock.
{ "pubkey": "abc123..." }{ "unblocked": true }/v1/admin/blocked-pubkeysList all blocked pubkeys.
[ { "pubkey": "abc123...", "reason": "spam", "blocked_at": "2025-01-01T00:00:00Z" } ]/v1/admin/purge-status/{pubkey}Check data deletion progress for a blocked pubkey.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| pubkey | string | yes | — | Pubkey (64-char hex) |
{ "pubkey": "abc123...", "status": "completed", "events_deleted": 1234 }/v1/admin/block-hashtagBlock a hashtag from trending and search results.
Hashtag to block with reason.
{ "hashtag": "spam", "reason": "abuse" }{ "blocked": true }/v1/admin/block-hashtagUnblock a hashtag.
Hashtag to unblock.
{ "hashtag": "spam" }{ "unblocked": true }/v1/admin/block-search-termBlock a search term from returning results.
Term to block with reason.
{ "term": "badterm", "reason": "abuse" }{ "blocked": true }/v1/admin/block-search-termUnblock a search term.
Term to unblock.
{ "term": "badterm" }{ "unblocked": true }/v1/admin/blocked-search-termsList all blocked search terms.
[ { "term": "badterm", "reason": "abuse" } ]wss://api.nostrarchives.com/v1/ws/live-metricsReal-time network metrics stream. Sends an initial snapshot then streams updates every 2–5 seconds. Keepalive ping every 30 seconds.
Current online user count, sats zapped, and notes posted (10-minute sliding window).
{ "online": 1234, "sats": 56789, "notes": 4567 }wss://api.nostrarchives.com/v1/ws/online-usersLive online users stream. Sends an initial snapshot of all active users, then batched updates (max 2/sec).
Full list of currently active users.
{ "type": "snapshot", "users": [{ "pubkey": "...", "last_active_ms": 1700000000000, "activity_kind": 1 }] }Incremental updates as users become active.
{ "type": "update", "users": [{ "pubkey": "...", "last_active_ms": 1700000000000, "activity_kind": 1 }] }wss://search.nostrarchives.com
NIP-50 full-text search relay. Connects at the root path and uses standard Nostr NIP-01 protocol with NIP-50 search extension.
wss://search.nostrarchives.comFull-text search across profiles (kind 0) and notes (kind 1). Supports hashtag filtering via `#t` tags, NIP-19 entity resolution (npub, nprofile, nevent, note1), and 64-char hex lookups.
Subscribe with a NIP-50 search filter. Omit `kinds` to search both profiles and notes.
["REQ", "sub1", { "search": "bitcoin", "kinds": [0, 1], "limit": 20 }]Search notes by hashtag using the `#t` tag filter.
["REQ", "sub1", { "search": "#bitcoin", "kinds": [1], "#t": ["bitcoin"], "limit": 20 }]Each matching event is sent as a raw Nostr event.
["EVENT", "sub1", { "id": "...", "pubkey": "...", "kind": 1, "content": "...", "created_at": 1700000000, "tags": [...], "sig": "..." }]Signals all matching events have been sent for this subscription.
["EOSE", "sub1"]
Close an active subscription.
["CLOSE", "sub1"]
wss://feeds.nostrarchives.com
Pre-computed Nostr feeds served via NIP-01 protocol. Connect to specific path-based endpoints for trending notes, user feeds, profile rankings, and hashtags.
wss://feeds.nostrarchives.com/notes/trending/{metric}/{range}Trending notes ranked by engagement metric within a time range. Notes are pre-ranked — events arrive in ranked order.
Request trending notes. Limit is clamped to 1–200.
["REQ", "sub1", { "limit": 20 }]Events arrive in ranked order (highest engagement first).
["EVENT", "sub1", { "id": "...", "kind": 1, "content": "...", ... }]All ranked events have been sent.
["EOSE", "sub1"]
wss://feeds.nostrarchives.com/users/upandcomingEmerging users — returns kind-0 profile events for trending new users. Cached 24 hours.
Request emerging user profiles.
["REQ", "sub1", { "limit": 20 }]Kind-0 metadata events for emerging users.
["EVENT", "sub1", { "id": "...", "kind": 0, "content": "{...}", ... }]wss://feeds.nostrarchives.com/profiles/followersFollower profiles for a pubkey. Returns kind-0 profile events. Cached 10 minutes.
Pass the target pubkey in the `authors` filter to get their followers' profiles.
["REQ", "sub1", { "authors": ["<target_pubkey>"] }]Kind-0 metadata events for each follower.
["EVENT", "sub1", { "kind": 0, "content": "{...}", ... }]wss://feeds.nostrarchives.com/profiles/{note_type}/{metric}Ranked notes for a specific profile. Returns the author's top-performing notes sorted by the chosen metric. Cached 5 minutes.
Pass the author's pubkey in the `authors` filter.
["REQ", "sub1", { "authors": ["<pubkey>"] }]Notes arrive ranked by the selected metric.
["EVENT", "sub1", { "kind": 1, "content": "...", ... }]wss://scheduler.nostrarchives.com
Authenticated relay for scheduling future-dated Nostr events. Events are held and published at their `created_at` timestamp to the author's NIP-65 write relays.
wss://scheduler.nostrarchives.comConnect and authenticate via NIP-42, then submit future-dated events, query your pending events, or cancel them via NIP-09 deletion.
Sent immediately on connection. You must respond with a signed auth event before sending other messages.
["AUTH", "<challenge_string>"]
Sign a kind-22242 event with the challenge tag to authenticate.
["AUTH", { "kind": 22242, "content": "", "tags": [["relay", "wss://scheduler.nostrarchives.com"], ["challenge", "<challenge_string>"]], "created_at": 1700000000, "pubkey": "...", "id": "...", "sig": "..." }]Submit a future-dated event. The `created_at` must be 60 seconds to 90 days in the future. Pubkey must match authenticated user.
["EVENT", { "kind": 1, "content": "Scheduled post!", "created_at": 1700100000, "pubkey": "...", "id": "...", "sig": "...", "tags": [] }]Confirmation that the event was accepted for scheduling.
["OK", "<event_id>", true, ""]
Submit a kind-5 deletion event referencing the scheduled event(s) to cancel.
["EVENT", { "kind": 5, "content": "", "tags": [["e", "<event_id_to_cancel>"]], "pubkey": "...", "id": "...", "sig": "..." }]Query your own scheduled events. The `authors` filter is ignored — only your own events are returned.
["REQ", "sub1", { "kinds": [1] }]Close an active subscription.
["CLOSE", "sub1"]
wss://indexer.nostrarchives.com — Rate limit: 30 requests/min per IP
Read-only metadata relay for efficient bulk profile discovery. Only serves kinds 0 (metadata), 3 (contact lists), and 10002 (relay lists).
wss://indexer.nostrarchives.comQuery metadata, contact lists, and relay lists for batches of pubkeys. No event publishing allowed.
Request metadata for a batch of pubkeys. The `authors` filter is required (1–500 hex pubkeys).
["REQ", "sub1", { "authors": ["<pubkey1>", "<pubkey2>", "..."], "kinds": [0, 3, 10002] }]Raw Nostr events for the requested kinds.
["EVENT", "sub1", { "kind": 0, "pubkey": "...", "content": "{"name":"Alice",...}", ... }]All matching events have been sent.
["EOSE", "sub1"]
Close an active subscription.
["CLOSE", "sub1"]