Tick Data
Raw tick-level bid/ask data at full market resolution. Every price change, every spread movement -- the highest-fidelity data available on the platform. Designed for microstructure analysis, slippage calculation, and institutional-grade backtesting.
Pro and Enterprise Plans Only
Tick data is a premium endpoint restricted to Pro and Enterprise subscribers.
Free and Starter plans receive a 403 PLAN_UPGRADE_REQUIRED response.
Each tick request counts at 3x weight toward your API quota.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| symbol | string | Yes | Trading symbol (e.g., EURUSD, XAUUSD, USDJPY) |
| from | string | Yes | Start datetime in ISO 8601 format (e.g., 2026-04-04T14:00:00Z) |
| to | string | Yes | End datetime in ISO 8601 format. Maximum 1-hour range from from. |
Limits and Constraints
| Constraint | Value | Notes |
|---|---|---|
| Max time window | 1 hour | Per request. Paginate across multiple hours using sequential requests. |
| Max ticks per response | 50,000 | Results are capped at 50,000 ticks. Use a narrower window if truncated. |
| Quota weight | 3x | Each request counts as 3 API calls toward your plan limit. |
| Plan requirement | Pro / Enterprise | Free and Starter plans receive 403. |
Example Request
cURL
curl -H "X-API-Key: YOUR_API_KEY" \
"https://tickatlas.com/v1/ticks?symbol=EURUSD&from=2026-04-04T14:00:00Z&to=2026-04-04T15:00:00Z" Python
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://tickatlas.com/v1"
response = requests.get(
f"{BASE_URL}/ticks",
headers={"X-API-Key": API_KEY},
params={
"symbol": "EURUSD",
"from": "2026-04-04T14:00:00Z",
"to": "2026-04-04T15:00:00Z",
},
)
data = response.json()
for tick in data["data"]["ticks"]:
spread = tick["ask"] - tick["bid"]
print(f"{tick['time']} bid={tick['bid']} ask={tick['ask']} spread={spread:.5f}") JavaScript
const API_KEY = "YOUR_API_KEY";
const params = new URLSearchParams({
symbol: "EURUSD",
from: "2026-04-04T14:00:00Z",
to: "2026-04-04T15:00:00Z",
});
const response = await fetch(
`https://tickatlas.com/v1/ticks?${params}`,
{ headers: { "X-API-Key": API_KEY } }
);
const { data } = await response.json();
console.log(`Received ${data.count} ticks for ${data.symbol}`);
// Calculate average spread
const avgSpread = data.ticks.reduce(
(sum, t) => sum + (t.ask - t.bid), 0
) / data.ticks.length;
console.log(`Average spread: ${avgSpread.toFixed(5)}`); Success Response
{
"success": true,
"data": {
"symbol": "EURUSD",
"ticks": [
{
"time": "2026-04-04T14:00:00.123",
"bid": 1.08432,
"ask": 1.08445,
"flags": 0
},
{
"time": "2026-04-04T14:00:00.456",
"bid": 1.08433,
"ask": 1.08446,
"flags": 0
},
{
"time": "2026-04-04T14:00:01.012",
"bid": 1.08430,
"ask": 1.08443,
"flags": 0
}
],
"count": 48523
}
}
The count field reflects the total number of ticks returned. If it equals 50,000,
the result may be truncated -- narrow your time window to ensure complete data.
Error Responses
403 -- Plan Upgrade Required
{
"success": false,
"error": {
"code": "PLAN_UPGRADE_REQUIRED",
"message": "Tick data is available for Pro and Enterprise plans only.",
"current_plan": "starter",
"upgrade_url": "https://tickatlas.com/pricing"
}
} 400 -- Time Range Too Large
{
"success": false,
"error": {
"code": "RANGE_TOO_LARGE",
"message": "Maximum query range is 1 hour per request.",
"requested_range": "2:00:00",
"max_range": "1 hour"
}
} Fetching Multiple Hours
Since each request is limited to a 1-hour window, retrieve longer periods by iterating through consecutive time windows. The following Python example demonstrates this pattern:
from datetime import datetime, timedelta
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://tickatlas.com/v1"
def fetch_ticks(symbol: str, start: datetime, end: datetime):
"""Fetch tick data across multiple hours by paginating in 1-hour windows."""
all_ticks = []
window_start = start
while window_start < end:
window_end = min(window_start + timedelta(hours=1), end)
response = requests.get(
f"{BASE_URL}/ticks",
headers={"X-API-Key": API_KEY},
params={
"symbol": symbol,
"from": window_start.isoformat() + "Z",
"to": window_end.isoformat() + "Z",
},
)
response.raise_for_status()
chunk = response.json()["data"]["ticks"]
all_ticks.extend(chunk)
print(f" Fetched {len(chunk)} ticks for {window_start} - {window_end}")
window_start = window_end
return all_ticks
# Fetch 4 hours of tick data (4 sequential requests)
ticks = fetch_ticks(
"EURUSD",
datetime(2026, 4, 4, 10, 0, 0),
datetime(2026, 4, 4, 14, 0, 0),
)
print(f"Total ticks retrieved: {len(ticks)}") Tick Flags
The flags field is an integer sourced directly from the broker terminal.
It encodes tick direction and price-change metadata. These flags can be combined as a bitmask.
| Flag Value | Meaning |
|---|---|
| 0 | No change or unknown direction |
| 2 | Last tick was an uptick (price moved up) |
| 4 | Last tick was a downtick (price moved down) |
| 6 | Bid changed |
| 8 | Ask changed |
Flags are bitmask values and can be combined. For example, a value of 10
(2 + 8) indicates an uptick where the ask price changed. A value of 0 typically
means the tick direction is unknown or unchanged.
Use Cases
Microstructure Analysis
Study bid/ask dynamics, quote arrival rates, and price formation processes at the highest available resolution.
Spread Monitoring
Track real-time and historical spread behavior at tick resolution. Identify spread widening events around news releases or low-liquidity windows.
Slippage Calculation
Compare intended execution prices against actual tick-level market conditions to quantify slippage across different instruments and time periods.
HFT Backtesting
Backtest high-frequency strategies against real tick data rather than interpolated candle data. Essential for strategies with sub-minute holding periods.
Order Flow Analysis
Analyze tick direction flags to infer order flow patterns, detect aggressive buying or selling, and identify potential support/resistance levels.
Execution Quality Audit
Audit broker execution quality by comparing fill prices against the tick stream at the exact moment of order execution.