Metrics / nutzaps / active_users

active_users

Counts DISTINCT sender pubkeys with at least one kind-9321 (nutzaps) event in each UTC bucket at the requested grain - daily (DAU), ISO-week (WAU) or calendar-month (MAU) - active users, not event volume.

unit

users

grain

day | week | month (UTC)

series

sparse, full history

key

nutzaps.active_users@month

price

21 sats per call - paid in Cashu ecash

Served by nostrology_query_nutzaps, which takes the payment as a single-use token in its cashu_token argument. Calling it without one costs nothing and returns the terms - price, accepted mints, and a NUT-18 payment request - so an agent can discover the price by asking.

Parameters

paramaccepted values
grainday | week | month - default month (omit to get the default)
fromoptional inclusive ISO UTC calendar day (YYYY-MM-DD); omit for the series start
tooptional inclusive ISO UTC calendar day (YYYY-MM-DD); omit for today UTC (that day still in progress)
formatcsv | markdown

Columns per grain: day: period_start, unique_users - month: period_start, unique_users - week: period_start, unique_users.

Query it

MCP tool call against https://dev.nostrolo.gy/mcp (connect your agent):

{
  "name": "nostrology_query_nutzaps",
  "arguments": {
    "metric": "active_users",
    "domain": "nutzaps",
    "grain": "month",
    "cashu_token": "cashuB<one 21-sat token>"
  }
}

Windowed (inclusive UTC days; both optional):

{
  "name": "nostrology_query_nutzaps",
  "arguments": {
    "metric": "active_users",
    "domain": "nutzaps",
    "grain": "month",
    "from": "2026-07-01",
    "to": "2026-07-31",
    "cashu_token": "cashuB<one 21-sat token>"
  }
}

Response: a plain-text envelope (window, freshness, column contract, this page's caveats) followed by the data table (csv, or format: "markdown") at the grain you request. A paid response adds one line naming the receipt - the sha256 of the token that bought it. The same token cannot buy a second response.

Response columns

nametypedescription
period_startdateUTC start of the bucket
unique_usersintegerDistinct pubkeys sending a nutzap in that bucket

What is counted

The population is the kind-9321 (nutzaps) events in this archive that carry at least one Cashu proof in a `proof` tag, a resolvable mint (`u` tag) and a sender that is not blocklisted (NIP-61 nutzaps: zap payments whose value moves as Cashu ecash inside the event, settled mint-side rather than over Lightning). Events without such a proof - the 2024 draft format with proofs in content, encrypted payloads, bare cashu tokens, events carrying no ecash - are not payments and are not counted, and neither are events missing a usable mint tag. Test and private mints are excluded too: mints on hosts a recipient elsewhere cannot reach (loopback, private-network and other non-public addresses and names) and public test mints reviewed as running a fake Lightning backend or no longer running. Any other mint counts, reviewed or not.

Caveats

  • Buckets are keyed by their UTC START; a from/to window includes exactly the buckets STARTING inside it - a bucket that began before 'from' is excluded whole even if it overlaps the window, and a bucket starting before 'to' is included whole even if it extends past it.
  • created_at is sender-declared and unverified, as everywhere in Nostr; a spoofed timestamp lands the sender in the wrong bucket.
  • The final bucket is still accumulating until the period ends.
  • The series ends at as_of, and the most recent day or two may be absent rather than empty - a bucket appears once its events are in the archive.
  • Series is sparse: buckets with zero active users are omitted.

Freshness in every response is data-derived: latest kind-9321 (nutzaps) event time.