Docs

Changelog

What changed in the fxapis API, newest first.

2026-11-12

  • Answering support by email. When we answer your support ticket by email, you can reply to that email: your answer is added to the same ticket in the console, marked "by email", and we are told as if you had answered in the console. No API change.
  • Closing or changing a position that has already closed. If a position was closed at the broker a moment before your request (by its stop loss or take profit, or by another close), closing it or changing its stops now answers 404 POSITION_NOT_FOUND and nothing is sent. Before, the broker rejected it with MT5 code 10013 "Invalid request". Cancelling a pending order that has already filled, expired or been cancelled at the broker answers 400 INVALID_REQUEST the same way.
  • Pending orders cancelled or expired outside fxapis. A pending order you cancel in MetaTrader 5 yourself, that your broker cancels, or that expires now moves to cancelled or expired in fxapis within a few minutes while the account is online. Before, it kept showing as working.
  • Cancelling an order that is no longer pending. POST /v1/orders/{id}/cancel on an order that is already cancelled, or has filled, now answers at once with 400 INVALID_REQUEST and says what state the order is in — a filled order is a position, so close it instead. Before, the request went to the broker and came back rejected with MT5 code 10013 "Invalid request". No change for orders still waiting at the broker.

2026-11-11

  • MarketLabs calendar: Canada, Australia and Japan. Release times with actual and previous figures for Canadian, Australian and Japanese jobs, inflation and GDP, and every Bank of Canada and Reserve Bank of Australia rate decision, each credited to its official publisher. Bank of Japan meetings are not included yet. No API change: the same GET /v1/marketlabs/events fields, with CAD, AUD and JPY in currencies.
  • MarketLabs: Today for you. A new page with the next 48 hours of official events for the currencies you hold or watch, your open positions and pending orders against them ("long EURUSD into the ECB rate decision at 13:15"), each pair's research lean, and what changed since yesterday. Open it from the watchlist ticker at the top of MarketLabs; until your watchlist and an MT5 account are set up, the ticker's button takes you to the step that is missing. Market intelligence stays MarketLabs' home page. In the API as GET /v1/marketlabs/today (positions need trading:read).
  • MarketLabs in Claude and ChatGPT. Two new read-only tools: get_marketlabs_today and get_marketlabs_snapshot (your watchlist, rates, volatility, positioning and currency strength). get_marketlabs_research can include the track record. Research, not trading advice.
  • Economic calendar. ISM Manufacturing and Services PMI dates are back, shown as not confirmed until the publisher confirms them.
  • SDKs. TypeScript SDK 0.3.2 and Python SDK 0.2.3 add price history (getAccountsByIdCandles, client.accounts.candles(…)), closing and retrying a multi-account order (postExecutionwavesByIdClose / postExecutionwavesByIdRetry, client.waves.close(…) / client.waves.retry(…)), and MarketLabs: today, the economic calendar, headlines, research and its track record (getMarketlabs… methods, client.marketlabs). Nothing existing changed.

2026-11-09

  • MarketLabs calendar with figures. Release times for US, euro-area and UK data and every Fed, ECB and Bank of England rate decision, with the source on every event. Actual and previous figures appear for euro-area and UK releases and for the three central banks' decisions; figures for US data (jobs, inflation, GDP, retail sales and more) are being added, and their dates show meanwhile. PMI release dates are listed without figures. GET /v1/marketlabs/events adds kind and impact filters and the fields kind, unit, period, revisedPrevious, status, releasedAt and confirmed; event ids are now stable per series and period. New read-only MCP tools: get_marketlabs_calendar and get_marketlabs_news. Headlines now show the outlet's name. Gold and silver (XAUUSD, XAGUSD) can be added to a MarketLabs watchlist.
  • MarketLabs on your phone. The MarketLabs console has a phone layout: pages in a bottom tab bar, the watchlist as tiles you swipe, and the calendar as a list by day. No API change.

2026-11-06

  • Pro plan. $29 a month or $290 a year: two live MT5 accounts and one demo account, 3,000 opening executions a month (refused beyond, never billed), always-on for $9 per account a month, pending orders, multi-account orders across your own accounts, webhooks, and up to three people. A third live account means Production. Plan code pro.
  • MarketLabs is included on every plan while it is in beta. What each plan includes may change. Daily official reference rates, trading sessions, the official economic calendar, CFTC positioning, and a daily cited research brief for each pair on your watchlist — a lean and a confidence per horizon, with a hit rate once a pair and horizon reaches 30 scored calls. Research, not trading advice: it never places a trade. Read more in the MarketLabs guide, or call it from Claude or ChatGPT with the get_marketlabs_research tool.

