tickerall-com Bulk API

The Bulk API from tickerall-com — 6 operation(s) for bulk.

Operations 6

POST /v1/bulk/orders Place orders across many of your accounts in one request — one call fans out to… #
POST /v1/bulk/positions/close Close positions across many accounts in one request — either an explicit list… #
POST /v1/bulk/positions/modify Modify the stop-loss and/or take-profit on positions across many accounts in… #
POST /v1/bulk/orders/cancel Cancel resting pending orders (LIMIT / STOP) across many accounts in one… #
POST /v1/bulk/orders/modify Modify resting pending orders (trigger price, stop-loss, take-profit) across… #
GET /v1/bulk/accounts Read live state for many accounts in one request — connection status, account… #

Work with this as data

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/tickerall-com:tickerall-com-bulk-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 Specification

tickerall-com-bulk-api-openapi.yml Raw ↑
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>`.'