L logiover
developer-tools · May 26, 2026 · 5 min read

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:

  1. The asset naming is a minefield. Kraken uses legacy X/Z prefixes and its own ticker for Bitcoin (XBT, not BTC). Pairs come back as things like XXBTZUSD. If you’re joining Kraken data against another exchange’s BTC/USD, you need a normalization layer or your join silently drops rows. The scraper normalizes XBT ↔ BTC and splits pairs into clean base/quote fields.

  2. 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_code and pair_name. The code is the stable Kraken identifier; the human name is what your dashboard shows. The normalized base/quote are what you join on.
  • Store vwap_24h alongside last_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 XBT rows won’t join to your other sources’ BTC rows, 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_at age, 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