2026-11-05

  • Trials started from today. A trial now includes 1,000 opening executions and 50 hours of terminal time for the whole 14 days. Accounts come online when you use them and go offline after 10 minutes without trading; keeping an account online all the time comes with a paid plan. When the 50 hours are used, accounts stay offline (402 TRIAL_HOURS_USED); you can still read your accounts and close positions. Trials already running keep their terms.
  • Restarting an account. An account can be brought online or restarted up to 3 times in 10 minutes (429 RESTART_TOO_SOON, with retry-after). Closing positions, cancelling orders and moving stops are never held back by this.
  • What keeps an account online. On plans where accounts come online when used, opening and closing positions keep an account online, and so does an AI assistant working with that account. Moving a stop or cancelling a pending order does not.
  • Invitations. A workspace can send up to 20 invitations a day, 5 during a trial (429 INVITATIONS_LIMITED).
  • Your name. Names can use letters in any alphabet, numbers, spaces and the usual punctuation, up to 80 characters (400 INVALID_NAME).
  • API requests in the console now show what you used this month, without a monthly limit.
  • Partner program. Creators, communities, educators and brokers can now apply to partner with fxapis at fxapis.com/partners. People who sign up through a partner's link get a 30-day free trial. No API change.

2026-11-03

  • Plan codes for Personal, Production and Business. A plan code can now put a workspace on one of these plans. It gives what the plan's price includes — its included accounts, free demo accounts, opening executions each month and copy-trading followers — for good, with nothing to pay. Nothing beyond that is billed on a code: connecting more accounts, opening past the month's executions, more followers, or always-on where the plan sells it separately is refused (402 QUOTA_EXCEEDED or 402 FEATURE_NOT_IN_PLAN), saying the included allowance is reached. Closing positions and cancelling orders are always allowed. To go beyond it, subscribe: get in touch and we move the workspace onto a paid plan.
  • A login that worked and is then refused is tried again for you. Brokers also refuse logins during maintenance and outages, so an account that had connected before is tried again with its stored password after 15 minutes, an hour and four hours before you are asked to change anything. Meanwhile the account says when the next try is, and when other accounts at the same broker were refused at the same time. A login refused the first time it is tried is not retried. The account's detail no longer shows the broker's network address.
  • When a trial ends without a plan, its accounts go offline. They are stopped at once rather than after their idle time, and bringing an account online with no plan is refused with 402 QUOTA_EXCEEDED, as connecting one already was. Choose a plan in Billing and they come back online; closing positions and cancelling orders are always allowed.

