A step-by-step guide to create a dedicated, isolated Binance sub-account with USDⓈ-M Futures and a locked-down API key for the trading bot. Please follow every step — the security settings matter.
~15 minutesDesktop browser recommendedYou'll hand back: API Key + Secret
What we're creating (and why)
A single API key that is:
HMAC / “System generated” type — not Ed25519. The bot signs with HMAC-SHA256; an Ed25519 key silently fails every request.
Futures + Read permissions only.
Withdrawals DISABLED — the bot never moves money out. Non-negotiable.
IP-restricted to the bot server only, so a leaked key is useless from anywhere else.
We use a sub-account so this is fully isolated from your main balance.
Before you start
A Binance account with identity verification (KYC) complete — required for sub-accounts.
Futures activated: go to Futures → USDⓈ-M and complete the one-time quiz/agreement if prompted.
The bot server IP address — get this from RJ (needed in Step E):
⚑ Bot server IP — fill this in before you start
Note Binance occasionally renames menus or moves things between app and web. If a label doesn't match exactly, find the nearest equivalent — the web version (binance.com on desktop) is the most reliable for sub-account & API management.
Choose Standard Sub Account (virtual email). Not “Managed” — that's for institutions.
Label it trading-bot and create it.
Note the sub-account's email from the list.
B Enable Futures on the sub-account
In Sub Account Management, find the new sub-account.
Open its permissions / settings (a “…” menu or a Permissions column).
Enable USDⓈ-M Futures for the sub-account; agree to terms if asked.
C Fund the sub-account's Futures wallet
Use Transfer (or “Asset → Transfer”) in Sub Account Management.
Transfer USDT: From Main account (Spot/Funding) → To the sub-account's USDⓈ-M Futures wallet.
Amount: whatever starting size RJ specifies. Start small for the first run.
Important Funds must land in the USDⓈ-M Futures wallet — not Spot, not Coin-M. If they go to Spot by mistake, do a second internal transfer Spot → USDⓈ-M Futures inside the sub-account.
D Create the API key on the sub-account
In Sub Account Management → the sub-account → API Management.
Click Create API.
Choose System generated (HMAC).
Label it bot; complete the 2FA prompts.
Copy the API Key and Secret Key immediately — the Secret is shown only once.
Do NOT pick Ed25519 / “Self-generated.” The bot only works with a System generated (HMAC) key. An Ed25519 key will fail every request.
Set the permissions exactly like this
Permission
Setting
Enable Reading
✅ ON
Enable Futures
✅ ON
Enable Spot & Margin Trading
❌ OFF
Enable Withdrawals
❌ OFF — never turn on
Permits Universal Transfer
❌ OFF
Enable Internal Transfer
❌ OFF
If “Enable Futures” is greyed out Step B isn't finished — enable futures on the sub-account first, then edit the key.
E Lock the API key to the bot's IP
On the key's settings, find IP access restrictions.
Select “Restrict access to trusted IPs only.”
Enter the bot server IP from the box at the top.
Save; re-confirm with 2FA if prompted.
Expected With Futures enabled, Binance requires an IP restriction — a futures key with no IP lock won't be allowed to trade.
F Send the credentials to RJ — securely
Send RJ three things:
The API Key
The API Secret
Confirmation: Futures + Read only, Withdrawals OFF, IP-locked to the bot server.
Never send these over plain email/SMS or a public channel. Use an end-to-end-encrypted message (e.g. Signal) or a password-manager share. The Secret can't be retrieved later — if lost, delete the key and make a new one.
Final checklist
Standard sub-account created, USDⓈ-M Futures enabled
USDT funded into the sub-account's USDⓈ-M Futures wallet
Every request rejected — recreate as System generated
Futures not enabled (sub-account or key)
Orders rejected
Wrong wallet funded (Spot, not USDⓈ-M Futures)
“Insufficient balance”
IP not whitelisted / wrong IP
-2015 Invalid API-key, IP, or permissions
Withdrawals left ON
Not a bot error — a security risk. Keep OFF.
Good to know The bot itself sets hedge mode, cross margin, and leverage on first start — the account just needs to be clean (no open positions/orders) the first time it connects, which a fresh sub-account is.