Symptoms, root causes, and exact fixes for the most common PolyBot issues. Use the sidebar to jump to your error type.
Quick First Step
90% of issues are visible in the container logs. Always start here before anything else:
docker logs polybot --tail 50
🐳 Docker & Startup
Symptom
Container exits immediately after docker compose up -d
CauseMissing or malformed .env file, invalid API key format, or an uncaught startup exception.
FixRun docker logs polybot and scroll to the last error line. The most common message is "KeyError: POLYMARKET_API_KEY" — meaning a required variable is missing from your .env. Compare your .env against the template in .env.example.
# View last 100 lines of logs
docker logs polybot --tail 100
# Verify your .env file exists
ls -la .env
# Check against the example template
diff .env .env.example
Symptom
Error: "Bind for 0.0.0.0:8080 failed: port is already allocated"
CauseAnother process (or a previously stopped PolyBot container) is already using port 8080.
FixEither stop the conflicting process, or change the port mapping in docker-compose.yml from 8080:8080 to a free port like 8181:8080.
# Find what's using port 8080
sudo lsof -i :8080
# Or kill any stopped containers holding the port
docker rm -f $(docker ps -aq --filter "name=polybot")
Symptom
Error: "permission denied while trying to connect to the Docker daemon socket"
CauseOn Linux, your user account is not in the docker group, so every Docker command requires sudo.
FixAdd your user to the docker group and re-login. You only need to do this once.
sudo usermod -aG docker $USER
# Log out and back in, then:
docker ps # should work without sudo
Symptom
Container starts but crashes with "Killed" — out of memory
CauseThe Linux OOM killer terminated the bot process because available RAM was exhausted. Common on $3/mo VPS plans with 512 MB RAM.
FixUpgrade your VPS to at least 1 GB RAM, or add a swap file as a temporary workaround. PolyBot requires a minimum of 512 MB free RAM; 1 GB is recommended for stable operation with the AI models loaded.
CauseYour Polymarket L2 API key has expired, been revoked, or was copied incorrectly (trailing whitespace, missing characters).
FixLog into Polymarket → Profile → API Keys → Generate New Key. Copy the full key string into your .env file. Ensure there are no quotes around the value and no trailing spaces.
# Correct format in .env:
POLYMARKET_API_KEY=your-key-here
POLYMARKET_API_SECRET=your-secret-here
POLYMARKET_PASSPHRASE=your-passphrase-here
# Wrong — do NOT wrap in quotes:
POLYMARKET_API_KEY="your-key-here"
Symptom
Error: "Wrong chain_id" or orders rejected by API
CauseThe CHAIN_ID environment variable is not set to Polygon mainnet's chain ID.
FixPolymarket runs on Polygon (chain ID 137). Set CHAIN_ID=137 in your .env. If you're testing against a local fork or testnet, use the appropriate chain ID — but Polymarket itself only operates on mainnet.
# In .env:
CHAIN_ID=137
Symptom
Error: "429 Too Many Requests" in logs
CauseMultiple PolyBot instances running simultaneously sharing the same API key, or an aggressive polling interval hammering the REST API.
FixThe bot handles rate limits gracefully with exponential backoff by default. If you see persistent 429s, check that only one bot instance is running (docker ps) and increase POLL_INTERVAL_SECONDS in your config.
Error: "Allowance too low" or USDC spend not approved
CauseThe USDC ERC-20 spending allowance for the Polymarket CTF Exchange contract hasn't been approved from your wallet, so orders are rejected on-chain.
FixGo to Polymarket.com, connect your wallet, attempt to deposit or place a manual order. Polymarket will prompt you to approve the USDC allowance in your wallet (MetaMask). Approve at least the amount you plan to trade. This is a one-time on-chain transaction that costs a small POL gas fee.
📊 Dashboard
Symptom
Can't access dashboard at http://your-vps-ip:8080
CauseEither the container is not running, or the VPS firewall is blocking port 8080.
FixStep 1: Confirm the container is running. Step 2: Open port 8080 in UFW. Step 3: Confirm your cloud provider's security group also allows the port.
docker ps # confirm polybot is Up
sudo ufw allow 8080/tcp
sudo ufw reload
Symptom
Dashboard loads but shows "No trades" even though bot is running
CauseBot is running in Paper Mode (no real orders), the API key doesn't match the connected wallet, or the bot genuinely hasn't found qualifying trades yet.
FixCheck the Status badge in the top-right of the dashboard. If it shows "Paper" mode, set PAPER_MODE=false and restart. If it shows "Live", check the Logs tab for "no markets above confidence threshold" messages — your CONFIDENCE_THRESHOLD may be too high.
Symptom
Dashboard settings not saving / reverting after refresh
CauseBrowser cache conflict or the API endpoint for saving config is returning an error.
FixHard-refresh the page (Ctrl+Shift+R). Open browser DevTools → Network tab → look for a failed PUT/POST request to /api/config. If you see a 403, the dashboard API auth token may have expired — log out and back in from the dashboard login screen.
📈 Trading Issues
Symptom
Bot is running but not placing any trades
CauseOne of: PAPER_MODE is on, CONFIDENCE_THRESHOLD is too high, DAILY_LOSS_LIMIT was already hit today, or no markets meet the liquidity filter.
FixWork through this checklist in order:
# 1. Check mode
grep PAPER_MODE .env
# Should be: PAPER_MODE=false
# 2. Lower confidence threshold temporarily to test
# In config.yml:
confidence_threshold: 0.60 # default 0.70
# 3. Check if daily loss limit triggered
docker logs polybot | grep "DAILY_LOSS_LIMIT"
# 4. Restart to reset daily counters
docker compose restart
Symptom
Orders placed but not filling — sitting open in order book
CauseThe bot is posting limit orders at a price no one is willing to trade at, or the market has very thin order book depth.
FixIncrease PRICE_TOLERANCE in config to allow the bot to post at a slightly worse price, improving fill probability. Alternatively enable USE_MARKET_ORDERS=true for immediate fills (at cost of potential slippage).
# In config.yml:
price_tolerance: 0.03 # accept up to 3% worse than mid
use_market_orders: false # set true for instant fills
Symptom
Instant cashout / sell not working
CauseThe on-chain sell transaction is failing because the wallet has insufficient POL for gas fees on Polygon.
FixSend a small amount of POL (Polygon's native token, formerly MATIC) to your trading wallet. 0.5–1 POL is enough for hundreds of transactions. Polymarket itself uses USDC for settlement but POL is required for gas.
📱 Telegram Alerts
Symptom
Bot not sending Telegram alerts at all
CauseInvalid TELEGRAM_TOKEN, wrong TELEGRAM_CHAT_ID, or you haven't initiated a conversation with the bot yet.
FixWork through this sequence:
# Step 1: Verify token is correct by calling Telegram API
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getMe"
# Should return: {"ok":true, "result":{"username":"YourBotName",...}}
# Step 2: Get your chat ID — send /start to your bot,
# then call:
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates"
# Look for "chat":{"id":XXXXXXX} in the response
# Step 3: Update .env
TELEGRAM_TOKEN=123456:ABCDefGHIJKLmnopQRSTUVwxyz
TELEGRAM_CHAT_ID=123456789
Symptom
Receiving duplicate Telegram messages for every trade
CauseTwo or more PolyBot instances are running simultaneously with the same Telegram credentials.
FixStop all running instances and restart only one:
# Stop all containers
docker stop $(docker ps -q --filter "name=polybot")
# Remove stopped containers
docker rm $(docker ps -aq --filter "name=polybot")
# Start fresh with one instance
docker compose up -d
Still Stuck?
If none of the above resolves your issue, collect full logs with docker logs polybot > polybot-debug.log and share it via the Support page. Include your OS, VPS specs, and PolyBot version.
Next Steps
FAQ — general questions about setup, costs, and performance