I keep a boring habit. Before I let any of my agents act on a market read, I pull raw positioning data from my own data service and check whether the different measures actually agree with each other.
Most days they roughly do. Today, September 4, they did not, and the disagreement was the interesting part.
Here is what I pulled and what I think it means.
large caps are pinned, small caps are not
The first thing I looked at was dealer gamma exposure across the three index proxies I track. Snapshot generated at 2026-09-03T22:23Z, computed from live option chains using strike, open interest and implied volatility.
SPY, spot 773.17, net gamma exposure of about +$4.54 billion per 1% move, from 3,451 contracts counted. Positive gamma. Market makers hedge against the direction of price there, so movement gets absorbed rather than amplified. Call wall at 775, put wall at 760, put to call open interest ratio 2.899.
QQQ, spot 717.67, +$799 million per 1%, also positive gamma. Call wall 720, put wall 700, put to call ratio 1.528.
IWM, spot 295.19, negative $2.99 billion per 1%. Negative gamma. Hedging flows there move with price instead of against it, which tends to stretch moves rather than damp them. Call wall 300, put wall 295, put to call ratio 2.708.
So two of three are in a regime that suppresses movement and one is in the regime that feeds it.
The part that made me sit up was the flip levels. SPY's nearest gamma flip sits at 770.23, which is 0.38% below spot. QQQ's is 716.17, only 0.21% below spot. IWM's is 299.21, 1.36% above spot.
Translated: the large cap calm is standing on a very thin floor, and small caps would have to rally over 1% just to get back into the calm regime.
bitcoin positioning contradicts itself
Then I pulled the crypto side, live at 2026-09-04T02:05Z.
The long short account split on BTCUSDT came back as 43.56% of accounts long against 56.44% short, a long short ratio of 0.7718. By head count, the crowd is leaning short. Open interest sat at 113,203 BTC.
But my cross source synthesis layer, run at 2026-09-03T22:33Z, reported that 79.3% of perpetual markets had positive funding, which it classifies as long leaning with confidence 0.82.
Those two do not describe the same market. More accounts short, most funding paid by longs. The usual reconciliation is size: a smaller number of larger long positions can pay funding across the board while the account count still tilts the other way.
Price context matters here too. BTC was quoted at $80,997, up 5.51% over 24 hours, with 757,263 transactions in the last day, 166 blocks, only 4,201 transactions sitting in the mempool, and network hashrate at 911.29 EH/s.
A 5.5% daily rally into a majority short account base is exactly the setup where I stop trusting a single sentiment number.
metals are the loudest thing on the board
Gold futures printed 4340.70, up 2.30% on the day, with 4 period momentum of +7.34% and a 30 period z score of 4.18, sitting at the 100th percentile of its own 30 period range. Twenty period volatility was 1.56%.
Silver printed 63.332, up 3.03%, with 4 period momentum of +9.37% and a 30 period z score of 2.80, also 100th percentile.
Both metals at the top of their range while equity dealers sit in vol suppressing positive gamma is not a comfortable combination. One of those two readings is wrong about what comes next.
pulling it yourself
Every number above came from endpoints you can hit right now. One detail first: a bare request returns HTTP 402 with a payment-required header, because these are metered. You get around that for free by sending an identifier header, which draws from a monthly free credit allowance instead of a payment.
Dealer gamma, the exact command that produced the numbers in this post:
curl -s -H 'X-Anonymous-Id: your-own-id' \
https://agentdatum.com/api/v1/d/sig-options-gex \
| python3 -c "import sys,json;d=json.load(sys.stdin)['raw'];\
[print(s['symbol'],s['spot'],s['regime'],s['nearest_gamma_flip'],s['put_call_oi_ratio']) for s in d['symbols']]"
Which prints:
SPY 773.17 positive-gamma 770.23 2.899
QQQ 717.67 positive-gamma 716.17 1.528
IWM 295.19 negative-gamma 299.21 2.708
Crypto positioning, same pattern:
curl -s -H 'X-Anonymous-Id: your-own-id' \
https://agentdatum.com/api/v1/d/crypto-longshort \
| python3 -c "import sys,json;r=json.load(sys.stdin)['raw'];\
print(r['symbol'],r['long_account'],r['short_account'],r['long_short_ratio'])"
Both responses carry a collected_at timestamp and a source field, which matters more than it sounds. I want to know whether I am reading a live pull or a cached snapshot before I let an agent act on it. The gamma response came back stamped 2026-09-03T22:23:10Z with source: datum-signals, the positioning response came back source: live at 02:09Z.
Numbers on the paid path, since hiding pricing annoys me when other people do it: the free anonymous allowance is 100 credits a month at 1 credit per $0.001, and it is rate limited to one call every 5 seconds. I hit that limit while writing this and had to wait. Sending a read only wallet address instead of an anonymous id raises the allowance to 5,000 a month and drops the rate limit. Past that, the gamma endpoint is priced at 50,000 USDC units on Base, which is $0.05 per call, settled over x402.
the honest part
A few things I would not want anyone to gloss over.
The gamma numbers are model output, not observed dealer books. They come from Black Scholes gamma applied to strike, open interest and implied volatility, with the assumption that calls sit positive and puts negative on the dealer side. That assumption breaks when a lot of the call open interest is actually overwriting by funds. So treat the regime label as a lean, not a fact.
The timestamps are not aligned. Gamma and metals are 22:2xZ snapshots from the prior session close, while the bitcoin numbers are live at 02:05Z. Mixing a stale equity snapshot with a live crypto pull is fine for a directional read and wrong for anything tighter than that.
The long short ratio comes from one exchange, not the whole market. It is a reasonable proxy and it is not a census.
One number I deliberately did not build a story on: my synthesis layer reported DeFi real yield at 37.56%, from a median nominal APY of 37.68% across 200 pools minus US CPI. That median is heavily distorted by tiny incentive pools, so the figure is technically correct and practically useless as a yield expectation. I keep it in the response because the derivation is transparent, not because I would trade it.
Also worth saying plainly: crypto fear and greed printed 65, labeled greed, against a 30 day average of 49.8 and a 90 day range of 8 to 74. So sentiment is warm but nowhere near its own extreme. That is a third reading that agrees with neither the short account tilt nor the long funding tilt.
Three measures, three answers. That is a real state of the market, not a data problem.
why I built this instead of buying a terminal
I run automated strategies and I got tired of paying for dashboards that show me a chart when what I need is a value my code can read. So I ended up building the collector layer myself, and it now serves 298 machine readable resources over plain HTTP, with an x402 payment path for the metered ones.
The trade off is real. Coverage across crypto, metals, equity options, macro and government data is wide, and depth on any single market is thinner than a specialist vendor. If you need full tick depth on one exchange, buy from that specialist. If you need forty different signals your agent can read in one loop without forty separate contracts, that is the gap I was trying to close.
Machine readable index of what is available, including endpoint URLs and pricing:
https://agentdatum.com/.well-known/ai-catalog.json
If you pull these endpoints and get a read different from mine, I would rather hear it than not.
Written with AI assistance. All figures were pulled from live endpoints at the timestamps stated above and were not generated by a model.
Top comments (0)