Metrics / nutzaps / payment_activity
payment_activity
Nutzap payments and the sats they carried, across all counted mints or one (mint_url) - at grain=day one row per UTC day (the Nutzap Payments and Nutzap Sats charts on nostrolo.gy/nutzaps, and the daily charts of each /nutzaps/mints page with mint_url), at grain=total one row for the whole from/to window.
unit
payments+sats
grain
day | total (UTC)
series
sparse, full history
key
nutzaps.payment_activity@day
Parameters
| param | accepted values |
|---|---|
| grain | day | total - default day (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) |
| mint_url | optional Cashu mint URL as nutzaps.mint_leaderboard lists it (e.g. https://mint.minibits.cash/Bitcoin); narrows rows to that mint. Scheme and host case, a default port and a trailing slash are normalized and a URL with no scheme is read as https, but the PATH is case-sensitive; an excluded (test or private) mint returns no rows |
| format | csv | markdown |
Columns per grain: day: utc_day, payments, sats - total: payments, sats, mints, first_day, last_day.
Query it
MCP tool call against https://nostrolo.gy/mcp (connect your agent):
{
"name": "nostrology_query_metric",
"arguments": {
"metric": "payment_activity",
"domain": "nutzaps",
"grain": "day"
}
} Windowed (inclusive UTC days; both optional):
{
"name": "nostrology_query_metric",
"arguments": {
"metric": "payment_activity",
"domain": "nutzaps",
"grain": "day",
"from": "2026-07-01",
"to": "2026-07-31"
}
} 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.
Response columns
| name | type | description |
|---|---|---|
| utc_day | date | UTC calendar day |
| payments | integer | kind-9321 (nutzaps) payments - per day at grain=day, over the window at grain=total |
| sats | integer | sats those payments carried (sum of their Cashu proofs) - per day at grain=day, over the window at grain=total |
What is counted
The population is the kind-9321 (nutzaps) PAYMENTS in this archive (NIP-61 (nutzaps): zaps whose value moves as Cashu ecash inside the event) - events carrying at least one Cashu proof in a `proof` tag, valued as the sum of those proofs in sats (never the `amount` tag, which was often millisats). Events without such a proof (the 2024 draft format, encrypted payloads, bare cashu tokens, zero-ecash events) are not payments. Test and private mints are excluded: hosts a recipient elsewhere cannot reach (loopback, private-network and other non-public names) and public test mints reviewed as running a fake Lightning backend or no longer running; any other mint counts, reviewed or not. A mint_url filter narrows within this population, so an excluded mint returns no rows. This is exactly the population nostrolo.gy/nutzaps draws.
Caveats
- The page's charts cover the trailing 365 days on a TIMESTAMP cutoff, so their oldest day (or month) is partial; compare from the day after it.
- Values are sats, not millisats: the proof amounts summed as sats. Every keyset behind them that could still be resolved is a sat keyset; some mints no longer serve theirs, so a unit is inferred there, never read.
- The event time (created_at) is sender-declared and unverified, as everywhere in Nostr; days are UTC calendar days of it.
- The series ends at as_of, and the most recent day may be absent rather than empty - a day appears once its events are in the archive; with no 'to', the final day is still accumulating.
- The page's cumulative lines are the running sums of these columns from the window's first day. Series is sparse: days with no payment are omitted.
Freshness in every response is data-derived: latest kind-9321 (nutzaps) event time.