GET only, returns JSON, and takes the API key in the x-api-key header.
https://public-api.takeprofit.com/api/v1/marketdata. Live data is a separate protocol — see the WebSocket API.
Endpoints
Each endpoint page in the sidebar lists its parameters and response fields and has a Try it playground.
Only
exchange, symbol and timeframe are required. Leave the range out and the endpoint answers with the most recent data it has — the last 1000 candles, or the profiles that fit the default window. Add from, to, period or limit to narrow it down.Exchange codes come from GET /exchanges. They are TakeProfit codes, not the MIC of the listing venue: US equities are served under BATS, so AAPL lives at exchange=BATS. An unknown code answers 404 exchange not found, a symbol that is not listed there 404 security not found.Parameters the history endpoints share
Combine what you need:
from alone reads forward from that point, to alone reads backwards from it, from with to pins both ends, and period sets the length from whichever end you gave. Unknown query parameters are still rejected with 400, so a typo fails loudly instead of being silently ignored — passing limit to footprint or TPO is one of those typos, since only candles take it.
Every authenticated response carries the quota headers x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset (the reset is a Unix timestamp). They count credits, not requests: your account gets 100,000 credits per 60 seconds, and every request costs at least 1,000. Prices, caps and what to do on 429 are in Credits and limits. Every response, errors included, also carries an x-request-id worth quoting in a support request.
Reading the responses
- Prices and volumes are decimal strings. Nothing is rounded into a float on the way to you.
- Profile rows are positional arrays. A footprint row is
[price, volumeBuy, volumeSell, tradesCountBuy, tradesCountSell], a TPO row is[price, blockIndexes, volumeBuy, volumeSell]. Future fields are appended, so ignore extra trailing elements. priceis the lower bound of the half-open interval[price, price + rowSize).- Footprint history depth is limited per timeframe, counted back from the security’s newest candle: 30 days for minute frames below
5m, rising with the timeframe to 3 years for1wand above. Afromolder than the limit is trimmed rather than rejected, so the response can start later than you asked, and a range that ends before the limit comes back empty. TPO has no such limit, only a cap of 400 profiles per request. Both start on 29 May 2026 at the earliest, when collection began, with no plans to backfill earlier periods; the depth of every timeframe is listed in History depth.
Errors
Every failure returns an HTTP status and a JSON body,{"error": {"code": "...", "message": "..."}}. Branch on code: it is stable, while message is for people.
Requests rejected with
400, 404 or 429 are not billed.
New here? Quickstart walks through the first three requests, and Authentication covers creating a key.