Set up any exchange in 5 minutes
Six step-by-step guides for connecting an exchange to WatchDog Bot. The flow is the same shape on every exchange: generate an API key with trade permissions but no withdrawal permission, copy the credentials, paste them into WatchDog Bot's Connection settings. Verify with a balance check.
Universal security rule: Always disable withdrawal permissions on any API key you give to a bot. Bots should be able to trade, but never able to move funds off the exchange. Every guide below highlights how to do this for that specific venue.
Kalshi Prediction markets · RSA-PSS
Kalshi is unique in that it uses RSA-signed requests rather than HMAC. You'll download a private key file in addition to your access key.
- Log into kalshi.com and complete KYC if you haven't already.
- Click your profile icon → API Keys.
- Click Generate New Key. You'll get an
access-keystring AND be prompted to download aprivate_key.pemfile. - Save the private key file in a secure location — Kalshi only shows it once, and it can't be re-downloaded.
- In WatchDog Bot: Settings → API Connections → Add Connection → Kalshi.
- Paste the access key. Upload the
private_key.pemfile. Name the connection (e.g., "Kalshi" or "MyKalshi"). - Click Save.
Test it with this minimal bot:
import wd
from kalshi_client import KalshiClient
conn = wd.connection("Kalshi")
client = KalshiClient(conn.api_key, conn.api_secret_path)
balance = client.get("/portfolio/balance")
wd.log.info("Kalshi balance: %s cents", balance.get("balance"))
If you see your balance in the dashboard logs, you're connected.
Permissions: Kalshi keys default to "trade only" — they can't withdraw funds. You don't need to disable anything. But keep the private key file as safe as a password — anyone with both the access key and the .pem can place orders on your behalf.
Binance Crypto · HMAC
- Log into binance.com (or binance.us if you're a US resident).
- Click your profile icon → API Management.
- Click Create API. You may be asked to verify with 2FA.
- Name the key (e.g., "WatchDog Bot"). Binance gives you an API key + secret.
- Copy the secret immediately — Binance only shows it once.
- Edit the key's permissions: enable "Spot & Margin Trading", disable "Enable Withdrawals". If you need futures, also enable "Futures".
- Optional but recommended: restrict the key to your specific IP under IP Access Restrictions.
- In WatchDog Bot: Settings → API Connections → Add Connection → Binance.
- Paste the API key and secret. Name the connection.
- Save.
Test:
import wd, ccxt
conn = wd.connection("Binance")
ex = ccxt.binance({"apiKey": conn.api_key, "secret": conn.api_secret})
balance = ex.fetch_balance()
wd.log.info("Total USDT balance: %s", balance["total"].get("USDT", 0))
Binance.US users: the API endpoint and the available markets are different from binance.com. Use ccxt.binanceus instead of ccxt.binance in your bot code.
Coinbase Crypto · HMAC
Coinbase Advanced Trade replaced the old Coinbase Pro API. The setup flow is now unified with your regular Coinbase account.
- Log into coinbase.com.
- Click your profile → Settings → API.
- Click + New API Key. Coinbase Advanced Trade uses RSA-style key pairs — you'll get a key name and a private key (PEM format).
- Set permissions: View accounts, Trade. Leave "Transfer" disabled — that's what controls withdrawals.
- Optionally pin the key to your IP under the IP allowlist.
- Download or copy the private key — Coinbase only shows it once.
- In WatchDog Bot: Settings → API Connections → Add Connection → Coinbase.
- Paste both the key name and the private key.
- Save.
Test:
import wd, ccxt
conn = wd.connection("Coinbase")
ex = ccxt.coinbase({"apiKey": conn.api_key, "secret": conn.api_secret})
balance = ex.fetch_balance()
wd.log.info("Total USD balance: $%.2f", balance["total"].get("USD", 0))
Kraken Crypto · HMAC
- Log into kraken.com.
- Click your username → Settings → API.
- Click Add Key.
- Permissions to enable: Query Funds, Query Open Orders & Trades, Query Closed Orders & Trades, Create & Modify Orders. Leave "Withdraw Funds" disabled.
- Click Generate Key. Kraken shows you a key and a private key (base64-encoded string).
- Copy both immediately — Kraken won't show the private key again.
- In WatchDog Bot: Settings → API Connections → Add Connection → Kraken.
- Paste the API key and private key. Name the connection.
- Save.
Test:
import wd, ccxt
conn = wd.connection("Kraken")
ex = ccxt.kraken({"apiKey": conn.api_key, "secret": conn.api_secret})
balance = ex.fetch_balance()
wd.log.info("USD balance: $%.2f", balance["total"].get("USD", 0))
Kraken Futures users: Kraken Futures (formerly Cryptofacilities) is a separate venue with separate API keys. Generate the futures key from Settings → Kraken Futures API on the futures.kraken.com domain. Add it to WatchDog Bot as a second connection named, e.g., "KrakenFutures".
Bybit Derivatives · HMAC
- Log into bybit.com.
- Hover your profile → Account & Security → API.
- Click Create New Key. Choose System-generated API Keys.
- Permissions: Contract Trade, Unified Trading, SPOT Trade as needed. Leave "Wallet" and "Withdraw" disabled.
- Set IP restriction if your bot has a fixed IP (recommended).
- Set expiration to "No expiration" if your bot will run long-term, or set a calendar reminder for the expiry date.
- Click Submit. Bybit shows you the API key and secret once.
- In WatchDog Bot: Settings → API Connections → Add Connection → Bybit.
- Paste the API key and secret. Name the connection.
- Save.
Test:
import wd, ccxt
conn = wd.connection("Bybit")
ex = ccxt.bybit({"apiKey": conn.api_key, "secret": conn.api_secret})
balance = ex.fetch_balance()
wd.log.info("Total USDT: $%s", balance["total"].get("USDT", 0))
Testnet: Bybit has a separate testnet at testnet.bybit.com with its own API keys. Use it for paper trading. Add it as a second connection (e.g., "BybitTestnet") and pass {"sandbox": True} to ccxt.
Custom HTTP connections Anything else
For anything not in the curated exchange list — sportsbook APIs, alternative data providers, in-house systems — WatchDog Bot supports generic HTTP connections.
- In WatchDog Bot: Settings → API Connections → Add Connection → Custom.
- Enter a name (e.g., "Polymarket", "NewsAPI", "MyInternalAPI").
- Enter the base URL for the API.
- Enter your API key. Optionally enter a secondary secret/private key.
- Save.
Use in your bot code exactly like the curated exchanges — same wd.connection interface:
import wd, requests
conn = wd.connection("Polymarket")
headers = {"Authorization": f"Bearer {conn.api_key}"}
r = requests.get(f"{conn.base_url}/markets", headers=headers)
wd.log.info("Markets: %s", r.json()[:3])
After setup — universal tips
- Test in demo mode first. Use
wd.is_demo()in your bot code to guard real orders during development. - Start with 1-contract sizes. Whatever your strategy, run it at minimum size for a week before scaling. You'll find bugs you didn't know existed.
- Set calendar reminders for API key rotations. Many exchanges auto-rotate or expire keys every 90 days. A bot running with a stale key won't tell you it's broken — it'll just silently fail.
- One connection per use-case. Don't share a single API key between your manual trades and your bots. Separate keys mean separate audit trails and easier rotation when needed.
Got your keys ready?
Plug them into WatchDog Bot and ship your first bot in 5 minutes. Free trial, no credit card.
Start Free Trial →
WatchDog Bot