tickerall-com Copy Trading API

The Copy Trading API from tickerall-com — 6 operation(s) for copy trading.

Operations 10

POST /v1/copy/sets Create a copy set — one master account whose trades are mirrored to your… #
GET /v1/copy/sets List your copy sets, each with a follower count #
GET /v1/copy/sets/{setId} Get one copy set with its full follower list + config #
PATCH /v1/copy/sets/{setId} Update a set — rename, change the failure policy, or arm / pause it #
DELETE /v1/copy/sets/{setId} Delete a copy set (and its followers, position map, and log) #
POST /v1/copy/sets/{setId}/followers Add a follower to a set #
PATCH /v1/copy/sets/{setId}/followers/{followerId} Update a follower’s config — only the fields you send change #
DELETE /v1/copy/sets/{setId}/followers/{followerId} Remove a follower from a set #
GET /v1/copy/sets/{setId}/stats Dashboard stats for a set — totals, replication rate, and per-follower rollups #
GET /v1/copy/sets/{setId}/log The copy log for a set — every mirrored action and its outcome, newest first #

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-copy-trading-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-copy-trading-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: TickerAll Copy Trading 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: Copy Trading
paths:
  /v1/copy/sets:
    post:
      tags:
      - Copy Trading
      summary: Create a copy set — one master account whose trades are mirrored to your…
      description: 'Create a copy set — one master account whose trades are mirrored to your follower accounts, each scaled and risk-clamped to its own size. All accounts are your own. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan — on the Free and Trader plans this call returns 403 (COPY_REQUIRES_PRO).

        - Self-copy only — the master and every follower must be your own accounts. A follower cannot also be the master.

        - A new set is created paused (enabled false). Arm it with PATCH /v1/copy/sets/:setId { "enabled": true } once you’re happy with the followers.

        - While live copying is being rolled out, mirrored trades run on demo followers; managing sets and reading stats works on all accounts.'
      operationId: postV1CopySets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: A label for the set.
                masterAccountId:
                  type: string
                  description: The account whose trades are copied. Must be one of your own accounts (and never also a follower).
                failurePolicy:
                  type: string
                  description: 'What to do when a follower copy fails: "retry" (a few backoff attempts, the default) or "skip".'
                webhookUrl:
                  type: string
                  description: Optional. A public https:// URL that receives an HMAC-signed POST for every mirror outcome (see "Copy-event delivery" below).
                webhookSecret:
                  type: string
                  description: Optional HMAC-SHA256 signing key (16+ chars) for the X-Tickerall-Signature header. Write-only — never returned.
                followers:
                  type: array
                  items:
                    type: object
                  description: 'Optional followers to attach now, one object each: { followerAccountId, ...config }. Per-follower settings, all optional: sizingMethod ("proportional" — scale by the follower÷master equity ratio, the default | "multiplier" | "fixed" | "risk_percent") and sizingValue (the multiplier factor, fixed lots, or risk %); minLot / maxLot (clamp + snap the copied volume to the follower broker’s lot step); maxOpenTrades / maxExposureLots (caps); symbolAllow / symbolBlock (string arrays of follower symbols); dailyLossStop (auto-pause on loss); reverse (inverse copy — sell when the master buys); maxSlippagePips (skip if the follower price moved too far from the master fill); minMasterLot (ignore the master’s tiny trades); copyDelayMs; symbolOverrides (a { "MASTERSYMBOL": "followerSymbol" } map for cross-broker names the auto-normalizer can’t resolve).'
              required:
              - name
              - masterAccountId
      responses:
        '201':
          description: 201 Created
          content:
            application/json:
              schema:
                type: object
              example:
                id: cset_7Hb2...
                ownerId: usr_9Kd3...
                name: My desk
                masterAccountId: acc_master
                enabled: false
                failurePolicy: retry
                webhookUrl: null
                hasWebhookSecret: false
                createdAt: '2026-08-29T12:00:00.000Z'
                updatedAt: '2026-08-29T12:00:00.000Z'
                followers:
                - id: cf_1
                  followerAccountId: acc_1
                  sizingMethod: proportional
                  reverse: false
                  enabled: true
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
    get:
      tags:
      - Copy Trading
      summary: List your copy sets, each with a follower count
      description: 'List your copy sets, each with a follower count. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.'
      operationId: getV1CopySets
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
              example:
                sets:
                - id: cset_7Hb2...
                  name: My desk
                  masterAccountId: acc_master
                  enabled: true
                  failurePolicy: retry
                  _count:
                    followers: 3
                  createdAt: '2026-08-29T12:00:00.000Z'
                  updatedAt: '2026-08-29T12:00:00.000Z'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
  /v1/copy/sets/{setId}:
    get:
      tags:
      - Copy Trading
      summary: Get one copy set with its full follower list + config
      description: 'Get one copy set with its full follower list + config. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Returns 404 if the set is not yours.'
      operationId: getV1CopySetsSetId
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
              example:
                id: cset_7Hb2...
                name: My desk
                masterAccountId: acc_master
                enabled: true
                failurePolicy: retry
                followers:
                - id: cf_1
                  followerAccountId: acc_1
                  sizingMethod: multiplier
                  sizingValue: 0.5
                  maxLot: 1
                  reverse: false
                  enabled: true
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
    patch:
      tags:
      - Copy Trading
      summary: Update a set — rename, change the failure policy, or arm / pause it
      description: 'Update a set — rename, change the failure policy, or arm / pause it. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Provide at least one field. Arming is just enabled: true.'
      operationId: patchV1CopySetsSetId
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: New label.
                failurePolicy:
                  type: string
                  description: '"retry" or "skip".'
                enabled:
                  type: boolean
                  description: Arm (true) — start mirroring — or pause (false). Pausing leaves existing follower positions untouched.
                webhookUrl:
                  type: string
                  description: Set the copy-event webhook (public https:// URL), or null to clear it.
                webhookSecret:
                  type: string
                  description: Set the HMAC signing key (16+ chars), or null to clear it. Write-only.
      responses:
        '200':
          description: 200 OK
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
    delete:
      tags:
      - Copy Trading
      summary: Delete a copy set (and its followers, position map, and log)
      description: 'Delete a copy set (and its followers, position map, and log). Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Open follower positions are NOT closed — deleting a set only stops future mirroring.'
      operationId: deleteV1CopySetsSetId
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      responses:
        '204':
          description: 204 No Content
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
  /v1/copy/sets/{setId}/followers:
    post:
      tags:
      - Copy Trading
      summary: Add a follower to a set
      description: 'Add a follower to a set. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - The follower must be your own account, not the master, and not already in the set.'
      operationId: postV1CopySetsSetIdFollowers
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                followerAccountId:
                  type: string
                  description: The account to mirror to (one of your own; not the master, not already a follower).
                '...config':
                  type: object
                  description: 'Per-follower settings, all optional: sizingMethod ("proportional" — scale by the follower÷master equity ratio, the default | "multiplier" | "fixed" | "risk_percent") and sizingValue (the multiplier factor, fixed lots, or risk %); minLot / maxLot (clamp + snap the copied volume to the follower broker’s lot step); maxOpenTrades / maxExposureLots (caps); symbolAllow / symbolBlock (string arrays of follower symbols); dailyLossStop (auto-pause on loss); reverse (inverse copy — sell when the master buys); maxSlippagePips (skip if the follower price moved too far from the master fill); minMasterLot (ignore the master’s tiny trades); copyDelayMs; symbolOverrides (a { "MASTERSYMBOL": "followerSymbol" } map for cross-broker names the auto-normalizer can’t resolve).'
              required:
              - followerAccountId
      responses:
        '201':
          description: 201 Created
          content:
            application/json:
              schema:
                type: object
              example:
                id: cf_4
                copySetId: cset_7Hb2...
                followerAccountId: acc_4
                sizingMethod: proportional
                reverse: true
                maxSlippagePips: 3
                enabled: true
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
  /v1/copy/sets/{setId}/followers/{followerId}:
    patch:
      tags:
      - Copy Trading
      summary: Update a follower’s config — only the fields you send change
      description: 'Update a follower’s config — only the fields you send change. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.'
      operationId: patchV1CopySetsSetIdFollowersFollowerId
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      - name: followerId
        in: path
        required: true
        description: The follower id (cf_...), from the set’s followers list.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                '...config':
                  type: object
                  description: 'Any subset of Per-follower settings, all optional: sizingMethod ("proportional" — scale by the follower÷master equity ratio, the default | "multiplier" | "fixed" | "risk_percent") and sizingValue (the multiplier factor, fixed lots, or risk %); minLot / maxLot (clamp + snap the copied volume to the follower broker’s lot step); maxOpenTrades / maxExposureLots (caps); symbolAllow / symbolBlock (string arrays of follower symbols); dailyLossStop (auto-pause on loss); reverse (inverse copy — sell when the master buys); maxSlippagePips (skip if the follower price moved too far from the master fill); minMasterLot (ignore the master’s tiny trades); copyDelayMs; symbolOverrides (a { "MASTERSYMBOL": "followerSymbol" } map for cross-broker names the auto-normalizer can’t resolve). Send a field as null to clear it.'
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
              example:
                id: cf_4
                copySetId: cset_7Hb2...
                followerAccountId: acc_4
                sizingMethod: fixed
                sizingValue: 0.02
                maxLot: 1
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
    delete:
      tags:
      - Copy Trading
      summary: Remove a follower from a set
      description: 'Remove a follower from a set. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Open positions the follower already holds are NOT closed.'
      operationId: deleteV1CopySetsSetIdFollowersFollowerId
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      - name: followerId
        in: path
        required: true
        description: The follower id (cf_...).
        schema:
          type: string
      responses:
        '204':
          description: 204 No Content
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
  /v1/copy/sets/{setId}/stats:
    get:
      tags:
      - Copy Trading
      summary: Dashboard stats for a set — totals, replication rate, and per-follower rollups
      description: 'Dashboard stats for a set — totals, replication rate, and per-follower rollups. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Derived from the copy log: totals tally ok / skipped / failed; replicationRate is ok ÷ (ok + failed). Per follower: outcome counts, current open copied positions, and average fill latency.'
      operationId: getV1CopySetsSetIdStats
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
              example:
                set:
                  id: cset_7Hb2...
                  name: My desk
                  enabled: true
                  masterAccountId: acc_master
                  failurePolicy: retry
                  followerCount: 3
                totals:
                  ok: 128
                  skipped: 4
                  failed: 2
                  replicationRate: 0.9846
                byAction:
                  open: 66
                  close: 60
                  modify: 8
                followers:
                - followerAccountId: acc_1
                  enabled: true
                  sizingMethod: proportional
                  ok: 44
                  skipped: 1
                  failed: 0
                  openPositions: 2
                  avgLatencyMs: 138
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        default:
          $ref: '#/components/responses/Error'
  /v1/copy/sets/{setId}/log:
    get:
      tags:
      - Copy Trading
      summary: The copy log for a set — every mirrored action and its outcome, newest first
      description: 'The copy log for a set — every mirrored action and its outcome, newest first. Requires a Pro or Enterprise plan.


        - Requires a Pro or Enterprise plan.

        - Newest first. limit and before are query-string parameters; page by passing the previous response’s nextBefore back as before (null means the end).

        - result is "ok", "skipped" (with a reason — e.g. filtered by a rule), or "failed" (with a reason). action is open / close / partial_close / modify / pending_place / pending_cancel / pending_modify.'
      operationId: getV1CopySetsSetIdLog
      parameters:
      - name: setId
        in: path
        required: true
        description: The copy set id.
        schema:
          type: string
      - name: limit
        in: query
        required: false
        description: Query param. Page size, 1–200 (default 50).
        schema:
          type: number
      - name: before
        in: query
        required: false
        description: Query param. An ISO timestamp — return entries older than this. Use the response’s nextBefore to page.
        schema:
          type: string
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
              example:
                entries:
                - id: clg_9
                  followerAccountId: acc_1
                  action: open
                  masterTicket: '4072808150'
                  followerTicket: '5510022931'
                  symbol: EURUSDm
                  mappedSymbol: EURUSD
                  volume: 0.01
                  result: ok
                  latencyMs: 132
                  createdAt: '2026-08-29T12:34:56.000Z'
                - id: clg_8
                  followerAccountId: acc_2
                  action: open
                  symbol: XAUUSDm
                  volume: null
                  result: skipped
                  reason: XAUUSD is on the block list
                  createdAt: '2026-08-29T12:34:56.000Z'
                nextBefore: '2026-08-29T12:34:56.000Z'
        '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>`.'