Docs · Exchange Setup

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.

Setup guides

  1. Kalshi
  2. Binance
  3. Coinbase
  4. Kraken
  5. Bybit
  6. Custom HTTP connections

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.

  1. Log into kalshi.com and complete KYC if you haven't already.
  2. Click your profile icon → API Keys.
  3. Click Generate New Key. You'll get an access-key string AND be prompted to download a private_key.pem file.
  4. Save the private key file in a secure location — Kalshi only shows it once, and it can't be re-downloaded.
  5. In WatchDog Bot: Settings → API Connections → Add Connection → Kalshi.
  6. Paste the access key. Upload the private_key.pem file. Name the connection (e.g., "Kalshi" or "MyKalshi").
  7. 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

  1. Log into binance.com (or binance.us if you're a US resident).
  2. Click your profile icon → API Management.
  3. Click Create API. You may be asked to verify with 2FA.
  4. Name the key (e.g., "WatchDog Bot"). Binance gives you an API key + secret.
  5. Copy the secret immediately — Binance only shows it once.
  6. Edit the key's permissions: enable "Spot & Margin Trading", disable "Enable Withdrawals". If you need futures, also enable "Futures".
  7. Optional but recommended: restrict the key to your specific IP under IP Access Restrictions.
  8. In WatchDog Bot: Settings → API Connections → Add Connection → Binance.
  9. Paste the API key and secret. Name the connection.
  10. 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.

  1. Log into coinbase.com.
  2. Click your profile → Settings → API.
  3. Click + New API Key. Coinbase Advanced Trade uses RSA-style key pairs — you'll get a key name and a private key (PEM format).
  4. Set permissions: View accounts, Trade. Leave "Transfer" disabled — that's what controls withdrawals.
  5. Optionally pin the key to your IP under the IP allowlist.
  6. Download or copy the private key — Coinbase only shows it once.
  7. In WatchDog Bot: Settings → API Connections → Add Connection → Coinbase.
  8. Paste both the key name and the private key.
  9. 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

  1. Log into kraken.com.
  2. Click your username → Settings → API.
  3. Click Add Key.
  4. Permissions to enable: Query Funds, Query Open Orders & Trades, Query Closed Orders & Trades, Create & Modify Orders. Leave "Withdraw Funds" disabled.
  5. Click Generate Key. Kraken shows you a key and a private key (base64-encoded string).
  6. Copy both immediately — Kraken won't show the private key again.
  7. In WatchDog Bot: Settings → API Connections → Add Connection → Kraken.
  8. Paste the API key and private key. Name the connection.
  9. 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

  1. Log into bybit.com.
  2. Hover your profile → Account & Security → API.
  3. Click Create New Key. Choose System-generated API Keys.
  4. Permissions: Contract Trade, Unified Trading, SPOT Trade as needed. Leave "Wallet" and "Withdraw" disabled.
  5. Set IP restriction if your bot has a fixed IP (recommended).
  6. Set expiration to "No expiration" if your bot will run long-term, or set a calendar reminder for the expiry date.
  7. Click Submit. Bybit shows you the API key and secret once.
  8. In WatchDog Bot: Settings → API Connections → Add Connection → Bybit.
  9. Paste the API key and secret. Name the connection.
  10. 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.

  1. In WatchDog Bot: Settings → API Connections → Add Connection → Custom.
  2. Enter a name (e.g., "Polymarket", "NewsAPI", "MyInternalAPI").
  3. Enter the base URL for the API.
  4. Enter your API key. Optionally enter a secondary secret/private key.
  5. 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

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 →

More reading