2026-11-02

  • Multi-account orders: rejected now means the broker said no. An account whose order never reached the broker (it was not ready or not reachable when the orders went out, trading was switched off, the plan's allowance had run out or a payment was overdue, the broker had no price, or the send provably failed) is now skipped, with stateDetail saying why. rejected is only a refusal from the broker. Leg states.

  • Multi-account orders: unresolved accounts follow their order. An account left unresolved moves to filled, rejected or skipped once its order is confirmed with the broker (by our checks or by POST /v1/accounts/{id}/reconcile), and the order's summary and stateDetail follow. skipped there means the broker has no record of the order. A new webhook event, wave.updated, carries the order and its accounts each time this happens after it settled; subscribe to it on Webhooks.

  • Close everything a multi-account order opened. POST /v1/execution-waves/{id}/close closes the position each filled account opened, every account at once, and reports each account: closed, not_found, rejected, unresolved or skipped. It needs an Idempotency-Key and the trading:reduce scope; accountIds closes only some accounts. Also as the MCP tool close_multi_account_order. Closing what it opened.

  • Retry the accounts a multi-account order did not reach. POST /v1/execution-waves/{id}/retry places a new multi-account order for the skipped accounts (add rejected with include), with the same market, side, per-account volumes, stops and comment. The two are linked by retryOf and retriedBy. New error codes WAVE_NOT_ENDED and NOTHING_TO_RETRY. Retrying.

  • Partial fills in multi-account orders. Each account now shows filledVolume and partiallyFilled, and summary.partiallyFilled counts the filled accounts that filled only in part. A partly filled account is still filled.

  • More error codes documented. Errors now lists the codes you can meet when signing in to the console (a wrong email or password, a wrong or reused two-factor code, a pause after too many codes, suspended access, closed sign-ups), when confirming your email address, when connecting or disconnecting an app such as Claude, and on support tickets. It also lists CHECKOUT_BUSY and PAYMENT_CONFIRMING (a payment already being set up, or already paid and being confirmed: don't pay twice) and the MCP tools' INSTRUMENT_NOT_MAPPED. Accounts now lists every problem.code with what to do about it. No API change.

  • Easier to find your way around the docs. The API reference sidebar now lists every section, including Instruments, Market data, Copy trading, Alerts, Webhooks and Events. Links to the market-data reference pages are fixed. The guides index has cards for the read-only connector and the Claude plugin, whose skill-upload steps now match Claude's current menus. Code samples use server names from several brokers. No API change.

2026-11-01

  • New guides. Quotes and recent candles covers live quotes by REST and up to 1,000 recent bars from the account's broker, and what is not offered (no stream, no tick history, no deep archive). n8n without an EA shows the HTTP Request templates and how to keep an n8n retry from placing a second order. Native MCP versus hosted MCP compares the terminal's own MCP with the hosted server. No API change.
  • Updated guides. Security has a table of what each credential can do. Linux and macOS maps what works from a Mac or Linux machine, including quotes and candles. Migrate from MetaApi now describes quotes and recent candles, Webhooks links each endpoint's reference page, and the API reference opens with a list of every endpoint. No API change.

2026-10-29

  • Unread support replies. The console's Support item now shows a count when a ticket has a staff reply you have not opened yet — emailed or not — and your ticket list bolds and dots those tickets. It is tracked per member, so it follows you across devices, and clears the moment you open the ticket. No API change.

  • Support replies are formatted. Our answers to a support ticket now show headings, lists, links and code in the console's Support page and in the email, which comes from "fxapis support" with the ticket's reference in the subject (for example [#4DE4690E]), a "View this conversation" button back to the ticket, and replies to it going to [email protected]. The reference also shows on the ticket's page. No API change.

  • Price history is available now. GET /v1/accounts/{id}/candles and the MCP get_price_history tool (on /mcp and /mcp/insights) no longer wait on a maintenance window — every account's terminal now supports it. An account whose terminal has not been updated yet, which should be rare, still answers 501 CAPABILITY_UNAVAILABLE. No API change.

  • An account that cannot reconnect says what to do. When an account's terminal loses its connection and cannot get it back, the account reaches a state that says what to do:

    • a login the broker refuses again after it had worked becomes invalid_credentials (problem LOGIN_REFUSED), with a detail saying what to check — the trading (not investor) password, and the server the login was opened on; brokers also delete demo accounts after a while. It is not retried until you enter the password again;
    • a terminal that stopped and could not reconnect goes offline with the reason. Always-on accounts are restarted automatically, waiting a little longer each time if the terminal keeps stopping before it is ready; other accounts come back at their next order or when you bring them online;
    • a login that has never connected and whose server never answered goes to error (problem CONNECTION_FAILED), naming the broker's other servers to switch to. It is not retried on its own; bring it online to try again.

    Each of these shows in the console's alerts with the same detail. No API change.

2026-10-28

  • A webhook endpoint can't point at fxapis itself. POST /v1/webhooks and PATCH /v1/webhooks/{id} refuse a URL on fxapis.com or any of its subdomains (400 INVALID_REQUEST), with a message saying what to enter instead — for n8n, the Production URL of your Webhook node. Events sent there could only fail.

2026-10-27

  • filledPrice waits for the broker's price. Some brokers report no price when a market order fills. The order's filledPrice is then null until the real price is known, and is filled in from the broker's deal or from the position the order opened, usually within a few minutes.
  • MCP servers ask for sign-in first. https://api.fxapis.com/mcp and /mcp/insights now ask you to sign in before anything else, so Claude shows Sign in now when you add fxapis as a custom connector, and the first sign-in asks for read access only. Connections you already have, and agents that use an API key, are unaffected. Clients that listed the tools without signing in now get a sign-in prompt (401) first. Steps: MCP server.
  • Paying from a phone. The checkout and billing's "Update card and pay" were reworked for phones and tablets: the Pay button stays pinned in reach, fits the screen and has the terms right under it; your bank's 3-D Secure check fills only the visible part of the screen (its own buttons are no longer hidden under the browser bar) and has a "Cancel / try again" way out; a yearly price reads "$90/year", not per month; on a trial, billing starts with a "Pay for" button for the plan you are trying (e.g. "Pay for Production — $99/month"), and the console banner's "Keep Production" opens its checkout; invoices show as a list on phones with the amount and status in view; fields no longer zoom on iPhone, and buttons are at least 44 px tall. No API change.

2026-10-26

  • Docs in Spanish. The getting-started path and the reference guides are now also in Spanish, under /es: the overview, quickstart, SDKs, authentication, accounts, trading, instruments, errors and security, and the guides to connecting accounts, broker compatibility, Linux and macOS, idempotent orders, TradingView alerts, the MCP server, the read-only connector and the Claude plugin. Each page has a language switch, and pages not yet translated show the English text. The API reference and this changelog stay in English. A Spanish index for language models is at /es/llms.txt. No API change.
  • Broker compatibility page. A new guide, Broker compatibility, says what fxapis works with (any MT5 broker or prop firm, demo or live), what you need to connect, how the server search works, and what varies by broker. Linked from the console's connect form. No API change.
  • A free trial of the plan you pick. Every plan card on the pricing page starts a 14-day free trial of that plan: its features and limits (accounts, executions, webhooks and event history, copy trading), demo accounts only, no card. Signing up without picking one tries Production; Enterprise is not trialled. The console banner and the reminder emails name the plan; paying for it keeps it and lets live accounts connect, and a trial that ends unpaid leaves no plan. Trials already running finish as they are. GET /v1/billing/usage names it (planName, e.g. "Production trial"); plan stays trial. No other API change. Demo accounts on a trial of a plan are capped at 5, whatever the plan's own allowance: Personal's trial is unaffected (2), Production's and Business's are now 5 instead of 7 and 260. Trials already running are held to the same cap from today; paying for the plan still unlocks its full allowance.
  • No free plans. Free and Personal Demo are no longer offered: the free thing is the 14-day trial a new workspace gets. A trial that ends without a plan now leaves the workspace with no plan (closing positions and cancelling orders always work), not on Free. Workspaces already on Free keep it for 30 days after we email them the date, with a console banner saying when it ends. No API change.
  • Connect an account from the console. Owners and admins can connect an MT5 account on the Accounts page (Connect an account): pick the broker server from a search, enter the login and trading password, an optional label and the mode. No API key is needed. It is the same POST /v1/accounts, with the same plan limits and errors; the account is brought online and its page shows it connecting. No API change.
  • Price history (candles). GET /v1/accounts/{id}/candles returns open, high, low and close bars with tick volume and spread for one symbol or instrument from the account's own broker: timeframes M1 to MN1, up to 1,000 bars, times in UTC. The MCP servers (/mcp and the read-only /mcp/insights) gain get_price_history, so Claude and ChatGPT can analyse recent price action, for example XAUUSD on H1. Until the maintenance of 2026-10-29 it answered 501 CAPABILITY_UNAVAILABLE; it is available now (see 2026-10-29).

2026-10-25

  • Personal and Personal Demo. Two plans for trading with Claude and ChatGPT on your own MT5 account: Personal ($9 a month or $90 a year: one live and one demo account, 1,000 opening executions a month, always-on +$12) and Personal Demo (free: one demo account, 200 a month). One per person, owner only. New error code PERSONAL_PLAN_USED (409).
  • Connector calls keep a terminal up. On every plan, a call from Claude, ChatGPT or another MCP client that reads an account (or the workspace, while the account's terminal runs) now counts as use, like an order. A warm-on-demand terminal stays up while an assistant is reading it, rather than stopping after 15 minutes with no orders. No API change.
  • Clearer quota message. On plans that do not bill overage, QUOTA_EXCEEDED now says opening executions are refused until the 1st (UTC). The code is unchanged.
  • Every marketing page as Markdown. fxapis.com pages are now also served as Markdown at the page's URL followed by .md (/index.md for the home page), and to any client that asks for Accept: text/markdown. The docs already did this (.mdx). No API change.
  • MCP server card. The hosted MCP server describes itself at https://api.fxapis.com/mcp/server-card and /.well-known/mcp/server-cards.json (SEP-2127). No API change.

2026-10-23

  • New error code NO_PRICE (422) for orders the broker cannot price. When the account's broker has no current price for the symbol (its market is closed, or this broker does not offer it), the order is now answered 422 NO_PRICE instead of 503 SEND_FAILED. Nothing was sent, as before. SEND_FAILED meant "retry now", which could not help here. Retry once the symbol is quoting; the same Idempotency-Key may be reused. The SDKs no longer retry these on their own. Copy trading records them as market_closed.
  • Support from the console. A new Support page in the console lets anyone signed in to a workspace open a ticket and follow the conversation. We answer there and by email. If a card payment fails at checkout or when updating a card, the message links to it. No API change.

2026-10-22

  • A server name MetaTrader cannot find is reported as such. The account goes to error with problem.code SERVER_NOT_FOUND, and the console's alert bell says "The broker server could not be found", naming the server. Check the exact server name in the broker's welcome email or MetaTrader's File → Login dialog, then update the account. We stop its terminal until you do, and an always-on account is not retried meanwhile. No API change.
  • More broker servers in the server search. About 820 MT5 servers of widely used brokers and prop firms (IC Markets, Pepperstone, Exness, XM, HFM, Vantage, VT Markets, Bybit, FTMO, The5ers, Deriv and more) are now offered as you type, by their exact names.

2026-10-20

  • Always-on accounts come back by themselves. If an always-on account's terminal stops — after maintenance, a crash or a start that failed — it is brought back online within minutes, with no call from you. A refused login, a second factor, a certificate or trading disabled at the broker still waits for you: retrying those is how a broker locks an account.
  • When the problem is ours, accounts say so. If accounts cannot come online because of a problem on our side, an account on its way online carries problem.code PLATFORM_ISSUE with no actions, and a failed POST /v1/accounts/{id}/warm says the same: your login is fine and retrying will not help. status.fxapis.com has updates.
  • An account coming online says starting. A new account you bring online now shows starting instead of staying created, and if its terminal stops before it is ready it shows offline with the reason.
  • The status page's Trading engine reflects whether accounts can come online, not only whether our servers are running.
  • New billing:read scope. Reading the subscription, invoices, usage charges, agreement, standing and daily usage now needs billing:read. Keys made before 21 October 2026 that hold accounts:read keep reading them. See Authentication.
  • Checkout and coupon limits. Starting a checkout is limited to 5 per workspace and 10 per owner's email a day (429 CHECKOUT_LIMIT), and a coupon is not redeemed while a card payment for a plan is being set up (409 CHECKOUT_PENDING).
  • Copy trading (coming soon): resetting a subscription that was paused when it stopped returns it to paused, and the copy.subscription_stopped event lists every reason a subscription can stop.

2026-10-17

  • Card payments show up straight away, even if you close the checkout. Opening billing or a checkout page now checks your card payment with our payment provider, and we check by ourselves every few minutes while a new plan waits for its first payment. Every renewal that goes through appears in your invoices, with a receipt by email. Console only; no API change.
  • Confirm a usage charge with your bank, in the console. If your bank asks you to confirm a month-end usage charge (3-D Secure), you get an email and a notice on every console page, and you confirm it on Billing — your bank's check opens over the page, and nothing is charged until you confirm.
  • Pay with another card when a renewal fails. If your card is declined at renewal, your plan stays on while we retry it, and Billing now shows Update card and pay: enter another card on the page (your bank's check, if any, opens over it) and it pays for your plan from today and renews it from then on. We cancel the renewal that failed, and if the old card is still charged for it, that charge is refunded automatically. The email about the failed payment and a notice in the console point you there.
  • Your trial, on every console page. While your trial runs, a banner shows the days left and when it ends, with Choose a plan (members who are not the owner are asked to ask the owner). You can hide it for the rest of the day, except in the last three days. We also email you a week, three days and a day before the trial ends, as well as when it has ended.
  • What an ended trial or plan means, said plainly. Once a trial ends, every console page says so: opening new trades is paused until a plan is chosen, open positions can still be closed and orders cancelled, and your accounts, keys, history and settings are kept — with Start your membership. A paid plan that ended says the same with Choose a plan. These notices can be hidden for a day at a time.
  • Always-on accounts follow the plan. When a trial ends, or a plan ends or changes to one without always-on accounts, those accounts are switched to warm_on_demand: they connect when an order needs them and go offline when idle. We tell you by email (the trial-ended email lists them) and in the console. A copy-trading strategy's master is switched too, and goes offline when idle like any account, so its strategy copies nothing until a plan with always-on accounts and copy trading is chosen and the account is switched back to always_on. Each switch is listed in the account's events (GET /v1/accounts/{id}/events) as "Connection mode changed".
  • Card payments: Visa and Mastercard. The checkout no longer lists Amex, which our card provider does not take. Plans are paid by card for now.
  • Starter and Scale are no longer sold. They were replaced by Production and Business, and checkout now refuses them by name too: POST /v1/billing/checkout answers PLAN_NOT_PURCHASABLE for them, as a new purchase, a change of plan or a payment for the plan you are on. A workspace already on Starter or Scale keeps it, and its card keeps renewing it, until it changes to a plan from GET /v1/plans.
  • Unbilled usage grows with what you've paid. On a per-account plan, usage beyond the plan's price — extra accounts, always-on accounts and extra followers — is billed after the month. How much of it a workspace can run at once is the plan's price a month ($99 on Production), plus what it has paid in renewals and usage charges in the last 90 days, so it grows as payments go through. Connecting, reconnecting or switching an account to always_on, or subscribing, resuming or resetting a copy-trading follower, past it answers 402 CREDIT_LIMIT with the limit in plain words; nothing you already run is changed. Changing to a plan that would leave you above its limit answers 409 REDUCE_USAGE_FIRST, saying what to switch off or disconnect first; if you add usage between starting the change and paying for it, always-on accounts are switched to warm_on_demand until you are within the new limit, and we email you which. GET /v1/plans shows each plan's pricing.creditLimit.
  • An unpaid usage charge pauses opening, never closing. If a month's usage charge still can't be collected after a week of daily retries (or isn't confirmed with your bank within a month), opening orders, multi-account orders, connecting new accounts and switching to always_on answer 402 PAYMENT_OVERDUE until it's paid. Closing positions, cancelling orders and moving stops always work, a disconnected account can still be reconnected to close what it holds, and your plan, accounts and history are kept. We email you, every console page says so, and Billing has Try the card again (up to 3 times an hour); opening resumes as soon as the charge is paid.

2026-10-16

  • Managed copy trading. Mark an always-on account as a strategy and subscribe followers in the same workspace: fxapis copies opens, closes, partial closes and stop moves, server-side, about every second. Five sizing modes, reversal, symbol filters and mapping, lateness and price limits, risk limits that stop a subscription (and can close its positions), a drift check, and a log of every copy with its reason. /v1/copy/strategies, /v1/copy/subscriptions, /v1/copy/executions; in both SDKs; and Copy trading in the console. Hedging accounts only.
    • Copying is coming soon. Until it starts, making a strategy, subscribing, resuming and reset answer 503 COPY_TRADING_PAUSED; reading, settings, pausing and deleting work, nothing is copied and no follower is billed. GET /v1/copy/status says whether copy trading is paused.
    • Webhooks: copy.executed, copy.skipped, copy.failed, copy.subscription_stopped, copy.drift_corrected, copy.master_disconnected.
    • Plans: on Trial (3 followers), Production ($8 a follower a month) and Business (25 included, then $6); Enterprise by agreement. Followers are billed by the day.
    • Multi-account orders made by copy trading appear in GET /v1/execution-waves, labelled Copy: <strategy>.
    • See Copy trading.
  • SDKs. TypeScript SDK 0.3.0 and Python SDK 0.2.0 add the copy trading client.
  • Connect Claude and ChatGPT by signing in. The MCP server (https://api.fxapis.com/mcp) now takes sign-in (OAuth 2.1 with PKCE) as well as API keys.
    • Add it to claude.ai, Claude Desktop, Claude Code or ChatGPT developer mode, and choose read-only, or trading on the accounts you pick. Trading needs two-factor turned on — your session already proved it at sign-in, so there is no code to enter on the consent screen.
    • Everything a connected app changes — opening, closing, stops, cancelling, bringing online and taking offline — is limited to the accounts you pick; it can still read every account. A write on another account answers 403 KEY_LIMIT_EXCEEDED. API keys are unchanged: their accountIds limits only what they open.
    • Every connected app is listed on the API keys page, and revoked there at once.
    • tools/list now answers without a credential. A tool call without one gets 401 with a WWW-Authenticate challenge that points at /.well-known/oauth-protected-resource/mcp.
    • No /v1 endpoint changed: connected apps are managed in the console, so there is no SDK change.
    • See MCP server.
  • MCP tool results are smaller.
    • The data comes once, as compact JSON, beside a one-line summary.
    • Read tools take response_format (concise by default, or detailed).
    • list_accounts, list_positions, list_account_instruments (now with query) and list_multi_account_orders page with limit and cursor.
    • Every list now answers { items, next_cursor, total } in place of accounts, positions, orders and so on.
    • Two new tools answer a whole question at once: get_account_overview and get_symbol_snapshot.
  • A read-only connector, https://api.fxapis.com/mcp/insights, for the Claude and ChatGPT directories. See Read-only connector.
  • A Claude Code plugin and a skill. /plugin marketplace add FXapis/fxapis-claude-plugins. See Claude plugin and skill.
  • Account alerts in the console. A bell on every console page counts the accounts that need you (a refused login, two-factor, a certificate, trading disabled, or an error lasting over two minutes), and Notifications lists them with the fix. They close by themselves when the account recovers. In-app only; no API change.
  • Live prices and figures on every account. Live prices, fresh figures and the position ticket from the fill are now available for every online account (figures refresh every 15 s; credit and profit filled).
  • Pending orders that trigger move to filled. A limit or stop order that fills at the broker moves to filled (or partially_filled) once its fill deal or its position is seen, with brokerPositionId, and sends one order.filled webhook with previousState: "working". filledPrice and filledVolume are null when only a netting position is known, until the fill deal arrives.
  • A member's step-up now lasts two hours, up from ten minutes. Creating an API key asks you to confirm it's you only when the key can move money or accounts (trading:execute, trading:reduce or accounts:write) — a read-only key, or one that only manages webhooks, is created without one. Re-scoping or re-limiting an existing key asks only when it widens the key to one of those scopes or changes the limits on a key that already has them; narrowing scopes and renaming never ask.

2026-10-15

  • Balance, equity and margin. Every account response carries balance, equity, margin, freeMargin, marginLevel, credit, profit and figuresObservedAt, as decimal strings, read from the account's terminal while it is online — every 60 seconds at first, every 15 seconds once the account's terminal had its update (now every account — see 2026-10-16).
    • GET /v1/accounts/{id}/figures answers them alone; ?fresh=true asks the terminal now. At first, fresh=true answered 501 CAPABILITY_UNAVAILABLE until your account's terminal was updated (now live for every account), and 409 ACCOUNT_NOT_READY unless the account is ready.
    • credit and profit were null until the terminal was updated (now filled for every account).
    • marginLevel is null while no margin is used.
    • marginMode now reads netting or hedging, in the API and in webhooks (where it is usually null for now).
    • Webhooks do not carry figures.
  • Live prices. GET /v1/accounts/{id}/quotes answers up to 20 broker symbols or instruments, from the account's own broker. At first it returned 501 CAPABILITY_UNAVAILABLE until your account's terminal was updated (now live for every account).
    • Each quote carries time, brokerTime, ageMs, marketOpen, stale (only while open and over 60 s old) and tradeMode. A closed market answers its last price.
    • Calls that reach an account's terminal (live quotes and fresh figures) are limited to 300 a minute + 50 per account, across every caller; shared and cached answers are free. Past that: 429 RATE_LIMITED with retry-after.
  • Stop checks use live prices. When a quote was read for the account recently, an order's stops are checked against it: the ask for a buy, the bid for a sell. Otherwise an open position's price, as before. The order never waits for a price.
  • The position an order opened. An opening order now carries brokerPositionId, the ticket to close it by — pending orders that fill later included. It is linked from the broker's positions and deals, usually within a few minutes; once your account's terminal is updated, it is set from the fill itself (now true for every account). Closes and stop changes are unchanged.
  • SDKs. The TypeScript SDK has getAccountsByIdFigures and getAccountsByIdQuotes. The Python SDK has client.accounts.figures(…), client.quotes.get(…) and CapabilityUnavailableError.
  • MCP. Two new tools: get_account_figures and get_quotes.
  • Admin keys. The workspace owner can make an admin key (fx_admin_…) in the console. It manages the workspace's API keys and nothing else, so issuing and rotating keys can be automated.
    • An IP allowlist and an expiry are optional.
    • At most five can be active.
    • Other /v1 routes answer 403 ADMIN_KEY_NOT_ALLOWED; routes outside /v1, including /mcp, answer 401 UNAUTHENTICATED.
    • An owner's admin keys are revoked when the owner is suspended or moved to another role. The keys those admin keys made keep working.
    • The owner is emailed whenever one is made or revoked.
  • Ordinary keys can no longer call /v1/api-keys (403 ADMIN_KEY_REQUIRED). This includes keys holding admin. Use an admin key instead, or the console, which is unchanged.
  • Workspace management left the SDKs. The member and invitation endpoints are console-only. The API reference now says so, and they are no longer in the SDKs or the Postman collection.
  • TypeScript SDK 0.2.0 removes those methods and moves key management to fx.admin.keys (list, create, get, update, revoke). It needs an admin key.
  • Python SDK 0.1.6 adds client.admin.keys.
  • Console sessions last seven days and end after a day unused, and are no longer extended by use. Anyone signed in for more than seven days when this shipped signs in again once.
  • Confirm it's you before sensitive changes. Making a key or changing its scopes or limits, inviting, changing roles or removing people, and plan or payment changes ask for your authenticator code (or password, without two-factor) if you have not given it in the last ten minutes: 403 STEP_UP_REQUIRED. API keys are not affected.
  • See and end your sessions, and change your password, under Security in the console. A changed password always signs every other session out.
  • Removing or suspending a member revokes the API keys they made, and the owner is emailed the list. API keys now show who made them (createdBy).
  • Demoting an admin to member revokes the API keys they made, audited and emailed to the owner the same way. PATCH /v1/members/{id} returns keysRevoked, and GET /v1/members shows each person's keysCreated.
  • Two-factor belongs to the session. Turning it on or off, or new backup codes, sign out every other session; turning it off needs the current code. Lost your phone? A backup code stands in for the code wherever one is asked for — signing in, confirming it's you, turning two-factor off — once each.

2026-10-14

  • Catch up after downtime with the event list. GET /v1/events?after=<last listed id> returns every event after the last one you read from the list, oldest first, exactly as webhooks deliver them — so a client that was down catches up by itself. Filter by type, account_id, time, or delivery_status=failed. Events are kept 7 days on Production, 30 on Business, 90 on Enterprise; reading needs history:read. See Catch up after downtime.
  • Replay what an endpoint missed. POST /v1/webhooks/{id}/replay (or Replay events in the console) sends only the events an endpoint did not receive — given up on, or recorded while it was off. include: "all" re-sends everything in the window. A paused or switched-off endpoint now keeps its waiting deliveries and resumes them when turned back on.
  • Webhook delivery logs in full, kept 30 days on every plan: each attempt's request as sent and your endpoint's answer; GET /v1/webhooks/{id}/deliveries/{deliveryId}.
  • Kinder retries. Retries are spread out, honour Retry-After, and 410 Gone switches an endpoint off at once. One slow endpoint no longer delays anyone else's deliveries.
  • Python SDK. Adds events.list/iter/get and webhooks.deliveries/delivery/replay.
  • API key limits. A key can carry a maximum lot size per order, the symbols or instruments it may open, the accounts it may open on, and a number of opening orders per UTC day — enforced on every opening order the key places, including multi-account orders, TradingView hooks it created and MCP. A refusal is 403 KEY_LIMIT_EXCEEDED. Closing is never limited. See Limits.
  • Revoking a key stops what it set up. Its multi-account orders not yet sent are abandoned, and TradingView hooks it created stop trading. A multi-account order counts toward a key's daily limit on the day it was made, once.
  • Multi-account orders take an instrument. Send instrument (e.g. XAUUSD) instead of symbol and each account trades its own broker's symbol for it, shown on each leg as legs[].symbol. If any account cannot trade it, the order is refused whole with 422 INSTRUMENT_UNAVAILABLE. The MCP place_multi_account_order tool takes instrument too, and the Python SDK's waves.create(instrument=...). See multi-account orders.

2026-10-11

  • The SDKs check webhook signatures. fxapis 0.1.4 on npm adds verifyWebhook(), which checks a delivery's fxapis-signature header and returns the event, and a method for every /v1/webhooks endpoint. fxapis 0.1.3 on PyPI adds fxapis.webhooks.verify(). See SDKs and verifying the signature.
  • Webhooks have their own section in the API reference and in the Postman collection.

2026-10-08

  • Webhooks. Register an HTTPS endpoint and get a signed POST when an order fills, is rejected, goes unresolved or is resolved, a pending order is cancelled, a position opens or closes, an account changes state, or a multi-account order finishes. Retried over about 44.6 hours (jittered), with a delivery log, redelivery and secret rotation. An endpoint is switched off only after 20 failures in a row spanning at least 15 minutes, and the workspace owner is emailed. See Webhooks.
  • Multi-account orders take up to 1,000 accounts in one request, within your plan's limit (Business 1,000, Production 250). It was 500.
  • Stops on new orders are checked for direction. A stop loss past its take profit, or a pending order's stops on the wrong side of its own price, is refused with 400 INVALID_REQUEST before anything is sent; a market order's stops are also checked against a recent market price when there is one.
  • A partial close that would leave less than the symbol's minimum is refused before anything is sent, instead of leaving a remainder too small to trade.
  • Idempotency keys are released after 24 hours. A key reused after its window starts a new order instead of replaying the old one.
  • An order's deals are listed for every order, not only for one that was settled from unknown: GET /v1/orders/{id}/deals and each deal's orderId now cover normal fills too.
  • A body that is not valid JSON answers 400 INVALID_REQUEST, like every other bad request, instead of a framework error code.

2026-10-07

  • Broker server search. GET /v1/brokers/servers?q= finds the exact MT5 server name for a broker as someone types, including brokers no account here has used yet. See Accounts.
  • Accounts say what is wrong and how to fix it. An account's problem gives the cause, likely servers (otherServers) and the actions that fix it; GET /v1/accounts/{id}/events lists what happened to it; and POST /v1/accounts/{id}/server moves an account added under the wrong server name, trying the stored password there.

2026-10-06

  • New plans. New workspaces start a 14-day trial with demo accounts. The plans on sale are Production and Business, billed monthly or yearly, and Enterprise by agreement — see pricing. On a trial, 402 DEMO_ONLY and 402 TRIAL_ACCOUNT_USED can answer a connect.

2026-10-05

  • Two-factor sign-in for the console, with an authenticator app and backup codes.

2026-10-02

  • Instruments. Name a market once with instrument on an order, and each account trades its own broker's symbol for it. GET /v1/instruments lists them; GET /v1/accounts/{id}/instruments shows how each maps on an account. See Instruments.
  • Market hours. GET /v1/accounts/{id}/sessions: whether a market is open now on an account's broker, and its weekly sessions.
  • Failures of ours answer 503, not 502 — the codes (SEND_FAILED, ORDER_UNRESOLVED, …) are unchanged; retry by code, not status. A broker refusal carrying its return code (market closed, no money, a requote) is now ORDER_REJECTED, not ORDER_UNRESOLVED.
  • Order comments fit MT5. Order comments are cut to what MT5 accepts.

2026-10-01

  • DELETE /v1/accounts/{id}. Remove an account and its history. disconnect still erases the password and keeps the history.

2026-09-30

  • TradingView alerts. A hook URL per strategy turns alerts into MT5 orders. See TradingView.
  • A hosted MCP server at https://api.fxapis.com/mcp, for AI agents on a scoped key. See MCP.
  • /openapi.json. The API description, at api.fxapis.com/openapi.json.
  • Plan codes. The workspace owner redeems a plan code under Billing in the console, which puts the workspace on that plan for good, without payment.

2026-09-29

  • POST /v1/accounts/prepare. Bring up to 200 accounts online in one call, for signals and click-to-trade. See Signals and click-to-trade.
  • Idle accounts go offline on their own. A warm_on_demand account now goes offline after a quiet period with no orders.
  • GET /v1/workspace. Your workspace's plan, and whether trading is switched off.
  • API keys are issued as fx_live_… / fx_test_…. Keys issued as ow_… keep working exactly as issued.
  • New API address. The API is served at https://api.fxapis.com.

On this page