sifting/io
Developer Tutorials
7 min readSiftingIO Team

How market data API pricing works: a buyer's guide for developers

Market data API pricing explained: per-market tiers, call quotas vs rate limits, WebSocket limits, history depth, overage, free tiers, and redistribution rights.

How market data API pricing works: a buyer's guide for developers

Market data API pricing is rarely one number. How do you compare a vendor that quotes a flat monthly fee against one that quotes per-market tiers with separate limits for REST, WebSocket, and history depth? The monthly bill is set by six or seven dimensions, and the headline price is only one of them. This guide walks through each dimension, uses SiftingIO's own per-market tiers as the worked example, and ends with a checklist for estimating real cost before you sign up.

Per-market pricing vs all-in-one bundles#

The first question is what a "plan" covers. Some providers sell one subscription that includes every asset class. Others sell each market separately. Neither model is cheaper in the abstract. It depends on how many markets your code actually queries.

SiftingIO prices per market. US stocks, forex, crypto, commodities, and DEX data are each a separate subscription, and the same tier ladder (Free, Builder, Pro, Ultra, Enterprise) applies to each one. A team that only needs forex pays for forex. A team that needs three markets at the Pro tier pays for three Pro subscriptions with an automatic bundle discount: two markets save 10%, three save 15%, four save 20%, and all five save 25%.

The trap with all-in-one bundles is paying for coverage you never call. The trap with per-market pricing is forgetting that a "stock dashboard" usually also needs FX rates for currency conversion, which is a second market. Count the markets before you compare prices. The per-market product pages for US stocks, forex, and crypto list what each subscription includes.

Request quotas and rate limits are two different meters#

Almost every market data API meters REST usage twice. A monthly quota caps total calls. A rate limit caps how fast you can make them. You can exhaust either one on its own.

SiftingIO's tiers, per market, from the live pricing page as of September 2026:

TierREST calls per monthRate limitPrice per month, billed annually
Free10,00060 req/min$0
Builder250,000100 req/sec$79
Pro5,000,000150 req/sec$239
UltraUnlimited250 req/sec, upgradeable$639

Those prices are the forex, crypto, and commodities plans; US stocks and DEX data run higher, with Builder at $103 and Pro at $320.

The monthly quota decides the tier for batch workloads. A nightly job that refreshes daily bars for 2,000 tickers makes about 2,000 calls a day, roughly 60,000 a month, which fits Builder with room to spare. The rate limit decides the tier for bursty workloads. A screener that fans out 500 requests when a user clicks a button cares about the per-second ceiling, and the monthly quota barely matters.

The API reports where you stand on every response, so you can measure a workload on the free tier before choosing a paid one:

curl -sD - -o /dev/null -H "X-API-Key: $SIFTING_KEY" \
  "https://api.sifting.io/v1/last/quote/forex/EURUSD" | grep -i ratelimit

The response carries X-RateLimit-Limit (burst capacity) and X-RateLimit-Remaining (tokens left). When you hit the ceiling the API returns 429 with an error code of rate_limit_exceeded and a Retry-After header in seconds. Log those three headers for a week on the free tier and you'll know your real request profile.

REST vs WebSocket access tiers#

Streaming is metered on a different axis: concurrent connections and symbol subscriptions rather than call counts. A WebSocket tick doesn't count against the monthly REST quota. That changes the math for anything live.

On SiftingIO the limits are 1 connection and 5 subscriptions on Free, 3 and 100 on Builder, 10 and 1,000 on Pro, and 50 connections with unlimited subscriptions on Ultra. Consider a price board that shows 40 forex pairs and polls the REST quote endpoint once a second. That's 40 calls per second and about 3.4 million calls a month, which lands in Pro on quota alone. The same board over one WebSocket connection with 40 subscriptions uses zero REST calls and fits Builder's 100 subscriptions:

{"op":"subscribe","product":"fx","symbols":["EURUSD","GBPUSD","USDJPY"]}

