Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/tickfeed-pro:tickfeed-pro-market-data-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Tickfeed Pro market data API
version: 0.1.0
description: 'Operations tagged market data across 2 of this provider''s published API definitions: api.tickfeed.pro-openapi.json, tickfeed-pro-openapi.json. Each path carries the servers of the definition it was published in.'
tags:
- name: market data
paths:
/v1/symbols:
get:
tags:
- market data
summary: List Symbols
description: Supported symbols, their trading sessions and price precision. Free.
operationId: list_symbols_v1_symbols_get
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/SymbolsResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security:
- APIKeyHeader: []
/v1/price/{symbol}:
get:
tags:
- market data
summary: Get Price
description: 'Latest bid/ask.
`freshness`: `fresh` if the tick is at most `stale_after_seconds` old; `market_closed` if older
but the market is outside its scheduled session; `stale` if older while the market should be
trading (a feed problem). The last known price is returned in every case, clearly labelled.
Cost: 1 unit.'
operationId: get_price_v1_price__symbol__get
security:
- APIKeyHeader: []
parameters:
- name: symbol
in: path
required: true
schema:
type: string
pattern: ^[A-Za-z0-9._-]{1,20}$
title: Symbol
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PriceResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v1/prices:
get:
tags:
- market data
summary: Get Prices
description: 'Latest bid/ask for several symbols in one request, each with the same fields and freshness
label as `/v1/price/{symbol}`. Use this instead of one request per pair: it is faster for you
and counts once against your rate limit.
Cost: 1 unit per symbol returned (duplicates are removed).'
operationId: get_prices_v1_prices_get
security:
- APIKeyHeader: []
parameters:
- name: symbols
in: query
required: true
schema:
type: string
pattern: ^[A-Za-z0-9._,\s-]{1,700}$
description: Comma-separated symbols, e.g. EURUSD,GBPUSD,XAUUSD (up to 30)
title: Symbols
description: Comma-separated symbols, e.g. EURUSD,GBPUSD,XAUUSD (up to 30)
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PricesResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v1/candles/{symbol}:
get:
tags:
- market data
summary: Get Candles
description: 'OHLC candles in chronological order (oldest first).
* With `start_time`: the first `limit` bars from `start_time` up to `end_time` (or now).
If more exist, `truncated` is true and `next_start_time` gives the next page.
* Without `start_time`: the latest `limit` bars up to `end_time` (or now).
S1, S5, S15 and S30 are built from tick history (about the last six months) and are live only.
The most recent bar may still be forming; it is returned with `complete: false`.
Gaps (weekends, breaks, missing history) are never filled.
Cost: 1 unit per started block of 100 bars returned (1-100 bars = 1 unit, 101-200 = 2, ...).'
operationId: get_candles_v1_candles__symbol__get
security:
- APIKeyHeader: []
parameters:
- name: symbol
in: path
required: true
schema:
type: string
pattern: ^[A-Za-z0-9._-]{1,20}$
title: Symbol
- name: timeframe
in: query
required: false
schema:
$ref: '#/components/schemas/Timeframe'
description: Bar timeframe
default: M5
description: Bar timeframe
- name: limit
in: query
required: false
schema:
type: integer
maximum: 5000
minimum: 1
default: 100
title: Limit
- name: start_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
description: ISO 8601; naive values are treated as UTC
title: Start Time
description: ISO 8601; naive values are treated as UTC
- name: end_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
description: ISO 8601; naive values are treated as UTC
title: End Time
description: ISO 8601; naive values are treated as UTC
- name: source
in: query
required: false
schema:
$ref: '#/components/schemas/CandleSource'
description: live = real-time feed, stored = TickFeed stored history
default: live
description: live = real-time feed, stored = TickFeed stored history
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/CandlesResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v1/ticks/{symbol}:
get:
tags:
- market data
summary: Get Ticks
description: 'Raw tick history: every bid/ask change, timestamped to the millisecond (UTC), oldest first.
* With `start_time`: the first `limit` ticks from `start_time` up to `end_time` (or now).
If more exist, `truncated` is true and `next_start_time` gives the next page.
* Without `start_time`: the latest `limit` ticks up to `end_time` (or now).
History covers roughly the last six months (rolling); `notes` gives the exact start for the symbol.
Cost: 1 unit per started block of 1,000 ticks returned (1-1,000 ticks = 1 unit, 1,001-2,000 = 2, ...).'
operationId: get_ticks_v1_ticks__symbol__get
security:
- APIKeyHeader: []
parameters:
- name: symbol
in: path
required: true
schema:
type: string
pattern: ^[A-Za-z0-9._-]{1,20}$
title: Symbol
- name: limit
in: query
required: false
schema:
type: integer
maximum: 10000
minimum: 1
description: Maximum ticks to return
default: 1000
title: Limit
description: Maximum ticks to return
- name: start_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
description: ISO 8601; naive values are treated as UTC
title: Start Time
description: ISO 8601; naive values are treated as UTC
- name: end_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
description: ISO 8601; naive values are treated as UTC
title: End Time
description: ISO 8601; naive values are treated as UTC
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/TicksResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/v1/candles/{symbol}/gaps:
get:
tags:
- market data
summary: Get Gaps
description: 'Missing intervals in the stored candle history. Cost: 1 unit.'
operationId: get_gaps_v1_candles__symbol__gaps_get
security:
- APIKeyHeader: []
parameters:
- name: symbol
in: path
required: true
schema:
type: string
pattern: ^[A-Za-z0-9._-]{1,20}$
title: Symbol
- name: timeframe
in: query
required: false
schema:
$ref: '#/components/schemas/Timeframe'
default: M5
- name: start_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Start Time
- name: end_time
in: query
required: false
schema:
anyOf:
- type: string
format: date-time
- type: 'null'
title: End Time
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/GapsResponse'
'401':
description: Missing, invalid or revoked API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: Balance too low for this request (insufficient_balance)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: Account inactive
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Unsupported symbol
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'503':
description: Market data feed unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
GapOut:
properties:
after:
type: string
format: date-time
title: After
description: Open time of the last stored bar before the gap.
before:
type: string
format: date-time
title: Before
description: Open time of the first stored bar after the gap.
missing_bars:
type: integer
title: Missing Bars
expected:
type: boolean
title: Expected
description: True if every missing bar falls outside scheduled trading hours.
unexplained_bars:
type: integer
title: Unexplained Bars
description: Missing bars inside scheduled trading hours.
type: object
required:
- after
- before
- missing_bars
- expected
- unexplained_bars
title: GapOut
ErrorResponse:
properties:
error:
$ref: '#/components/schemas/ErrorDetail'
type: object
required:
- error
title: ErrorResponse
TickOut:
properties:
time:
type: string
title: Time
description: Quote time, UTC, ISO 8601 with milliseconds (e.g. 2026-10-30T12:00:00.123Z).
bid:
type: number
title: Bid
ask:
type: number
title: Ask
type: object
required:
- time
- bid
- ask
title: TickOut
GapsResponse:
properties:
symbol:
type: string
title: Symbol
timeframe:
$ref: '#/components/schemas/Timeframe'
stored_bars:
type: integer
title: Stored Bars
gaps:
items:
$ref: '#/components/schemas/GapOut'
type: array
title: Gaps
note:
type: string
title: Note
default: Gaps are computed from stored bars only and are never filled. 'expected' gaps are market closures per the symbol's schedule. Unexplained gaps can be holidays (not modelled), minutes with no ticks (common on M1), or missing data; the collector periodically re-requests them.
type: object
required:
- symbol
- timeframe
- stored_bars
- gaps
title: GapsResponse
TicksResponse:
properties:
symbol:
type: string
title: Symbol
count:
type: integer
title: Count
truncated:
type: boolean
title: Truncated
description: True if more ticks matched than `limit` allowed.
next_start_time:
anyOf:
- type: string
- type: 'null'
title: Next Start Time
description: When truncated with start_time, pass this as start_time to get the next page (no tick is repeated or skipped).
ticks:
items:
$ref: '#/components/schemas/TickOut'
type: array
title: Ticks
description: Every bid/ask change, oldest first.
notes:
items:
type: string
type: array
title: Notes
default: []
type: object
required:
- symbol
- count
- truncated
- next_start_time
- ticks
title: TicksResponse
Timeframe:
type: string
enum:
- S1
- S5
- S15
- S30
- M1
- M5
- M15
- M30
- H1
- H4
- D1
title: Timeframe
SymbolInfo:
properties:
symbol:
type: string
title: Symbol
description: Public symbol used in API paths.
available:
type: boolean
title: Available
session:
type: string
title: Session
description: 'Trading schedule: forex, metals or always.'
category:
anyOf:
- type: string
- type: 'null'
title: Category
description: metal, major, minor or exotic.
name:
anyOf:
- type: string
- type: 'null'
title: Name
description: Readable name, e.g. 'Euro / US Dollar'.
history_from:
anyOf:
- additionalProperties:
anyOf:
- type: string
format: date-time
- type: 'null'
type: object
- type: 'null'
title: History From
description: 'Open time (UTC) of the oldest stored bar for each timeframe, e.g. {"H1": ...}. Use it to check history depth before a backtest.'
description:
anyOf:
- type: string
- type: 'null'
title: Description
description: Same as `name`; kept for compatibility.
digits:
anyOf:
- type: integer
- type: 'null'
title: Digits
point:
anyOf:
- type: number
- type: 'null'
title: Point
description: Size of one price point in quote-currency units.
base_currency:
anyOf:
- type: string
- type: 'null'
title: Base Currency
quote_currency:
anyOf:
- type: string
- type: 'null'
title: Quote Currency
type: object
required:
- symbol
- available
- session
title: SymbolInfo
CandleSource:
type: string
enum:
- live
- stored
title: CandleSource
SymbolsResponse:
properties:
symbols:
items:
$ref: '#/components/schemas/SymbolInfo'
type: array
title: Symbols
timeframes:
items:
$ref: '#/components/schemas/Timeframe'
type: array
title: Timeframes
type: object
required:
- symbols
- timeframes
title: SymbolsResponse
CandlesResponse:
properties:
symbol:
type: string
title: Symbol
timeframe:
$ref: '#/components/schemas/Timeframe'
source:
$ref: '#/components/schemas/CandleSource'
count:
type: integer
title: Count
truncated:
type: boolean
title: Truncated
description: True if more bars matched the range than `limit` allowed.
next_start_time:
anyOf:
- type: string
format: date-time
- type: 'null'
title: Next Start Time
description: When truncated with start_time, pass this as start_time to get the next page.
candles:
items:
$ref: '#/components/schemas/CandleOut'
type: array
title: Candles
description: Chronological, oldest first. No gaps are filled.
notes:
items:
type: string
type: array
title: Notes
default: []
type: object
required:
- symbol
- timeframe
- source
- count
- truncated
- next_start_time
- candles
title: CandlesResponse
ErrorDetail:
properties:
code:
type: string
title: Code
examples:
- unsupported_symbol
message:
type: string
title: Message
type: object
required:
- code
- message
title: ErrorDetail
CandleOut:
properties:
time:
type: string
format: date-time
title: Time
description: Bar open time, UTC.
open:
type: number
title: Open
high:
type: number
title: High
low:
type: number
title: Low
close:
type: number
title: Close
tick_volume:
type: integer
title: Tick Volume
spread_points:
anyOf:
- type: integer
- type: 'null'
title: Spread Points
description: Spread recorded for the bar, in points.
complete:
type: boolean
title: Complete
description: False if the bar period had not ended when these values were captured; its values can still change.
type: object
required:
- time
- open
- high
- low
- close
- tick_volume
- spread_points
- complete
title: CandleOut
PriceResponse:
properties:
symbol:
type: string
title: Symbol
bid:
type: number
title: Bid
ask:
type: number
title: Ask
spread:
type: number
title: Spread
description: ask - bid, in price units (quote currency per unit).
spread_points:
type: integer
title: Spread Points
description: Spread in points (1 point = `point` price units).
point:
type: number
title: Point
tick_time:
type: string
format: date-time
title: Tick Time
description: Time of the latest tick, UTC.
age_seconds:
type: number
title: Age Seconds
freshness:
type: string
enum:
- fresh
- market_closed
- stale
title: Freshness
description: 'fresh: last tick no older than stale_after_seconds. market_closed: older, but the market is outside its scheduled session (or within the grace period right after it opened). stale: older while the market is scheduled to be trading, which indicates a feed problem.'
market_open:
type: boolean
title: Market Open
stale_after_seconds:
type: integer
title: Stale After Seconds
source:
type: string
title: Source
description: live = real-time feed; cache = the last real quote, returned while the feed is briefly interrupted (check freshness)
default: live
type: object
required:
- symbol
- bid
- ask
- spread
- spread_points
- point
- tick_time
- age_seconds
- freshness
- market_open
- stale_after_seconds
title: PriceResponse
PricesResponse:
properties:
prices:
items:
$ref: '#/components/schemas/PriceResponse'
type: array
title: Prices
description: One quote per requested symbol, in request order.
type: object
required:
- prices
title: PricesResponse
securitySchemes:
APIKeyHeader:
type: apiKey
description: Your API key
in: header
name: X-API-Key
x-refined-from:
- api.tickfeed.pro-openapi.json
- tickfeed-pro-openapi.json