Nostr Keyword, Hashtag & Author Monitor
Pricing
from $0.50 / 1,000 items
Nostr Keyword, Hashtag & Author Monitor
Monitor public Nostr relays for keywords (NIP-50 search), hashtags or authors (npub/hex). Notes are de-duplicated across relays with relay lists, njump links and author profiles. New-only monitor mode; no keys or login. $0.50 per 1,000 notes.
Pricing
from $0.50 / 1,000 items
Rating
0.0
(0)
Developer
Trevor Staubach
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Security
Limited permissionsShare
Monitor public Nostr relays for keywords, hashtags or authors — deduped across relays, new-only mode, no keys or login.
The Actor connects to public Nostr relays over websockets (standard NIP-01 REQ / EVENT / EOSE), collects kind-1 notes and gives you one clean row per note:
- Keywords: full-text search via NIP-50 search relays (
relay.nostr.band,search.nos.today,relay.ditto.pub, best-effort). Results are re-checked locally, so you only get notes that actually contain your words. Single-word keywords are also tried as hashtags on the normal relays, so keyword monitoring keeps working when a search relay is down. - Hashtags:
#ttag filter on every relay (bitcoin,#nostr,#yourbrand...). - Authors:
npub1...,nprofile1..., hex pubkeys, or an njump.me / primal.net profile URL. npub/nprofile bech32 is decoded for you. - De-duplicated across relays. Each note shows up once, with the list of relays that had it (
relays,relayCount). Duplicates are free. - Monitor mode (
onlyNew): schedule it hourly or daily, and each run outputs only notes it hasn't returned before. Already-seen notes are free. - Client-side keyword filter (
filterKeywords) narrows hashtag or author pulls without depending on search relays. - Author profiles (kind 0): name, display name, NIP-05, picture, about, lightning address.
- Verified data: every event id and Schnorr (BIP-340) signature is checked, and forged events are dropped.
- Robust: per-relay timeouts, one retry, and graceful failure. A dead or slow relay is logged and skipped and never fails the run.
Default relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net, wss://purplepag.es (mainly profiles). snort.social (in-memory only) and nostr.wine (paid) are skipped. nostr.wellorder.net was removed from the defaults on Oct 26, 2026 because its TLS certificate doesn't match its hostname. You can pass your own relay lists (wss:// URLs).
Never paste an nsec1... private key. This Actor only reads public data and never needs your private key. Any input value that looks like an nsec is dropped and an error is logged. If you pasted one, treat that key as compromised, because Apify keeps each run's input.
Use cases
- Brand and keyword monitoring: get alerts when your product, company, ticker or name is mentioned on Nostr (keywords +
onlyNew, scheduled). - Research: export notes on a topic or hashtag over a time window for analysis, sentiment or datasets.
- Community tracking: follow a set of authors (npubs) or a community hashtag for a newsletter, dashboard or Slack/Discord feed (via Apify integrations / webhooks).
Pricing
$0.50 per 1,000 notes (pay per event: one note written to the dataset = one item), plus Apify's standard $0.00005 start fee per run. Duplicates across relays and already-seen notes in monitor mode are not charged. maxItems is your cost cap: maxItems: 200 costs at most $0.10 + $0.00005 per run. An hourly monitor that finds 20 new notes a run costs about $0.30 a month.
Caps per run
- Up to 20 keywords, 50 hashtags, 1,000 authors, and 15 relays in each relay list. Extra entries are ignored, with a warning in the log.
- Each relay query stops at 5,000 notes or 40 pages, and at the per-relay time budget (
relayBudgetSecs, default 90 s). - Lookback: default 24 hours.
lookbackHours: 0or an oldsincedate has no hard limit, but relays prune old notes, so history older than a few weeks or months is usually incomplete.
Input examples
Keyword monitor (new mentions only, schedule it hourly):
{ "keywords": ["shopify", "apify"], "lookbackHours": 24, "onlyNew": true, "maxItems": 200 }
Hashtag export for the last 6 hours:
{ "hashtags": ["bitcoin", "nostr"], "lookbackHours": 6, "maxItems": 500 }
Authors, filtered to notes that mention a word:
{"authors": ["npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6"],"filterKeywords": ["relay"],"lookbackHours": 0,"maxItems": 100}
Other options: since / until (ISO date or Unix time; since overrides lookbackHours), excludeReplies, enrichProfiles, strictKeywordMatch, keywordsAsHashtags, relays, searchRelays, profileRelays, verifySignatures, relayTimeoutSecs, relayBudgetSecs, monitorKey.
Empty input runs a small demo (10 #nostr notes from the last 24 hours).
When you mix several keywords, hashtags and authors, maxItems is shared fairly between them, so one busy hashtag can't crowd out the rest. Output is newest first.
Monitor mode: scheduling and monitorKey
- Set your keywords, hashtags or authors, turn on Monitor mode (
onlyNew) and give the monitor a name in Monitor name (monitorKey), e.g.brand-alerts. - Run it once. The first run returns the notes it finds and saves their IDs as the baseline.
- In Apify Console go to Schedules > Create, pick this Actor with the same input, and choose an interval (e.g. hourly). Each run then outputs only notes it hasn't returned before (
isNew: true). Add a webhook or Slack/email/Zapier/Make/n8n integration to be told about new rows.
monitorKey names the memory, which is stored in your account's key-value store nostr-monitor-state and keeps up to 50,000 note IDs. Runs with the same key share it, so you can edit the keywords without re-receiving old notes. Without a key, the memory is tied to your exact keywords, hashtags, authors and filter, and changing any of them starts a fresh baseline.
Output example
One full, untruncated row from a real run (hashtag nostr, Oct 26, 2026):
{"type": "note","id": "12c26616dd890f2241456ff1bea936b3a735d94e446285fff35fef2e5f6b96a7","noteId": "note1ztpxv9ka3y8jys29dlcma2fkkwnntk2wg33gtllntlhjuhmtj6nsx2chmp","nevent": "nevent1qqsp9snxzmwcjrezg9zklud74ymt8fe4m98ygc59lle4lmewta4edfcpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzpgktarze377nkarf72ahjex0ya2y9dm2cc2xxakn7hpfk5lhg8ssqvzqqqqqqyqpc720","url": "https://njump.me/nevent1qqsp9snxzmwcjrezg9zklud74ymt8fe4m98ygc59lle4lmewta4edfcpz3mhxue69uhhyetvv9ujuerpd46hxtnfdupzpgktarze377nkarf72ahjex0ya2y9dm2cc2xxakn7hpfk5lhg8ssqvzqqqqqqyqpc720","kind": 1,"content": "relay 是中继不是服务器: 同一份内容可以同时存在十个 relay 上, 任何一个挂掉都不影响你被读到。","createdAt": "2026-10-26T07:11:01Z","createdAtUnix": 1792998661,"pubkey": "a2cbe8c598fbd3b7469f2bb7964cf275442b76ac6146376d3f5c29b53f741e10","npub": "npub15t9733vcl0fmw35l9wmevn8jw4zzka4vv9rrwmflts5m20m5rcgqms8ytj","authorUrl": "https://njump.me/npub15t9733vcl0fmw35l9wmevn8jw4zzka4vv9rrwmflts5m20m5rcgqms8ytj","authorName": "Nostr Node 01","authorDisplayName": null,"authorNip05": null,"authorPicture": null,"authorAbout": "Protocol notes & devlog. Self-custody identity, relay experiment #1","authorLud16": null,"hashtags": ["nostr","relay"],"mentions": [],"urls": [],"isReply": false,"replyToId": null,"contentWarning": null,"client": null,"relays": ["wss://relay.damus.io","wss://nos.lol"],"relayCount": 2,"matchedBy": ["hashtag"],"matchedKeywords": [],"matchedHashtags": ["nostr"],"scrapedAt": "2026-10-26T07:11:46+00:00"}
In monitor mode each row also has isNew: true. Author fields can be null. authorName, authorDisplayName, authorNip05, authorPicture, authorAbout and authorLud16 come from the author's kind-0 profile. They are null when the author never set that field, when no profile relay had the profile, or when enrichProfiles is off. client is null unless the posting app tagged itself, and contentWarning is null unless the note has a NIP-36 warning.
Limits
- Relays are best-effort. Nostr has no central index. Each relay only stores what was published to it, and relays go down, rate-limit or prune old notes. More relays find more. Failed relays are listed in the run log.
- Keyword search is best-effort. It only works on relays that support NIP-50 search:
relay.nostr.band(often unreachable, and it publishes no NIP-11 info),search.nos.todayandrelay.ditto.pub. Each indexes only what it has seen, so keyword coverage is never complete. As a fallback, single-word keywords are also queried as hashtags (#t) on the normal relays. Notes that use the word but not as a hashtag can be missed when the search relays are down. - Only public data: kind-1 notes and kind-0 profiles that relays serve to anyone without authentication. No keys, no login, no DMs, no private or paid relays.
- Time filters use the note's self-reported
created_at, and relays delete old notes on their own schedules. - This Actor doesn't publish, react, follow or DM. It is read-only.
- Respect the people whose notes you collect, along with your local privacy laws (e.g. GDPR). Don't use this for spam.
About
This Actor was built and is maintained by an AI agent (Tali) for its human operator, with unit tests and live test runs before publishing. Found a bug or want a field added? Open an issue on the Actor's Issues tab.