Binance API error -1121: Invalid symbol, and finding the mismatch
Figures on this page are as of 2026-09. Fees, limits and margin tiers change — check the venue's own docs.
Binance error -1121 is BAD_SYMBOL: “Invalid symbol.” It is the example
Binance itself uses to show what an error response looks like:
{ "code": -1121, "msg": "Invalid symbol." }
It means the symbol string you sent is not one that the API you called recognises. Those last words carry most of the diagnosis. Binance Spot and USDⓈ-M futures are separate products with separate hosts and separate symbol lists, and each test environment has its own list too. A symbol can be real, tradable, and still invalid on the host you sent it to.
What this error actually means
-1121 is a lookup failure on a string. It is worth separating from two
messages that sound similar but mean something different:
| What you see | What it means |
|---|---|
-1121 “Invalid symbol.” | The API does not recognise the symbol at all |
| “This symbol is not permitted for this account.” | The symbol exists; your account may not trade it |
| “Market is closed.” | The symbol exists; it is not trading right now |
The second and third are matching-engine messages that come back under order
rejection codes such as -2010, not under
-1121. So if you have -1121, stop looking at account settings and trading
status. The string, or the place you sent it, is wrong.
It is also a permanent error in the sense used in error handling patterns for trading APIs: sending the same request again produces the same answer. Do not retry it.
The usual cause: the string is not Binance’s form of the symbol
In practice, most -1121 errors are formatting. Binance’s symbols are the
names listed in exchangeInfo, and the request has to match one exactly. The
common ways to miss:
- A separator. A slash or hyphen between base and quote, carried over from another venue, a charting tool, or a library that normalises symbols across exchanges. Libraries of that kind typically display one form and send another; if you build raw requests yourself, use Binance’s form, not the display form.
- Case. The symbol in a different case from the listed name.
- The wrong quote asset. The pair you mean may be listed against a different quote currency from the one you typed.
- Stray characters. Whitespace or a newline from a config file or user input.
Nothing about these is hard to fix. The difficulty is noticing, because
BTC/USDT and BTCUSDT read as the same thing to a person.
Other causes, in order of likelihood
1. The right symbol on the wrong product. Spot and USDⓈ-M futures are different APIs on different hosts:
| Product | Production REST | Symbol list |
|---|---|---|
| Spot | https://api.binance.com | GET /api/v3/exchangeInfo |
| USDⓈ-M futures | https://fapi.binance.com | GET /fapi/v1/exchangeInfo |
A perpetual contract you trade on futures is not automatically a Spot pair, and a Spot pair is not automatically a futures contract. Code that shares one symbol list between the two clients will eventually send one to the other.
2. The right symbol in the wrong environment. Spot Testnet
(https://testnet.binance.vision/api), Spot Demo Mode
(https://demo-api.binance.com/api) and the futures testnet
(https://demo-fapi.binance.com) each have their own symbol lists. A symbol
that works in production is not guaranteed to exist in a test environment, or
the reverse. Check the list of the environment you are actually calling; see
Binance testnet API keys for how the Spot
environments differ.
3. A symbol that no longer exists. A delisted or renamed symbol that your cached list, config file or database still carries.
4. A symbol generated rather than looked up. A string built by concatenating a base and a quote asset in code, or proposed by a language model, is a guess about what the venue lists. Guesses fail. If a model is producing symbols in your setup, validate them against the list before anything reaches an order — see how LLM tool calls go wrong on orders.
How to confirm which one you have
One call settles it: fetch exchangeInfo from the same base URL that
returned the error, and search it for the exact string you sent.
GET https://api.binance.com/api/v3/exchangeInfo # Spot
GET https://fapi.binance.com/fapi/v1/exchangeInfo # USDⓈ-M futures
Then:
| Result | Meaning |
|---|---|
| Exact string found | The symbol is valid here. Check that the failing request really went to this host — two clients with different base URLs are a common cause |
| Found only with a different separator, case or quote | Formatting |
| Found only on the other product’s list | Wrong API |
| Not found on this environment but found in production | Environment |
| Not found anywhere | Delisted, renamed, or never existed |
exchangeInfo carries a request weight like every other endpoint, and Binance
meters weight per IP — so fetch it once, cache it, and validate against the
cache rather than calling it before every order. See
Binance API rate limits.
Prevention
Validate symbols at startup. Load the symbol list for each product and
environment you use, check every configured symbol against it, and refuse to
start if any are missing. That turns a runtime -1121 into a startup message
naming the bad symbol.
Keep one mapping layer. If your system uses its own symbol names, convert to Binance’s form in exactly one place, per product. Scattered conversions drift apart.
Log the host with the error. A -1121 log line that includes the base URL
answers the product and environment questions without further work.
FAQ
What does “Invalid symbol” mean on the Binance API?
It is error -1121, BAD_SYMBOL: the API you called does not recognise the
symbol string you sent. The usual causes are formatting — a separator, case, or
quote asset that does not match Binance’s listed name — or sending a valid
symbol to the wrong product or environment.
Why does a symbol work on Binance futures but not on spot?
Because they are separate APIs with separate symbol lists. Spot symbols are
listed by GET /api/v3/exchangeInfo on api.binance.com; USDⓈ-M futures
symbols by GET /fapi/v1/exchangeInfo on fapi.binance.com. A contract listed
on one is not automatically listed on the other.
Is -1121 the same as “This symbol is not permitted for this account”?
No. -1121 means the symbol is not recognised at all. “This symbol is not
permitted for this account.” is a matching-engine message returned with order
rejections, meaning the symbol exists but your account’s permissions and the
symbol’s differ. The first is a string problem; the second is an account
problem.
Should I retry a request that returned -1121?
No. The symbol string will be just as unrecognised on the next attempt.
Correct the symbol or the host it is sent to, and validate configured symbols
against the relevant exchangeInfo list at startup so the error cannot reach
a live order path.