Public API
One endpoint, no API key, no rate-limit signup, CORS open to everyone. The ZCU price is read straight from the wZCU/USDC 0.3% Uniswap V3 pool on Ethereum mainnet — there is no third-party price API in the path.
Live right now
Spot price
Current pool price from slot0(). Cached 20 seconds at the edge. Use this for display: tickers, wallets, dashboards.
GET https://wzcu.zerochill.com/api/public/price{
"ok": true,
"usd": 0.10074192,
"source": "uniswap-v3",
"pool": "0xc70ccfBD7686a840F7274aF4bcd72A63B4Cc3EF6",
"feeBps": 3000,
"liquidity": "316227766016",
"timestamp": "2026-08-28T14:00:00.000Z"
}TWAP (time-weighted average)
Add ?twap= to get the average price over a window, computed from the pool's built-in observation oracle. Because it averages across every block in the window, a single large trade barely moves it — an attacker would have to hold a fake price for the whole window and eat arbitrage the entire time. Use this for anything settlement-critical: collateral, invoicing, payouts.
GET https://wzcu.zerochill.com/api/public/price?twap=30m
GET https://wzcu.zerochill.com/api/public/price?twap=1h
GET https://wzcu.zerochill.com/api/public/price?twap=600s # or a bare number of seconds{
"ok": true,
"usd": 0.10074277,
"windowSeconds": 1800,
"requestedSeconds": 1800,
"truncated": false,
"spotUsd": 0.10074277,
"source": "uniswap-v3",
"pool": "0xc70ccfBD7686a840F7274aF4bcd72A63B4Cc3EF6",
"feeBps": 3000,
"liquidity": "316227766016",
"timestamp": "2026-08-28T14:00:00.000Z"
}Windows run from 60 seconds to 24 hours. If the pool's oracle can't reach back as far as you asked, the endpoint automatically falls back to the longest window it can prove (1h → 30m → 10m → 5m → 1m) and returns truncated: true with the windowSeconds it actually used. Always read windowSeconds, not the one you requested.
Response fields
| ok | bool | False on failure; the body then carries `error` and the status is 503. |
| usd | number | ZCU price in USD. Spot, or the TWAP average when ?twap is set. |
| spotUsd | number | TWAP responses only — the instantaneous price alongside the average, so you can measure divergence. |
| windowSeconds | number | TWAP responses only — the window actually averaged. 0 means the oracle had no usable history and `usd` fell back to spot. |
| requestedSeconds | number | TWAP responses only — the window you asked for. |
| truncated | bool | TWAP responses only — true when windowSeconds is shorter than requestedSeconds. |
| source | string | Always "uniswap-v3". |
| pool | address | The Uniswap V3 pool the quote came from. |
| feeBps | number | Pool fee tier in hundredths of a bip — 3000 = 0.3%. |
| liquidity | string | Raw pool L value. A rough depth signal; not a dollar figure. |
| timestamp | string | ISO-8601 time the quote was computed server-side. |
Examples
# curl
curl -s 'https://wzcu.zerochill.com/api/public/price?twap=30m'
# JavaScript
const r = await fetch('https://wzcu.zerochill.com/api/public/price?twap=30m');
const { ok, usd, windowSeconds } = await r.json();
# Python
import requests
p = requests.get('https://wzcu.zerochill.com/api/public/price', timeout=10).json()['usd']Notes & limits
- No key, no auth, CORS
*. Responses are cached 20 seconds — polling faster than that just hits cache. - A
503with{"ok": false}means the upstream node was unreachable. Retry with backoff; don't treat it as a price of zero. - Pool depth is finite. Treat spot as a market print, not an oracle — for anything that settles money, use the TWAP.
- Reading the chain yourself is always an option: wZCU is 0x61b1F4D5db2436C089593828C26F21e25c4A9C9d, and DexScreener mirrors the same pair at
api.dexscreener.com/latest/dex/pairs/ethereum/0xc70ccfBD7686a840F7274aF4bcd72A63B4Cc3EF6. - Everything about the Zero Chill Units blockchain and the Omni layer 2 lives at texitcoin.org/build.