Binance API error -2010: NEW_ORDER_REJECTED and what msg says
Figures on this page are as of 2026-09. Fees, limits and margin tiers change — check the venue's own docs.
Binance error -2010 is NEW_ORDER_REJECTED, and its official message is
also just “NEW_ORDER_REJECTED”. The code is generic by design: Binance puts the
actual reason for the rejection in msg.
{ "code": -2010, "msg": "Account has insufficient balance for requested action." }
So the first rule for this error is a rule for your error handler: branch on
msg, not on code. The code tells you an order was refused. The message
tells you why, and the “why” decides whether retrying later could ever work.
What this error actually means
Binance’s Spot error list groups the messages that can accompany -2010 under
matching-engine messages, a table shared with -2011 (cancel rejected),
-1010 and -2038. That is the useful contrast with
-1013, which Binance describes as a rejection
before the request reached the matching engine. -1013 is about the shape of
your order against the symbol’s filters; -2010 is about whether this order can
be accepted for this account right now.
Either way, the order was refused. Nothing rests on the book. In the
classification from error handling patterns for trading APIs,
most -2010 reasons are conditional: the request is valid, but the
situation does not allow it. Retrying immediately fails again; retrying after
the situation changes may succeed.
One caution from Binance’s own error documentation: “Codes are universal, but
messages can vary.” Match on stable substrings rather than exact full strings,
and log any msg your handler does not recognise so it surfaces instead of
falling into a generic branch.
The usual cause: insufficient balance
“Account has insufficient balance for requested action.” — officially, not
enough funds. In practice it is the -2010 reason people meet most often.
The frustrating version is when you can see the funds. In practice, the gap between “the balance I see” and “the balance available to this order” comes from a few places:
- Funds already committed to your own open orders. A resting order reserves what it would need to execute. A strategy that leaves orders on the book is spending the same balance twice.
- Funds in a different account or wallet. The balance you are looking at is not the one this endpoint trades from.
- Selling more than arrived. After a buy, the amount that actually lands can be smaller than the amount ordered, depending on how fees were charged. Sell what the balance says, not what the original order said.
- Size computed from a stale price. A buy sized a while ago against a lower price can exceed what the quote balance now covers.
The fix is to read the available balance and the open orders at the moment of the rejection, not the balance you last cached.
Other messages, in order of likelihood
msg | Official description | What to do |
|---|---|---|
| “Duplicate order sent.” | The clOrdId is already in use | Reconcile — see below |
| “Order would immediately match and take.” | A LIMIT_MAKER order would trade immediately | Reprice, or accept that it will be a taker order |
| “Order would trigger immediately.” | Stop price not valid relative to the last traded price | Recompute the stop against the current last price |
| “Market is closed.” | The symbol is not trading | Check the symbol’s status; do not retry in a loop |
| “This symbol is not permitted for this account.” | Account and symbol permissions differ | Account-level; not a code fix |
| “Rest API trading is not enabled.” | Server not configured for TRADE endpoints | Not fixable from your request |
“Duplicate order sent.” deserves the most care, because it usually appears
at the worst moment. Binance documents newClientOrderId as “a unique id among
open orders”, so this message means an order with your client ID is currently
open. If you are seeing it on a retry after a timeout, that is information, not
an obstacle: your first attempt landed and is resting. Do not generate a
fresh ID to get the order through — that is how a position doubles. Query the
order, then decide. The reasoning, and why the same ID would be accepted once
the original fills, is in
retrying a failed order is not safe
and what is a client order ID.
“Order would immediately match and take.” is post-only behaving as
designed: a LIMIT_MAKER order is refused rather than allowed to take
liquidity. See what is a post-only order.
“Order would trigger immediately.” usually means the stop is on the wrong side of the market by the time it arrived — computed from an older price, or with the direction inverted.
“This symbol is not permitted for this account.” looks like a permissions
error but it is not about your API key. A key missing a permission is
-2015. This message is about the account and
the symbol.
Futures: same code, different surroundings
USDⓈ-M futures also lists -2010 NEW_ORDER_REJECTED. The matching-engine
message table above comes from Binance’s Spot error list; we did not find the
same table on the futures error page, so do not assume futures returns the same
msg strings.
Futures also reports several things as dedicated codes that a Spot developer
might expect under -2010: insufficient margin is
-2019, a position side that does not
match the account’s mode is -4061, and an order below minimum notional is
-4164. A futures handler should treat
those codes as first-class rather than waiting for them under -2010.
How to confirm which one you have
- Log the full body. The
msgis the diagnosis; the code alone is not. - For balance messages, query balances and open orders immediately after the rejection, and compare the order’s cost against the available amount.
- For a duplicate, query the order by the client ID you sent. If it exists, you are reconciling, not retrying.
- For trigger and maker messages, log the last traded price you computed against, next to the price you sent.
- For “Market is closed.” or symbol-permission messages, stop the strategy for that symbol and alert. Neither is resolved by trying again.
FAQ
What does Binance error -2010 mean?
NEW_ORDER_REJECTED — Binance refused a new order. The code is generic, and the
specific reason is in the msg field, most often “Account has insufficient
balance for requested action.” Other messages cover duplicate client order IDs,
post-only orders that would take, stops that would trigger immediately and
symbols that are not trading.
Why does Binance say insufficient balance when I have funds?
Usually because the funds are not available to this order. Balance reserved by your own open orders, funds held in a different account or wallet, or a sell quantity larger than what actually arrived after fees all produce this message. Check available balance and open orders at the moment of the rejection.
Is it safe to retry after -2010?
Not immediately and not unchanged. -2010 is a refusal, so the same request
fails again until the condition changes. After a timeout, a “Duplicate order
sent.” message means your original order is open; query it before sending
anything, and never swap in a new client order ID to force the retry through.
What does “Duplicate order sent.” mean on Binance?
An order with the same client order ID is currently open. Binance documents
newClientOrderId as unique among open orders only, so the duplicate is refused
while the original rests. If it follows a timeout, it tells you the first
attempt succeeded.