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
| param | accepted values |
|---|---|
| grain | day | week | month - default month (omit to get the default) |
| from | optional inclusive ISO UTC calendar day (YYYY-MM-DD); omit for the series start |
| to | optional inclusive ISO UTC calendar day (YYYY-MM-DD); omit for today UTC (that day still in progress) |
| format | csv | 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
| name | type | description |
|---|---|---|
| period_start | date | UTC start of the bucket |
| unique_users | integer | Distinct 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.