TickAtlas
GET /v1/ticks Premium (3x)

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.

View plans and upgrade →

Parameters

Parameter Type Required Description
symbolstringYesTrading symbol (e.g., EURUSD, XAUUSD, USDJPY)
fromstringYesStart datetime in ISO 8601 format (e.g., 2026-04-04T14:00:00Z)
tostringYesEnd datetime in ISO 8601 format. Maximum 1-hour range from from.

Limits and Constraints

Constraint Value Notes
Max time window1 hourPer request. Paginate across multiple hours using sequential requests.
Max ticks per response50,000Results are capped at 50,000 ticks. Use a narrower window if truncated.
Quota weight3xEach request counts as 3 API calls toward your plan limit.
Plan requirementPro / EnterpriseFree and Starter plans receive 403.

Example Request

cURL

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

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

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

200 OK
{
  "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

403
{
  "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

400
{
  "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:

Python · pagination
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.