How to Scrape Kraken Market Data in 2026
A guide to bulk-exporting live ticker data for every Kraken trading pair — price, 24h change, high/low, volume, VWAP, trade count and bid/ask — on a schedule for a fresh feed.
Kraken is one of the most-used regulated crypto exchanges, which makes its USD and multi-fiat reference prices valuable for anyone who needs defensible pricing — quant desks, treasury functions, tax reporting, family offices. The good news: Kraken publishes a clean public REST API. The catch: turning it into a tidy, typed, export-ready snapshot of every pair is more annoying than it looks, because Kraken returns nested string-arrays with cryptic asset codes (XXBTZUSD, anyone?). This guide covers what to extract, how the API behaves, and how to run a continuously fresh price feed.
What’s worth extracting
Kraken’s public ticker endpoint exposes a rich per-pair snapshot. After parsing and normalization you get:
- Identity — the Kraken pair code plus a human-readable pair name, and the split into base and quote assets.
- Price — last traded price and the 24h open price.
- Change — computed 24h percent change (Kraken gives you open and last; the percentage is derived).
- Range — 24h high and 24h low.
- Volume — 24h traded volume.
- VWAP — 24h volume-weighted average price, the number that matters for sizing and execution analysis.
- Activity — 24h trade count, a liquidity/interest signal raw volume alone misses.
- Order book top — best bid and best ask.
- Timing — a scrape timestamp.
The actor enumerates asset pairs and fetches all tickers in just two requests, then does the unglamorous work: parsing Kraken’s nested string-arrays into numeric fields, normalizing the asset names, computing the percent change and VWAP, and optionally ranking/capping by a chosen metric.
The API reality: it works, but it’s awkward
Kraken’s REST API is public, reliable, and doesn’t require auth for market data. So why not just curl it? Two reasons:
-
The asset naming is a minefield. Kraken uses legacy
X/Zprefixes and its own ticker for Bitcoin (XBT, notBTC). Pairs come back as things likeXXBTZUSD. If you’re joining Kraken data against another exchange’sBTC/USD, you need a normalization layer or your join silently drops rows. The scraper normalizesXBT ↔ BTCand splits pairs into clean base/quote fields. -
The payload shape is hostile to analytics. The ticker response packs each field into a string-array (
["price", "wholeLotVolume", "lotVolume"]style structures). Every number is a string. Computing 24h change requires pulling open and last out of two different sub-fields. It’s all doable — it’s just fiddly boilerplate you’d rather not re-derive.
Rate limits and freshness
Market data calls are subject to Kraken’s public rate limits, but because a full snapshot is only two requests, you stay well within them even on a tight schedule. That’s the key to a fresh feed: you can schedule a run every minute or every few minutes and never approach the rate ceiling, because each run is two calls, not one-per-pair.
For freshness, the trade-off is simple — the more often you snapshot, the more storage and runs you consume, but the closer your feed tracks the live market. For reference pricing (treasury, tax) a daily or hourly snapshot is plenty; for candle reconstruction or arbitrage you’ll want minute-level.
▶ Run the Kraken Market Scraper — every spot pair in two API calls, parsed into typed numeric fields with computed 24h change and VWAP, XBT↔BTC normalized. Schedule it for a continuously fresh price feed.
Schema design for downstream use
A clean per-pair row:
{
"pair_code": "XXBTZUSD",
"pair_name": "BTC/USD",
"base": "BTC",
"quote": "USD",
"last_price": 71250.4,
"open_price": 70180.0,
"change_24h_pct": 1.52,
"high_24h": 71890.0,
"low_24h": 69740.0,
"volume_24h": 1834.21,
"vwap_24h": 70910.7,
"trade_count_24h": 48217,
"best_bid": 71248.9,
"best_ask": 71251.0,
"scraped_at": "2026-05-26T12:00:00Z"
}
Schema choices worth making early:
- Keep both
pair_codeandpair_name. The code is the stable Kraken identifier; the human name is what your dashboard shows. The normalizedbase/quoteare what you join on. - Store
vwap_24halongsidelast_price. Last price is noisy tick-to-tick; VWAP is the number you reference for sizing and for “what did this actually trade at today.” - Persist
trade_count_24h. A pair with high volume but few trades is a different liquidity profile than one with many small trades — keep the count, not just volume. - Always store
scraped_at. A price snapshot with no timestamp is worthless for cost-basis or backtesting. This is the single most important field for archival use.
Typical use cases
- US-regulated quant reference pricing — desks and family offices that need USD pairs from a regulated venue, not an offshore exchange.
- Multi-fiat arbitrage — Kraken quotes USD, EUR, GBP, JPY, AUD and CAD markets; compare the same asset across fiat to spot dislocations.
- Cross-exchange arbitrage — feed Kraken into an arbitrage matrix alongside other exchange scrapers; the pair normalization is what makes the join work.
- Backtesting & archival — schedule frequent snapshots and reconstruct candles, or keep a timestamped historical archive.
- Tax & accounting — timestamped Kraken price snapshots for cost-basis and end-of-period valuation.
- Treasury / balance-sheet — corporates holding crypto pricing it off a regulated reference.
- Market research — volume distribution, new-listing detection, exchange benchmarking.
- OTC / liquidity-provider sizing — VWAP plus 24h trade count to size blocks without moving the market.
Cost math
Pay-per-event with a tiny run-start fee and free results, and the work is just two API calls plus parsing — essentially no proxy, no browser. A full snapshot of every pair runs in a couple of seconds.
The cost scales with frequency, not pair count. A daily reference snapshot is a handful of cents per month. A minute-level feed for backtesting is more runs but each is trivially cheap — you’re still far under what a hosted market-data API subscription costs, and you own the raw rows. Compare to a commercial crypto data feed at tens to hundreds of dollars a month for the same coverage.
Common pitfalls
- The XBT/BTC trap. If you don’t normalize, your Kraken
XBTrows won’t join to your other sources’BTCrows, and you’ll quietly under-count. Always join on the normalized base/quote. - String numbers. Raw Kraken values are strings. Parse to numbers before any math or your “sum” becomes string concatenation.
- Change must be computed. Kraken doesn’t hand you a 24h percent change; it gives open and last. Derive it (and store it) rather than expecting a ready field.
- VWAP is 24h, not realtime. It’s a rolling 24h figure — don’t mistake it for an instantaneous mid-price.
- Stale-feed illusion. If your schedule fails silently, your dashboard shows yesterday’s price as if it’s live. Alert on
scraped_atage, not just on the values.
Wrapping up
Kraken’s API is public and reliable, but the asset-naming legacy and the string-array payloads make a clean, typed, every-pair snapshot more work than it should be. If you need defensible regulated-exchange pricing — for treasury, tax, quant reference, or arbitrage — a maintained actor that normalizes the names, parses the numbers, computes change and VWAP, and runs in two calls is the shortcut to a fresh, joinable feed.
▶ Open the Kraken Market Scraper on Apify — typed snapshot of every spot pair, scheduled for continuous freshness. Pay-per-event. Start on Apify’s free monthly credit.
Related guides
App Store Data API Alternative: ASO Metadata Beyond iTunes
Apple's iTunes Search and Lookup API is rate-limited and thin. Here's an App Store data API alternative that returns full reviews, rankings, and keyword signals for ASO.
Binance Market Data Without API Keys: Spot Prices and Funding in 2026
How to pull Binance spot prices, order books and funding data without API keys — using the public REST surface, its weight limits and region blocks explained.
CoinGecko API Alternative: Exchange Data Without Rate-Limit Pain
A CoinGecko API alternative for exchange and market data — why the free Demo tier's ~30 calls/min and Pro-gated fields force you to the public pages instead.