Connect to wss://stream.sifting.io/ws/v1?key=$SIFTING_KEY, send that frame, and the server replies with the last cached tick for each symbol followed by live updates. Whenever a vendor prices REST and WebSocket separately, move the live parts of the app to the stream and reserve REST calls for history and fundamentals.

History depth is a paid axis#

History depth is the dimension most often missed on a pricing page. On SiftingIO, Free reaches back one month, Builder one year, and Pro and above return the full available history for that market. Backtesting over several years therefore means Pro on the markets you backtest, and nothing stops you from staying on Free for the ones you only spot-check.

Depth is a reach limit, not a separate meter. Every page of bars still counts as a REST call, and the bars endpoints require gzip. Pagination is cursor-based and a page holds up to 2,000 rows, so one year of 1-minute bars for a single US stock (about 98,000 bars across roughly 252 sessions of 390 minutes) is around 50 calls:

curl --compressed -H "X-API-Key: $SIFTING_KEY" \
  "https://api.sifting.io/v1/hist/stocks/AAPL/bars?interval=1m&limit=2000"

Follow meta.next_cursor until it returns null. Multiply that call count by the number of symbols in your universe and the backfill quota becomes concrete instead of a guess.

Overage, free-tier limits, and redistribution rights#

Three items rarely appear in the headline price and often decide the bill.

Overage is what happens at call 250,001. Some vendors hard-stop with a 429 until the month rolls over. Others bill a per-call overage. SiftingIO's Pro tier lets you opt into soft overage at a transparent per-call price, and extra REST call blocks, burst-rate upgrades, and additional WebSocket capacity are sold as monthly add-ons. The current rates are on the pricing page. Below Pro, plan for a 429 and honour Retry-After.

Free-tier limits define what you can validate before paying. SiftingIO's Free tier needs no card and includes 10,000 REST calls a month, one WebSocket connection, five symbol subscriptions, one API key, and one month of history, licensed for evaluation and internal non-commercial use. That's enough to measure a request profile with the headers above. It's deliberately short of production volume.

Redistribution rights decide whether you may show the data to your own customers. On SiftingIO, Pro and Ultra support commercial use and customer-facing display subject to plan and licensing terms. Custom distribution and high-volume embedded use go through Enterprise. One licensing fact matters for every buyer: SiftingIO does not redistribute raw primary exchange feeds, official exchange-of-record prices, or any venue's proprietary data. Its price is a consensus reference value aggregated across multiple independent venues. If a use case legally requires an exchange-of-record print, no tier of a consensus-price product provides it, and you should know that before comparing prices at all.

Common pitfalls when estimating cost#

Counting requests instead of calls. A "single" historical pull is one request in your code and hundreds of calls against the quota once pagination runs. Estimate at the page level.

Mixing up per-minute and per-second limits. Free is 60 requests per minute. Builder is 100 requests per second. A worker pool tuned for Builder will trip 429 errors within a second on Free, and a throttle written for Free wastes almost all of Builder's headroom. Read X-RateLimit-Remaining rather than hardcoding a sleep.

Quoting the annual price as the monthly price. The prices in the table are per month when billed annually. Monthly billing costs roughly 20% more, and the monthly base varies by market, so check the toggle on the pricing page before putting a figure in a budget.

A checklist before signing up#

  1. List every market your code queries, including the FX pairs a portfolio view needs for conversion.
  2. Split the workload into batch (calls per month), burst (calls per second), and live (symbols streamed at once).
  3. Compute backfill calls from bars per symbol divided by the page size, times the symbol count.
  4. Decide how many years of history each market needs; that alone may fix the tier.
  5. Confirm whether overage is a hard stop or a per-call charge, and what add-ons cost.
  6. Read the licence for customer-facing display and redistribution, and check whether an exchange-of-record print is required.
  7. Run the workload on the free tier for a week and log the rate-limit headers before choosing a tier.

The live numbers for every tier and market are on the pricing page. See pricing

Keep reading

Related posts