How-to · 3 steps
How to read onchain
data with Monid.
Give this to your agent
$set up https://monid.ai/SKILL.md, then tell me what this address holds and show the cost of each step
and let it take it from there.
#JobWhat came backCost
1The whole wallet1,011 balances, 26 chains$0.012 ✓
2And the catch530 KB, ~132,700 tokens$0.00 ✓
3The dearer twinno amounts, but fields of its own$0.0238 ✓
4Net worth288 samples, not a number$0.012 ✓
5Itself, against itselfa series 86 minutes behind$0.00 ✓
6Who holds ittop holder at 8.29%$0.012 ✓
7Filtered transfersan empty array, billed$0.012 ✓
8The SQL callzeros where millions are$0.024 ✓
9The control4,746,481 rows, same tables$0.024 ✓
10Total28 runs, four failed free$0.3475 ✓
one wallet · a thousand positions for a centagent running$0.3475
Real run, 2026-09-25. A public exchange address.
Step 1
Set up Monid.
One line. It installs the CLI and asks for an API key from app.monid.ai. New accounts start with $1.00.
Say this to your agent
>set up https://monid.ai/SKILL.md
Step 2
Pick what you need. Say it in one sentence.
Click a job. Paste the sentence, fill in the brackets.
Everything one address holds
Say this to your agent
>get the wallet detail for <address> with surf on monid and give me the total, the chain split and the top ten positions by usd value. if you pass a chain, use it only to filter the positions: the usd total stays at the ALL-CHAIN figure and does not follow the filter. do not paste the whole response back to me: it runs to hundreds of kilobytes
What the agent runsdone
surf /wallet/detail$0.012
api.strale.io /x402/wallet-balance-lookup$0.0238
surf /wallet/net-worth$0.012
x402.quicknode.com /base-mainnet$1.10
What came backone exchange wallet · 2026-09-25
Where the value actually sitsUS dollars, of 26 reported chains
what one cent buysa thousand token balances each with a USD value, the NFTs, every active chain, the total and an exchange label at confidence 1; the counts differ per wallet, so read them rather than expecting ours
the chain filter does not filter the moneyasking for one chain filters the tokens and the NFTs correctly while the usd total stays at the all-chain figure. On a second wallet that made the chain-scoped answer 11.3x too high, which is the most expensive mistake available on this endpoint
and the NFT list is silently capped at 200no more-results flag, no total and no paging, and a chain-filtered call returned exactly 200 again sharing only 31 with the unfiltered 200. This page's original wallet only escaped it by holding fewer than the cap
the catch530,801 bytes, roughly 132,700 tokens; the call is cheap and the answer does not fit in a context window, so summarise it in code before it reaches a model
26 chains, one that matters99.999% of the value sits on the first one; active on 26 chains is true and nearly meaningless
the dearer twin is not a strict subsetit costs about 2x and returns no token amounts, so it loses on price and on holdings. But it carries transfer recency, a provenance block and a settlement id that the cheaper one has nowhere, so a reader told it is a strict subset deletes fields they cannot get elsewhere
$0.0121,011 positions, one call
When one provider disagrees with itself
Say this to your agent
>get both the wallet detail and the net worth for <address> with surf on monid and tell me the gap AND the age. take the last element of the net worth series yourself: it returns samples over a day rather than a single figure, and its last sample can be over an hour old, so check its timestamp before you treat the two as the same moment
What the agent runsdone
surf /wallet/net-worth$0.012
surf /wallet/detail$0.012
surf /wallet/history$0.012
What came backone exchange wallet · 2026-09-25
the gap is not rounding0.043% on the first wallet and 10.55% on a second, from the same provider on the same day. The size is not the point; the cause is
the series is frozen, not merely sampledtwo calls seven minutes apart returned a byte-identical response with the same last timestamp, which sat 86 minutes behind real time. So the gap is the age of the series, and it grows until the feed moves
which is rightnothing in either payload marks one as authoritative, so pick one endpoint, say which, and read the timestamp before you compare
it is not a numberthe net-worth call returns 288 samples at five-minute intervals spanning 23.9 hours; the field name does not warn you
what that is good forthe series is the better answer when the question is whether a balance moved, and the worse one when the question is what it is now
$0.024two views, one wallet
Who holds the token
Say this to your agent
>get the holders of <token> with surf on monid and give me the top ten with their share. it returns twenty by default, so set the limit explicitly, and page with an offset: there is no page parameter and asking for one is refused before the call runs
What the agent runsdone
surf /token/holders$0.012
surf /token/transfer-counterparties$0.012
surf /search/token$0.006
What came backone exchange wallet · 2026-09-25
Concentration in one tokenshare of supply
the shapethe largest single holder is at 8.286% and the top ten together are at 27.57%, so the head is real but not a majority
the pagingtwenty rows by default rather than a hundred, paged by offset rather than by a page number, and on a second token two hundred rows across two pages shared no addresses at all
what looked like an overlapthe last row of one page and the first of the next carried bit-identical percentages on different addresses, which is a tie rather than a repeat. De-duplicate anyway, because it costs nothing, but do not expect the pages to overlap
the other side of ita counterparty call returns the ten addresses this wallet moves most with; the top one is 162,480 transfers and $635,888,587.86
what 1,000 rows costsat the default of twenty a row count like that is fifty calls, so set the limit before you budget
$0.012twenty a page by default
Read the window before the number
Say this to your agent
>get the transfer stats for <token> with surf on monid, passing the time range explicitly rather than taking the default of seven days. then DO NOT quote the dollar figure as it stands: it is summed over only the enriched rows while the transfer count beside it covers all of them, so divide it by the enriched ratio or do not quote it at all
What the agent runsdone
surf /token/transfer-stats$0.012
surf /token/holders$0.012
surf /wallet/history$0.012
What came backone exchange wallet · 2026-09-25
What a field called total coversdays in the window
the numbers4,743,032 transfers, 632,382 unique senders, 824,651 unique receivers and $98,182,414,730.88 moved
over whatabout eight days, because the time range is a documented parameter that defaults to seven. An earlier version of this page called the window discoverable only by subtracting the timestamps; it is in the schema, and you can simply ask for thirty days instead
the dollar figure has a different denominatorit is summed over only the ENRICHED rows while the transfer count printed beside it covers all of them. On a second token the enriched ratio was 0.107, and the dollar total implied a unit price of $1.28 against a real $15.11: an 11.8x understatement
so the instruction is not softreporting the ratio alongside it is not enough. Divide the dollar figure by the enriched ratio, or do not quote it
and one field is a stringthe raw amount comes back as a 27-digit string, so it needs a big-number parse rather than a cast
$0.012big numbers, small window
Query the chain, and check the zero
Say this to your agent
>before you reach for the sql endpoint, check whether a dedicated endpoint answers the same question: on our second run the transfer-stats call returned exactly what the sql query did, for half the price. if you do use sql and it returns a zero, run an unfiltered count on the same tables before you report the zero: that costs the same again and is the only thing that separates no rows from no result
What the agent runsdone
surf /onchain/sql$0.024
surf /onchain/schema$0.024
surf /onchain/tx$0.012
What came backone exchange wallet · 2026-09-25
The same tables, two queriesrows found
it does not always happenon a second run the same shape of filtered query returned real data, so the false zero is a hazard to control for rather than a behaviour to expect
what happened the first timea query for one token's flow in and out of the address returned two rows of zero, status 200, billed $0.024
what was therea control on the same tables, billed $0.024 again, found 4,746,481 rows for the token and half a million inbound on the address
why this is the worst kinda zero looks like an answer. An error would have cost nothing and told you something; this cost full price and told you something false
so always control itan unfiltered count on the same tables costs the same again and it is the only thing that separates no rows from no result
and check you need sql at allthe sql route is twice the price of the dedicated transfer-stats endpoint and on a second run reproduced it exactly, so the cheaper call is the first thing to try
$0.048the query and its control
Names, labels and what you already paid for
Say this to your agent
>resolve <name> to an address with strale on monid. take the exchange label from the wallet detail response you already have rather than calling the labels endpoint: it returns the same object
What the agent runsdone
api.strale.io /x402/v2/ens-resolve$0.0238
surf /wallet/labels/batch$0.012
surf /search/wallet$0.024
surf /wallet/detail$0.012
What came backone exchange wallet · 2026-09-25
it worksa name resolved to its address in 36 ms with a provenance block naming the source and the fetch time
what it costs$0.0238 for one name, which is twice the price of reading an entire 1,011-position wallet; batch your names or budget for it
the duplicatethe labels endpoint returns exactly the label object already inside the wallet call, at $0.012 for a field you have
the ones that failed freean entity search 502'd twice and billed $0.0000, and a wrong field NAME is refused before a run exists
but a wrong field VALUE is not freea well-formed address that holds nothing came back as an empty array with a 200 and billed $0.012, so the shape of the input decides whether a mistake costs you
$0.0238one name, one lookup
Step 3
Take the cheapest route with Monid.
One cent reads the whole wallet. The work is deciding what the response actually covers before you quote a number out of it.
Read the wallet · $0.012
Wallet detail$0.0121,011 positions
Label it$0.00already in the response
Only if that was not enough
Token holders$0.012
Resolve a name$0.0238
SQL, with a control$0.048
A raw node$1.1
Check the window
What does total cover$0.00
Control the zero$0.024only if a query said none
Back to you
rowread bycost
1Token holders$0.024
2empty wallet$0.012
3Token holders$0.024
4Resolve a name$0.0478
5SQL, with a control$0.0958
5 of 5 rows$0.2036
Say this to your agent
>tell me what these addresses hold, cheapest source first, and summarise each one in code rather than pasting it back: <paste addresses>
“summarise before you read”one $0.012 response was 530 KB, about 132,700 tokens
“control every zero”a query returned no rows on tables a control found 4,746,481 rows in
“pass the time range”it defaults to seven days, so a field called total covers a week unless you say otherwise
“read the timestamp first”the net-worth series was frozen 86 minutes behind and byte-identical across two calls seven minutes apart
“never quote that dollar total raw”it is summed over the enriched rows while the count beside it covers all of them, understating by 11.8x on one token
“a chain filter is not a chain total”filtering by chain filtered the positions and left the usd total at the all-chain figure, 11.3x too high
One key. 1,700+ tools.
Ninety-six endpoints spanning $0.0022 to $5.50, a 2,501x range inside one aisle.
A wallet, everything in itsurf · $0.012 / call
Who holds a tokensurf · $0.012 / call
Query the chain with SQLsurf · $0.024 / call
Label an addresssurf · $0.012 / call
Sixty-eight ways inblockrun · $0.0022 to $5.50
A name to an addressstrale · $0.0238 / call
A raw node, per callquicknode · $1.10 / call
+ 1,700 more across 55 providers
Browse the catalog →Read more
View all →
LLM gateway or MCP gateway
Once the agent can read a chain, the question is what else it is allowed to call.

Extract page content for RAG
A half-megabyte response has the same problem a web page does: it has to be cut down first.

When the site will not let you in
For the explorer page an endpoint does not cover, a browser is the fallback.


