tickerall-com Bulk API
The Bulk API from tickerall-com — 6 operation(s) for bulk.
The Bulk API from tickerall-com — 6 operation(s) for bulk.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/tickerall-com:tickerall-com-bulk-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: TickerAll Bulk API
version: 1.0.0
description: 'Hosted MetaTrader 5 & MT4 broker API. Connect a broker account, then place trades, pull historical candles, read positions and closed-trade history, and manage your accounts — from your own code, with no local MetaTrader terminal (runs on Linux, macOS, containers, anywhere).
Live market data streams over a WebSocket at `wss://api.tickerall.com/v1/stream`, authenticated with the same bearer token (an `Authorization: Bearer ` header on the upgrade, or `?token=` for browser clients).
**Authentication:** every endpoint except the public demo feed takes an `Authorization: Bearer ` header. Get an API key at https://tickerall.com.
**Error codes:**
- `UNAUTHORIZED` (401): Missing, malformed, or invalid Authorization header / API key.
- `VALIDATION_ERROR` (400): The request body or params failed validation. A details array lists the offending fields.
- `BROKER_AUTH_FAILED` (401): The broker rejected the login — wrong account number, password, or server. Returned by POST /v1/sessions and POST /v1/accounts/:id/reconnect. Fix the detail and retry.
- `BROKER_UNREACHABLE` (503): Could not reach the broker (network/endpoint down). Retry shortly. (A wrong password no longer maps here — see BROKER_AUTH_FAILED.)
- `BROKER_ACCOUNT_NOT_HOT` (409): The connection cooled. Call POST /v1/sessions with credentials to reconnect.
- `BROKER_REJECTED` (422): The broker refused the order/close/modify. The reason is in message (e.g. bad volume, market closed, stop level).
- `TICKET_NOT_FOUND` (404): The position ticket is not open on this account.
- `BROKER_ACCOUNT_NOT_FOUND` (404): No broker account with that id belongs to your key.
- `BROKER_ACCOUNT_ALREADY_LINKED` (409): That broker account is already linked to another TickerAll customer.
- `FREE_TIER_LIVE_REJECTED` (403): Live account on Free outside the Terminal, or a second one at once. API live starts at Trader.
- `DEMO_ACCOUNT_RESERVED` (403): That broker account is reserved by TickerAll for the public demo and cannot be attached.
- `TIER_ACCOUNT_CAP_REACHED` (403): You hit your plan’s broker-account cap. Upgrade, or contact us for Enterprise.
- `BROKER_NOT_FOUND` (422): The server name could not be resolved — it is not a known MT4/MT5 server. Use the exact name your terminal shows (MT5 servers are usually "Broker-MT5…"). No account row is left behind by a failed attempt.
- `BROKER_ACCOUNT_INVALID` (422): The broker refused the account itself (disabled, archived, expired). Fix it in your broker portal; retrying will not help.
- `DISCOVERY_UNAVAILABLE` (503): Broker lookup is temporarily paused after upstream errors. Your server name was NOT rejected — retry in a few minutes. Never a verdict on the name.
- `SYMBOL_CATALOG_UNAVAILABLE` (503): The account is connected but its instrument list could not be read (a TickerAll-side gap, not an empty account). GET /symbols and /symbol-specs return this instead of an empty list, so an empty array never masquerades as "no symbols". Retry; if it persists, contact support with the broker and account type.
- `ALWAYS_HOT_TIER_REQUIRED` (403): Always-hot needs a paid plan: Trader ($0.99/mo per connection) or Pro / Enterprise (included).
- `VAULT_PURGE_PENDING` (503): DELETE /v1/accounts/:id could not yet destroy the account’s remembered password, so the account was not removed. Retry shortly.
- `REMEMBER_PRO_REQUIRED` (403): Remembered credentials (server-side password storage, opt-in) are available on the Pro and Enterprise plans.
- `rate_limited` (429): Too many requests for this API key this minute. Budgets per key: 300/min order writes (a bulk call counts once), 600/min candles and history, 120/min POST /v1/sessions, 2000/min everything else. Wait Retry-After seconds; every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds) for its budget.
- `INTERNAL_ERROR` (500): Unexpected server error. Safe to retry idempotent calls.'
contact:
name: TickerAll
url: https://tickerall.com
email: hello@tickerall.com
x-providerName: tickerall.com
x-origin:
- format: openapi
version: '3.0'
url: https://tickerall.com/openapi.json
x-logo:
url: https://tickerall.com/tickerall-social-logo-v4.png
servers:
- url: https://api.tickerall.com
description: TickerAll production API
security:
- bearerAuth: []
tags:
- name: Bulk
paths:
/v1/bulk/orders:
post:
tags:
- Bulk
summary: Place orders across many of your accounts in one request — one call fans out to…
description: 'Place orders across many of your accounts in one request — one call fans out to every account you name, and each order’s outcome is reported separately. An account can appear more than once, so one call can send several legs to the same account. Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Requires an Idempotency-Key header (see Conventions). Re-sending the same key replays the original response without placing any order a second time.
- Partial success — a mix of filled and failed accounts still returns 200. Read each account’s outcome in results: status is "filled" (with its ticket and fill price) or "failed" (with a code and human-readable reason). summary tallies total / filled / failed.
- Works on both live and demo accounts — there is no account-type restriction beyond the Pro / Enterprise plan requirement above.
- Several legs on one account — repeat its accountId. results come back in the order you sent them. On one account, market orders run in parallel and pending orders are placed one after another.'
operationId: postV1BulkOrders
parameters:
- name: Idempotency-Key
in: header
required: true
description: A stable key so a retried request cannot execute twice. Re-sending the same key returns the original response.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
orders:
type: array
items:
type: object
description: 'The orders to place — 1 to 50, one object per target: { accountId, type?, symbol, side, volume, price?, stopLoss?, takeProfit?, comment? }. accountId is the account to trade; type defaults to "market" ("limit"/"stop" need a price for a pending order); symbol, side and volume are required; stopLoss / takeProfit / comment are optional. Each entry mirrors the single-account POST /v1/accounts/:id/orders body.'
required:
- orders
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
results:
- accountId: acc_8Kd3...
status: filled
ticket: 4072808150
price: 77512.73
symbol: BTCUSD
- accountId: acc_9Lm4...
status: failed
symbol: BTCUSD
code: BROKER_REJECTED
reason: Not enough money
summary:
total: 2
filled: 1
failed: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
/v1/bulk/positions/close:
post:
tags:
- Bulk
summary: Close positions across many accounts in one request — either an explicit list…
description: 'Close positions across many accounts in one request — either an explicit list of positions, or a per-account intent that flattens each account (optionally narrowed by its own broker-native symbol or side). Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Requires an Idempotency-Key header. Re-sending the same key replays the original response without closing anything twice; re-using it with a different body is a 409 IDEMPOTENCY_KEY_REUSED.
- Each "ok" result carries the booked closing deal (closePrice, dealTicket, profit, swap, commission), null when not yet booked.
- Two modes: pass items for an explicit per-position list, OR targets for a per-account intent (each { accountId, symbol?, side? }, with its own broker-native symbol). Supplying neither is a 400.
- Partial success — each position’s outcome is in results: status "ok" (closed true) or "failed" (with a code and reason). summary tallies total / ok / failed.
- Each "ok" result carries the booked close deal (closePrice, dealTicket, profit, swap, commission), as on the single close; null until the broker books it.'
operationId: postV1BulkPositionsClose
parameters:
- name: Idempotency-Key
in: header
required: true
description: A stable key so a retried request cannot execute twice. Re-sending the same key returns the original response.
schema:
type: string
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
type: object
description: 'Explicit mode: the exact positions to close, one object each: { accountId, ticket, volume? }. Omit volume for a full close, or pass a smaller volume for a partial close. Use this OR the intent fields below — not both.'
targets:
type: array
items:
type: object
description: 'Intent mode: a per-account list, one object each: { accountId, symbol?, side? }. Every open position on that account is closed unless narrowed by its own symbol and/or side. Each target carries its own broker-native symbol, so a mixed-broker roster (Exness EURUSDm + XM EURUSD) works in one call. Use this OR items.'
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
results:
- accountId: acc_8Kd3...
ticket: 4072808150
status: ok
symbol: BTCUSD
side: BUY
volume: 0.1
closed: true
closePrice: 81320.15
dealTicket: '1191098644'
profit: -0.4
swap: 0
commission: 0
- accountId: acc_9Lm4...
ticket: 4072809002
status: failed
symbol: BTCUSD
side: SELL
volume: 0.2
closed: false
code: TICKET_NOT_FOUND
reason: Position not open
summary:
total: 2
ok: 1
failed: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
/v1/bulk/positions/modify:
post:
tags:
- Bulk
summary: Modify the stop-loss and/or take-profit on positions across many accounts in…
description: 'Modify the stop-loss and/or take-profit on positions across many accounts in one request. Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Requires an Idempotency-Key header.
- Each item must carry at least one of stopLoss / takeProfit; an omitted field is preserved at its current value.
- Partial success — per-position outcome in results: status "ok" (modified true) or "failed" (with a code and reason). summary tallies total / ok / failed.'
operationId: postV1BulkPositionsModify
parameters:
- name: Idempotency-Key
in: header
required: true
description: A stable key so a retried request cannot execute twice. Re-sending the same key returns the original response.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
type: object
description: 'The positions to modify, one object each: { accountId, ticket, stopLoss?, takeProfit? }. Provide at least one of stopLoss / takeProfit per item; an omitted field keeps its current value.'
required:
- items
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
results:
- accountId: acc_8Kd3...
ticket: 4072808150
status: ok
symbol: BTCUSD
side: BUY
modified: true
- accountId: acc_9Lm4...
ticket: 4072809002
status: failed
symbol: BTCUSD
side: SELL
modified: false
code: BROKER_REJECTED
reason: Invalid stops
summary:
total: 2
ok: 1
failed: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
/v1/bulk/orders/cancel:
post:
tags:
- Bulk
summary: Cancel resting pending orders (LIMIT / STOP) across many accounts in one…
description: 'Cancel resting pending orders (LIMIT / STOP) across many accounts in one request — an explicit list, or a per-account intent that cancels the pending orders on each account (optionally narrowed by its own broker-native symbol). Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Requires an Idempotency-Key header.
- Two modes: items for an explicit list, OR targets for a per-account intent (each { accountId, symbol? }, with its own broker-native symbol). Supplying neither is a 400.
- Partial success — per-order outcome in results: status "ok" (cancelled true) or "failed" (with a code and reason). summary tallies total / ok / failed.
- Pending-order management is an MT5 feature; an entry on an account that does not support it comes back failed.'
operationId: postV1BulkOrdersCancel
parameters:
- name: Idempotency-Key
in: header
required: true
description: A stable key so a retried request cannot execute twice. Re-sending the same key returns the original response.
schema:
type: string
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
type: object
description: 'Explicit mode: the pending orders to cancel, one object each: { accountId, ticket }. Use this OR the intent fields below.'
targets:
type: array
items:
type: object
description: 'Intent mode: a per-account list, one object each: { accountId, symbol? }. Cancels every resting pending order on that account, narrowed by its own broker-native symbol. Use this OR items.'
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
results:
- accountId: acc_8Kd3...
ticket: 4072809988
status: ok
cancelled: true
- accountId: acc_9Lm4...
ticket: 4072809991
status: failed
cancelled: false
code: TICKET_NOT_FOUND
reason: Not a resting pending order
summary:
total: 2
ok: 1
failed: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
/v1/bulk/orders/modify:
post:
tags:
- Bulk
summary: Modify resting pending orders (trigger price, stop-loss, take-profit) across…
description: 'Modify resting pending orders (trigger price, stop-loss, take-profit) across many accounts in one request. Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Requires an Idempotency-Key header.
- Each item must carry at least one of price / stopLoss / takeProfit; an omitted field is preserved at its current value.
- Partial success — per-order outcome in results: status "ok" (modified true) or "failed" (with a code and reason). summary tallies total / ok / failed.'
operationId: postV1BulkOrdersModify
parameters:
- name: Idempotency-Key
in: header
required: true
description: A stable key so a retried request cannot execute twice. Re-sending the same key returns the original response.
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
type: object
description: 'The pending orders to modify, one object each: { accountId, ticket, price?, stopLoss?, takeProfit? }. Provide at least one of price / stopLoss / takeProfit per item; an omitted field keeps its current value.'
required:
- items
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
results:
- accountId: acc_8Kd3...
ticket: 4072809988
status: ok
modified: true
- accountId: acc_9Lm4...
ticket: 4072809991
status: failed
modified: false
code: TICKET_NOT_FOUND
reason: Not a resting pending order
summary:
total: 2
ok: 1
failed: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
/v1/bulk/accounts:
get:
tags:
- Bulk
summary: Read live state for many accounts in one request — connection status, account…
description: 'Read live state for many accounts in one request — connection status, account financials and open positions for your whole roster (or a subset) in a single call. Requires a Pro or Enterprise plan.
- Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403.
- Not idempotent and takes no body — pass ids and include as query-string parameters.
- One round-trip for your whole roster. Each account’s status is "online" (its account and positions blocks are present, per include) or "offline" (the connection has cooled — POST /v1/sessions to re-warm it; the account/positions blocks are omitted).
- include controls the per-account payload: "account" adds the financials block, "positions" adds open positions; both are included by default. Drop one to make the response smaller.
- Any ids you pass that are not on your key come back in notFound. summary tallies total / online / offline.'
operationId: getV1BulkAccounts
parameters:
- name: ids
in: query
required: false
description: Comma-separated accountIds to read, e.g. "acc_8Kd3...,acc_9Lm4...". Omit to read every account on your key.
schema:
type: string
- name: include
in: query
required: false
description: 'Comma-separated list of what to include per account: "account", "positions". Defaults to both — e.g. include=account to skip positions and get a smaller response.'
schema:
type: string
responses:
'200':
description: 200 OK
content:
application/json:
schema:
type: object
example:
accounts:
- id: acc_8Kd3...
broker: mt5
server: Exness-MT5Trial14
accountNumber: '****5678'
externalRef: null
isDemo: true
hot: true
poolId: pool_3
terminalType: MOBILE
alwaysHot: false
lastHotAt: '2026-08-29T09:30:01.000Z'
createdAt: '2026-08-20T09:11:55.000Z'
status: online
account:
balance: 9871.42
currency: USD
equity: 9863.1
margin: 142.5
freeMargin: 9720.6
marginLevel: 6921.5
credit: null
leverage: 500
positions:
- ticket: 4072808150
symbol: BTCUSD
side: BUY
volume: 0.1
entryPrice: 77512.73
currentPrice: 77640.1
profit: 12.74
- id: acc_9Lm4...
broker: mt5
server: ICMarketsSC-Demo
accountNumber: '****3311'
externalRef: null
isDemo: true
hot: false
poolId: null
terminalType: WEB
alwaysHot: false
lastHotAt: '2026-08-29T08:05:44.000Z'
createdAt: '2026-08-21T14:02:10.000Z'
status: offline
notFound: []
summary:
total: 2
online: 1
offline: 1
'400':
$ref: '#/components/responses/Error'
'401':
$ref: '#/components/responses/Error'
default:
$ref: '#/components/responses/Error'
components:
schemas:
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: Machine-readable error code (see the description).
message:
type: string
description: Human-readable explanation.
details:
type: array
items:
type: object
description: Optional per-field validation details.
required:
- code
- message
responses:
Error:
description: Error — see the `code` field and the error-code list in the API description.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'Your TickerAll API key, sent as `Authorization: Bearer <API_KEY>`.'