Is anyone actually sending jobs to Nostr DVMs? 6 hours of real NIP-90 data

A real 6-hour NIP-90 demand scan: kind 5300 is fully targeted, kind 5150 had 37 unanswered open requests, zero bid tags. Free core snippet to check yourself.
Is anyone actually sending jobs to Nostr DVMs? 6 hours of real NIP-90 data

Before building a Nostr DVM (NIP-90 Data Vending Machine), it’s worth checking whether anyone would actually send it jobs. We ran a demand scan on 2026-11-09 (02:59 Asia/Seoul) over the previous 6 hours on three public relays (damus, nos.lol, primal). Real output:

 kind    req  users  targeted   bid  answered
 5300    537     62       537     0       339
 5150     37     37         0     0         0
 5100      9      9         9     0         9
 5128      1      1         0     0         0

What this says

  • Kind 5300 has volume, but every request is p-tagged. All 537 requests name one specific DVM. A new DVM won’t receive those jobs; they’re already spoken for.
  • No request carried a bid tag. In this window nobody offered sats up front for any job kind.
  • Kind 5150 is the interesting row. 37 requests from 37 different pubkeys, none targeted, and none got any 6xxx/7000 answer on these relays. That’s open, unanswered demand. It’s small, and one sample isn’t a trend, so re-run it over a few days before building anything.
  • Targeted kinds get answered (5100: 9 of 9). Untargeted ones are where a newcomer could step in.

We learned this the hard way: we ran our own DVM for days and got almost no organic jobs, because nearly all traffic was targeted at existing services.

Check it yourself (core idea, free)

The scan is just two fetches: job requests (kinds 5000-5399) and results/feedback (6000-6399 plus 7000), then matching results to requests by their e tag.

req = await c.fetch_events(ReqTarget.auto([Filter().kinds([Kind(k) for k in range(5000, 5400)]).since(since).limit(5000)]), timedelta(seconds=20))
res = await c.fetch_events(ReqTarget.auto([Filter().kinds([Kind(k) for k in range(6000, 6400)] + [Kind(7000)]).since(since).limit(5000)]), timedelta(seconds=20))
answered = {t.to_vec()[1] for e in res.to_vec() for t in e.tags().to_vec() if t.to_vec()[0] == "e"}
# per request: has a "p" tag -> targeted, has a "bid" tag -> paid offer, id in answered -> answered

That’s enough to build your own version with nostr-sdk 0.45.

If you’d rather not write it

The full script (per-kind table, unique users, CLI hours argument), plus three more small read-only tools (zap/reply/DM counter for any npub, a Lightning address checker, and a Shopstr kind-30402 listing builder with dry run) are in our Nostr Bot Toolkit, 2100 sats, delivered by DM as a ZIP:

https://njump.me/2cdcf99c78201bfdefa6bf0a807c840afaeec3dfe04efd516e98a8b9ba904c73

The listing has a verified preview, the exact how-to-buy steps (delivery is a manual DM check, not instant), and the ZIP’s SHA256.


Written by team botkora with AI assistance. The numbers above are from a real run; your results will differ by time window and relays.


Write a comment