sync: upstream + our customizations (dashboard, healthcheck, docs)

Synced from github/main: aebcfa2d copybot: live paper feed [skip ci]
Our additions: serve_dashboard.py, bot_dashboard.html, mihomo-healthcheck.sh,
中文文档, 我们的钱包配置
This commit is contained in:
2026-07-21 07:35:48 +08:00
parent aebcfa2d24
commit 125470b24a
388 changed files with 116727 additions and 14 deletions
+737
View File
@@ -0,0 +1,737 @@
# DEPLOY.md - 手动部署 paper + live copybot 到新服务器
> 一步一步来,可以一边看一边敲。不要一次性复制粘贴大段命令--每一步做完、看到预期输出,再进下一步。
>
> 适用:把 paper bot + live bot 部署到一台新的 Linux 服务器(Ubuntu/Debian),从你自己的 Gitea 拉代码。如果服务器在 Polymarket 禁单地区(美国/英国/法国等),用 mihomo 代理绕开 geo-block。
>
> 完成时间参考:60-90 分钟(含每步等待 + live 配置)。
>
> 完成部署后提供:
> - **paper bot**24/7 模拟跟单(直连,不走代理)
> - **live bot**24/7 真钱跟单(走代理绕 geo-block)
> - **bot 实时账本(中文 web dashboard**`http://服务器IP:18080/`
> - **原始 JSON**`https://<GITEA>/<USERNAME>/winning-wallet-finder/raw/branch/main/live/copybot_live.json`
---
## 目录
- [Part A: Paper Bot 部署](#part-a-paper-bot-部署) (§0-§13
- [Part B: 代理配置(geo-block 绕行)](#part-b-代理配置geo-block-绕行) (§14-§16
- [Part C: Live Bot 部署](#part-c-live-bot-部署) (§17-§23
- [常见坑](#常见坑)
- [日常命令](#日常用的命令)
---
# Part A: Paper Bot 部署
## 0. 前置条件
- [ ] 一台 Linux VPSUbuntu 20.04+ / Debian 11+
- [ ] 你有 root SSH 权限
- [ ] 你的 Gitea 上有这个仓库的镜像
- [ ] Gitea PAT(权限 `repository: Write`
测 Polymarket 直连:
```bash
python3 -c "
import urllib.request, time
for url in [
'https://data-api.polymarket.com/v1/leaderboard?limit=1',
'https://gamma-api.polymarket.com/markets?limit=1',
'https://clob.polymarket.com/markets?next_cursor=',
]:
t = time.time()
try:
urllib.request.urlopen(urllib.request.Request(url, headers={'User-Agent':'Mozilla/5.0'}), timeout=10)
print(f'OK {(time.time()-t)*1000:6.0f}ms {url}')
except Exception as e:
print(f'FAIL {type(e).__name__}: {url}')
"
```
三行 `OK` = 能读 APIpaper 够用)。
## 1. 装基础依赖
```bash
ssh root@你的服务器IP
apt-get update
apt-get install -y git python3 python3-pip ca-certificates
```
## 2. 从 Gitea 拉代码
```bash
cd /opt
git clone https://<USERNAME>:<TOKEN>@<GITEA>/<USERNAME>/winning-wallet-finder.git
cd winning-wallet-finder/live
```
## 3. 装 duckdb + 首次回测
```bash
pip3 install duckdb --break-system-packages
python3 portfolio.py --days 30
```
预期:`portfolio[30d rolling]: equity $... | ... | -> portfolio.json`
## 4. 前台测试 bot
```bash
python3 ../copybot.py --config copybot.paper.json --state copybot_state.json --poll 60
```
看到 `watching N wallets` + 2-3 条心跳后 `Ctrl+C`
## 5. 配 Gitea 凭证
### 5.1 生成 PAT
Gitea -> 用户设置 -> Applications -> Generate Token(权限 `repository: Write`
### 5.2 写 .netrc
```bash
nano ~/.netrc
```
```
machine <GITEA域名>
login <USERNAME>
password <TOKEN>
```
```bash
chmod 600 ~/.netrc
cd /opt/winning-wallet-finder
git push origin main --dry-run
```
### 5.3 root git 白名单
```bash
git config --global --add safe.directory /opt/winning-wallet-finder
```
## 6. 建专用用户 wwf
```bash
useradd --system --shell /usr/sbin/nologin --home /opt/winning-wallet-finder wwf
chown -R wwf:wwf /opt/winning-wallet-finder
chmod -R u+rwX,g+rX,o-rwx /opt/winning-wallet-finder
sudo cp /root/.netrc /opt/winning-wallet-finder/.netrc
sudo chown wwf:wwf /opt/winning-wallet-finder/.netrc
sudo chmod 600 /opt/winning-wallet-finder/.netrc
sudo -u wwf git config --global user.name "copybot[bot]"
sudo -u wwf git config --global user.email "copybot@wwf.local"
```
> **坑**wwf 没配 git identity 会导致 commit 报 `Author identity unknown`。上面最后两行不能漏。
## 7. 写 paper systemd unit
```bash
cat > /etc/systemd/system/copybot-paper.service <<'EOF'
[Unit]
Description=Polymarket Paper Copybot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=wwf
Group=wwf
WorkingDirectory=/opt/winning-wallet-finder/live
ExecStart=/usr/bin/python3 /opt/winning-wallet-finder/copybot.py \
--config /opt/winning-wallet-finder/live/copybot.paper.json \
--state /opt/winning-wallet-finder/copybot_state.json \
--poll 60
Restart=always
RestartSec=10
TimeoutStopSec=30
Nice=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=copybot-paper
EnvironmentFile=-/etc/copybot/paper.env
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
RestrictSUIDSGID=true
RestrictNamespaces=true
LockPersonality=true
RestrictRealtime=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
SystemCallArchitectures=native
ReadWritePaths=/opt/winning-wallet-finder
[Install]
WantedBy=multi-user.target
EOF
```
## 8. 启动 paper bot
```bash
systemctl daemon-reload
systemctl enable --now copybot-paper
sleep 5
systemctl status copybot-paper
```
## 9. 验证 Gitea 推送
```bash
cd /opt/winning-wallet-finder
sudo -u wwf git add -A
sudo -u wwf git commit -m "manual sync"
sudo -u wwf git push
```
## 10. 加 Alchemy RPC
```bash
sudo install -d -m 750 -o wwf -g wwf /etc/copybot
sudo tee /etc/copybot/paper.env > /dev/null <<EOF
ALCHEMY_RPC_URL=https://polygon-mainnet.g.alchemy.com/v2/你的KEY
EOF
sudo chown wwf:wwf /etc/copybot/paper.env
sudo chmod 600 /etc/copybot/paper.env
sudo systemctl restart copybot-paper
```
## 11. 加每日 cron
```bash
timedatectl | grep "Time zone"
# UTC 服务器 -> 北京 10:00 = cron 0 2
(crontab -l 2>/dev/null; echo "0 2 * * * cd /opt/winning-wallet-finder/live && bash daily.sh >> daily.log 2>&1") | crontab -
```
## 12. 部署 web dashboard
```bash
cat > /etc/systemd/system/copybot-dashboard.service <<'EOF'
[Unit]
Description=Polymarket Copybot Live Dashboard
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=wwf
Group=wwf
WorkingDirectory=/opt/winning-wallet-finder/live
ExecStart=/usr/bin/python3 /opt/winning-wallet-finder/live/serve_dashboard.py
Restart=always
RestartSec=5
Nice=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=copybot-dashboard
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
RestrictNamespaces=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now copybot-dashboard
sleep 3
curl -s http://localhost:18080/api/feed | python3 -m json.tool | head -10
```
浏览器访问 `http://服务器IP:18080/`。如果打不开,放行防火墙 TCP 18080。
## 13. Paper 完成检查
- [x] paper bot systemd 24/7 跑
- [x] web dashboard @ :18080
- [x] Alchemy RPC ON
- [x] 状态推 Gitea
- [x] 每日 cron
---
# Part B: 代理配置(geo-block 绕行)
> **为什么要代理**Polymarket 禁止美国/英国/法国/德国/意大利/荷兰/波兰/新加坡/澳大利亚/加拿大安大略/巴西 等地区的 IP 下单。如果你的服务器在这些地区,live bot 需要走代理。
>
> paper bot 不受影响(只读 API 全球开放)。
## 14. 检查 geo-gate
```bash
cd /opt/winning-wallet-finder
python3 host/geocheck.py
```
- `VERDICT: TRADABLE` -> 跳过 Part B,直接去 Part C
- `VERDICT: BLOCKED` -> 继续往下配代理
## 15. 装 mihomoClash Meta 内核)
### 15.1 下载 mihomo
```bash
mkdir -p /etc/mihomo
cd /tmp
wget -q https://github.com/MetaCubeX/mihomo/releases/download/v1.19.0/mihomo-linux-amd64-v1.19.0.gz
gzip -d mihomo-linux-amd64-v1.19.0.gz
mv mihomo-linux-amd64-v1.19.0 /usr/local/bin/mihomo
chmod +x /usr/local/bin/mihomo
mihomo -v
```
### 15.2 拉订阅配置
> **坑**:机场会检测 User-Agent,wget 默认 UA 会被返回假节点。必须伪装 UA。
```bash
wget -O /etc/mihomo/config.yaml \
--user-agent="clash-verge/v1.7.7" \
"你的订阅链接&flag=meta"
```
验证拿到的是真实节点(不是"当前Clash客户端不支持本机场协议"):
```bash
grep "name:" /etc/mihomo/config.yaml | grep -i "日本\|香港\|新加坡" | head -10
```
### 15.3 改全局模式 + 启动
```bash
sed -i 's/^mode: rule/mode: global/' /etc/mihomo/config.yaml
nohup mihomo -d /etc/mihomo > /var/log/mihomo.log 2>&1 &
sleep 5
# 选一个非美国节点(以日本为例)
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL \
-H "Content-Type: application/json" \
-d '{"name":"节点名"}'
# 验证
HTTPS_PROXY=http://127.0.0.1:7890 python3 host/geocheck.py
```
期望 `VERDICT: TRADABLE`
### 15.4 做 systemd 服务
```bash
kill $(pgrep mihomo)
cat > /etc/systemd/system/mihomo.service <<'EOF'
[Unit]
Description=Mihomo (Clash Meta) Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mihomo
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mihomo
sleep 5
# 重选节点(mihomo 重启会记住,但第一次要手动选)
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL \
-H "Content-Type: application/json" \
-d '{"name":"节点名"}'
# 验证代理 + geo-gate
HTTPS_PROXY=http://127.0.0.1:7890 python3 host/geocheck.py | tail -1
```
> **mihomo 会记住节点选择**`cache.db` 持久化,重启不丢。
### 15.5 自动健康检查(节点挂了自动换)
```bash
cat > /opt/mihomo-healthcheck.sh <<'SCRIPT'
#!/bin/bash
API="http://127.0.0.1:9090"
PROXY="http://127.0.0.1:7890"
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY \
"https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then exit 0; fi
nodes=$(curl -s "$API/proxies" | python3 -c "
import sys, json
d = json.load(sys.stdin)
skip = {'DIRECT','REJECT','自动选择','故障转移','良心云','GLOBAL'}
for name, info in d.get('proxies', {}).items():
if name in skip: continue
if info.get('type') in ('Selector','URLTest','Fallback','LoadBalance'): continue
if any(k in name for k in ['美国','US','United States']): continue
print(name)
")
for node in $nodes; do
curl -s -X PUT "$API/proxies/GLOBAL" -H "Content-Type: application/json" -d "{\"name\":\"$node\"}" > /dev/null
sleep 2
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY \
"https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then
logger "mihomo-healthcheck: switched to $node"
exit 0
fi
done
logger "mihomo-healthcheck: ALL nodes failed"
exit 1
SCRIPT
chmod +x /opt/mihomo-healthcheck.sh
(crontab -l 2>/dev/null | grep -v mihomo-healthcheck; echo "*/5 * * * * /opt/mihomo-healthcheck.sh") | crontab -
```
> **代理只影响 live bot**mihomo 监听 `127.0.0.1:7890`,不是透明代理。只有设了 `HTTPS_PROXY` 的程序才走代理。paper bot / dashboard / Gitea 全部直连,不受影响。
>
> **不要**把 `HTTPS_PROXY` 写进 `/etc/environment` 或 `~/.bashrc`(会全局生效),只放在 `/etc/copybot/live.env` 里。
---
# Part C: Live Bot 部署
> **真钱!** 每一步验证完再进下一步。建议先 $3-5 测试。
## 17. 装 live 依赖
```bash
pip3 install py-clob-client==0.34.6 web3==7.16.0 polymarket-client==0.1.0b16 websocket-client --break-system-packages
```
> **坑**`preflight_live.py` 需要 `polymarket-client`(不是 `py-clob-client`),漏装会报 `ModuleNotFoundError: No module named 'polymarket'`。
## 18. 准备钱包
### 18.1 钱包架构说明
Polymarket 2026 新架构有两套钱包系统:
```
你的私钥(MetaMask 导出)
|
+-- EOA 地址(MetaMask 本身)
+-- 代理钱包(邮箱登录自动创建,POLY_PROXY type=1
+-- 存款钱包(API 自动创建,POLY_1271 type=3<- bot 用这个
```
**bot 只能用存款钱包**。pUSD 在 EOA 或代理钱包里 bot 看不到。
### 18.2 用 MetaMask 登录(推荐,比邮箱简单)
1. 浏览器装 MetaMask,创建新钱包
2. 用 MetaMask 登录 polymarket.com
3. MetaMask -> 账户详情 -> 导出私钥
### 18.3 创建存款钱包
```bash
cd /opt/winning-wallet-finder
export HTTPS_PROXY=http://127.0.0.1:7890
export LIVE_PRIVATE_KEY=0x你的MetaMask私钥
python3 -c "
from polymarket import SecureClient
client = SecureClient.create(private_key='$LIVE_PRIVATE_KEY')
print('存款钱包:', client.wallet)
b = client.get_balance_allowance(asset_type='COLLATERAL')
print('pUSD 余额: \$' + str(b.balance / 1e6))
client.close()
"
```
> **坑(邮箱登录用户)**:如果用邮箱登录的私钥(Magic.link 导出),`SecureClient.create()` 会报 `Gasless transactions require a Builder API Key`。需要用 Builder API 凭证创建存款钱包:
> ```python
> bk = BuilderApiKey(key=..., secret=..., passphrase=...)
> client = SecureClient.create(private_key=pk, api_key=bk)
> ```
> Builder 凭证在 polymarket.com -> Settings -> API Keys 获取。创建完存款钱包后不再需要 Builder 凭证。
>
> **MetaMask 登录用户不受此影响**,存款钱包自动创建。
### 18.4 充值 USDC -> pUSD
**关键**:必须充到**存款钱包地址**,不是 MetaMask 地址。
1. 从交易所提 USDC 到 Polygon 链
2. 接收地址 = 步骤 18.3 打印的存款钱包地址
3. 到账后 USDC 自动转成 pUSD
> **坑**:充到 Polymarket 网站显示的充值地址(代理钱包)是错的,bot 在存款钱包里看不到。必须充到存款钱包地址。
### 18.5 验证余额
```bash
export HTTPS_PROXY=http://127.0.0.1:7890
export LIVE_PRIVATE_KEY=0x你的私钥
python3 -c "
from polymarket import SecureClient
client = SecureClient.create(private_key='$LIVE_PRIVATE_KEY')
b = client.get_balance_allowance(asset_type='COLLATERAL')
print('pUSD: \$' + str(b.balance / 1e6))
client.close()
"
```
## 19. 创建 config.live.json
```bash
cd /opt/winning-wallet-finder
cp config.live.example.json config.live.json
# 改 bankroll_usd 为实际 pUSD 余额
sed -i 's/"bankroll_usd": 22.28/"bankroll_usd": 你的余额/' config.live.json
chown wwf:wwf config.live.json
chmod 640 config.live.json
```
> **坑**config.live.json 是 root 创建的,wwf 用户读不了会报 `PermissionError`。必须 `chown wwf:wwf`。
## 20. 创建 live.env
```bash
cat > /etc/copybot/live.env <<'EOF'
LIVE_PRIVATE_KEY=0x你的MetaMask私钥
LIVE_FUNDER_ADDRESS=0x你的MetaMask地址
LIVE_SIGNATURE_TYPE=1
LIVE_CONFIRM=TRADE LIVE
HTTPS_PROXY=http://127.0.0.1:7890
EOF
chown wwf:wwf /etc/copybot/live.env
chmod 600 /etc/copybot/live.env
```
> **坑 1**`LIVE_CONFIRM` 的值必须是 `TRADE LIVE`copytrade.py:48 的 `CONFIRM_PHRASE`),不是 `I understand real money is at risk`。填错会报 `Aborted - LIVE_CONFIRM is set but does not match the phrase`。
>
> **坑 2**systemd EnvironmentFile 里值**不要加引号**。`LIVE_CONFIRM=TRADE LIVE` 是对的,`LIVE_CONFIRM="TRADE LIVE"` 会让值带引号导致不匹配。
>
> **坑 3**`HTTPS_PROXY` 只在 live.env 里设,不要放 paper.envpaper bot 不需要代理)。
## 21. 跑 preflight
```bash
cd /opt/winning-wallet-finder
export LIVE_PRIVATE_KEY=$(grep LIVE_PRIVATE_KEY /etc/copybot/live.env | cut -d= -f2-)
export LIVE_FUNDER_ADDRESS=$(grep LIVE_FUNDER_ADDRESS /etc/copybot/live.env | cut -d= -f2-)
export HTTPS_PROXY=http://127.0.0.1:7890
python3 preflight_live.py
```
全绿才能继续。常见失败:
- `ModuleNotFoundError: No module named 'websocket'` -> `pip3 install websocket-client`
- `Gasless transactions require a Builder API Key` -> 见 §18.3 邮箱登录的坑
- `Invalid private_key: 'ascii' codec can't encode` -> 私钥里有非 ASCII 字符(中文占位符没替换)
## 22. 写 live systemd unit
```bash
cat > /etc/systemd/system/copybot-live.service <<'EOF'
[Unit]
Description=Polymarket LIVE Copybot (real money)
After=network-online.target mihomo.service
Wants=network-online.target
Requires=mihomo.service
[Service]
Type=simple
User=wwf
Group=wwf
WorkingDirectory=/opt/winning-wallet-finder/live
ExecStart=/usr/bin/python3 /opt/winning-wallet-finder/copybot.py \
--config /opt/winning-wallet-finder/config.live.json \
--state /opt/winning-wallet-finder/copybot_state.live.json \
--poll 60 --live
Restart=always
RestartSec=10
TimeoutStopSec=30
Nice=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=copybot-live
EnvironmentFile=/etc/copybot/live.env
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
RestrictSUIDSGID=true
RestrictNamespaces=true
LockPersonality=true
RestrictRealtime=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
SystemCallArchitectures=native
ReadWritePaths=/opt/winning-wallet-finder
[Install]
WantedBy=multi-user.target
EOF
```
> `Requires=mihomo.service` + `After=mihomo.service`:代理先启动,live bot 才启动。
## 23. 启动 live bot
```bash
systemctl daemon-reload
systemctl enable --now copybot-live
sleep 10
journalctl -u copybot-live --since "15 seconds ago" --no-pager
```
预期看到:
```
geo-gate: TRADABLE - order endpoint reachable
LIVE MODE - this will place REAL orders with REAL money.
confirmed via LIVE_CONFIRM env - armed.
mode: LIVE - REAL MONEY
watching 5 wallets
```
### 清空 live state(如果出现 LEDGER DRIFT
```bash
systemctl stop copybot-live
rm -f /opt/winning-wallet-finder/copybot_state.live.json
rm -f /opt/winning-wallet-finder/copybot_fills.live.jsonl
rm -f /opt/winning-wallet-finder/live/copybot_live_real.json
systemctl start copybot-live
```
### 监控第一笔成交
```bash
journalctl -u copybot-live -f
```
看到 `FOLLOW` + `[LIVE] order placed` = 第一笔真钱成交。然后去 polymarket.com 用 MetaMask 登录确认仓位。
---
# 完整部署架构
```
服务器
|
+-- mihomo.service 代理(日本节点,127.0.0.1:7890
| +-- healthcheck cron 每 5 分钟自动换节点
|
+-- copybot-paper.service paper bot(直连,不走代理)
| +-- EnvironmentFile: paper.envALCHEMY_RPC_URL
| +-- state: copybot_state.json
| +-- feed: live/copybot_live.json
|
+-- copybot-live.service live bot(走代理绕 geo-block
| +-- EnvironmentFile: live.envLIVE_PRIVATE_KEY + HTTPS_PROXY + TRADE LIVE
| +-- state: copybot_state.live.json
| +-- feed: live/copybot_live_real.json
|
+-- copybot-dashboard.service web dashboard:18080
|
+-- cron 每日 02:00 UTC daily.sh
```
---
# 常见坑
| 坑 | 症状 | 解法 |
| --- | --- | --- |
| 没装 duckdb | `ModuleNotFoundError: No module named 'duckdb'` | `pip3 install duckdb --break-system-packages` |
| 没装 polymarket-client | `ModuleNotFoundError: No module named 'polymarket'` | `pip3 install polymarket-client==0.1.0b16` |
| 没装 websocket-client | preflight 报 `No module named 'websocket'` / 日志 `rtds off` | `pip3 install websocket-client` |
| wwf 没配 git identity | commit 报 `Author identity unknown` | §6 最后两行 |
| root 看不到 wwf 仓库 | `dubious ownership` | `git config --global --add safe.directory ...` |
| config.live.json 权限 | `PermissionError: [Errno 13]` | `chown wwf:wwf config.live.json` |
| LIVE_CONFIRM 值错 | `Aborted - LIVE_CONFIRM is set but does not match` | 值必须是 `TRADE LIVE`,不加引号 |
| 私钥有非 ASCII 字符 | `UnicodeEncodeError: 'ascii' codec can't encode` | env 文件里私钥必须是纯 hex(0x + 64 位),不能有中文占位符 |
| 邮箱登录建存款钱包失败 | `Gasless transactions require a Builder API Key` | 用 Builder API 凭证创建(§18.3),或改用 MetaMask 登录 |
| 充错钱包 | bot 余额 $0 | 必须充到存款钱包地址,不是 MetaMask 地址或网站充值地址 |
| geo-gate BLOCKED | `VERDICT: BLOCKED` | 服务器在禁单区,需配代理(Part B) |
| 机场返回假节点 | 节点名是"当前Clash客户端不支持" | wget 加 `--user-agent="clash-verge/v1.7.7"` + `&flag=meta` |
| mihomo 重启丢节点 | 出口 IP 变回美国 | mihomo cache.db 自动记忆;第一次需手动选节点 |
| LEDGER DRIFT | `check_book could not attribute it` | 清空 live state 重来(§23 |
| bot 不自动 commit | dashboard 数据陈旧 | commit-on-change 节流,无新交易不写;手动 commit 见 §9 |
| 浏览器 dashboard 不更新 | 数据没变 | `Ctrl+Shift+R` 强制刷新 |
| cron 时区错 | daily.sh 时间不对 | 服务器 UTC,北京 10:00 = cron `0 2` |
| 防火墙挡 18080 | 浏览器打不开 dashboard | 放行 TCP 18080 |
---
# 日常用的命令
```bash
# === 看日志 ===
journalctl -u copybot-paper -f # paper bot
journalctl -u copybot-live -f # live bot
journalctl -u copybot-dashboard -f # dashboard
journalctl -u mihomo -f # 代理
# === 看 dashboard ===
# 浏览器:http://服务器IP:18080/
# === 改配置 ===
nano /opt/winning-wallet-finder/live/copybot.paper.json # paper 跟单钱包/金额
sudo systemctl restart copybot-paper
nano /opt/winning-wallet-finder/config.live.json # live 跟单钱包/金额
sudo systemctl restart copybot-live
# === 代理管理 ===
# 看当前节点
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json;print(json.load(sys.stdin).get('now'))"
# 换节点
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL -H "Content-Type: application/json" -d '{"name":"节点名"}'
# 手动健康检查
/opt/mihomo-healthcheck.sh
# === 停/启动 ===
sudo systemctl stop copybot-live # 停 live(真钱!)
sudo systemctl start copybot-live
sudo systemctl stop copybot-paper # 停 paper
sudo systemctl stop mihomo # 停代理(live 也会停)
# === 完全卸载 ===
sudo systemctl disable --now copybot-paper copybot-live copybot-dashboard mihomo
sudo rm /etc/systemd/system/copybot-*.service /etc/systemd/system/mihomo.service
sudo userdel wwf
rm -rf /opt/winning-wallet-finder
```
+207
View File
@@ -0,0 +1,207 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[codz]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py.cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
#uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
#poetry.toml
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
#pdm.lock
#pdm.toml
.pdm-python
.pdm-build/
# pixi
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
#pixi.lock
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
# in the .venv directory. It is recommended not to include this directory in version control.
.pixi
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.envrc
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# Abstra
# Abstra is an AI-powered process automation framework.
# Ignore directories containing user credentials, local state, and settings.
# Learn more at https://abstra.io/docs
.abstra/
# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Cursor
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
# refer to https://docs.cursor.com/context/ignore-files
.cursorignore
.cursorindexingignore
# Marimo
marimo/_static/
marimo/_lsp/
__marimo__/
+69
View File
@@ -0,0 +1,69 @@
# Polymarket Documentation - Daily Update Instructions for AI Agent
## Mission
Your task is to check for updates to the Polymarket documentation and push any changes to the GitHub repository daily.
## What You Are
You are an AI assistant responsible for keeping the Polymarket documentation synchronized with the official docs.polymarket.com website.
## When to Run
Execute this task once per day. Choose a consistent time (e.g., early morning your time).
## Step-by-Step Instructions
### Step 1: Navigate to the Repository
Go to the PolymarketDocumentation folder:
```
/home/himalaya/clawd/PolymarketDocumentation
```
### Step 2: Check if TARGET.md Has New URLs
Read the TARGET.md file and check if any new URLs have been added compared to what's already been scraped. The file contains a list of documentation URLs that need to be fetched.
### Step 3: Scrape New or Updated Pages
For each URL in TARGET.md that doesn't already have a corresponding file in the docs/ folder, or if you suspect the official docs have been updated:
1. Use the web_fetch tool or curl to fetch each URL
2. Save the content as a .md file in the appropriate docs/ subfolder
3. Match the folder structure to the URL path (e.g., `/quickstart/overview.md` goes in `docs/quickstart/`)
### Step 4: Check for Changes
Run `git status` to see what files have been added or modified.
### Step 5: Commit Changes
If there are new or updated files:
1. Add all changes: `git add -A`
2. Commit with a message that includes today's date, for example: "Update Polymarket documentation - 2026-02-14"
3. Use `git commit` to save the changes locally
### Step 6: Push to GitHub
After committing, push the changes to the remote repository:
```
git push origin main
```
### Step 7: Report
Tell the user what was done:
- How many new files were added
- Which sections were updated
- Confirm the push was successful
## Important Notes
- Only commit and push if there are actual changes
- If TARGET.md hasn't changed and all docs are already scraped, simply report "No updates needed today"
- Keep the folder structure organized - match the URL paths
- The repository is at: https://github.com/Etherdrake/PolymarketDocumentation
## Example Output
When you complete this task, say something like:
"Checked Polymarket documentation. No new URLs in TARGET.md and all 117 files already present. No update needed today."
OR:
"Updated Polymarket documentation: Added 3 new API reference files (get-market-price, get-order-book, list-events). Pushed to GitHub successfully."
## Manual Trigger
If the user asks you to check for updates, run through these steps immediately rather than waiting for your daily schedule.
@@ -0,0 +1,202 @@
# Polymarket Documentation Scraper Instructions
## Overview
This document contains instructions for scraping Polymarket documentation from `docs.polymarket.com` and organizing it into the GitHub repository.
The target URLs are stored in `TARGET.md` - edit that file to add/remove URLs to scrape.
## How It Works
1. **TARGET.md** - Contains the list of URLs to scrape (one per line)
2. **INSTRUCTIONS.md** - This file with scraping instructions
3. **scrape.sh** - The automation script that reads from TARGET.md
## Quick Start
```bash
cd /home/himalaya/clawd/PolymarketDocumentation
./scrape.sh
```
## Directory Structure
Organize the scraped files into the following structure:
```
PolymarketDocumentation/
├── TARGET.md # Source URLs (edit this file)
├── INSTRUCTIONS.md # This file
├── scrape.sh # Automation script
├── quickstart/
│ ├── overview.md
│ ├── fetching-data.md
│ ├── first-order.md
│ └── reference/
│ ├── glossary.md
│ ├── endpoints.md
│ └── introduction/
│ └── rate-limits.md
├── developers/
│ ├── market-makers/
│ │ ├── introduction.md
│ │ ├── setup.md
│ │ ├── trading.md
│ │ ├── liquidity-rewards.md
│ │ ├── maker-rebates-program.md
│ │ ├── data-feeds.md
│ │ └── inventory.md
│ ├── CLOB/
│ │ ├── introduction.md
│ │ ├── status.md
│ │ ├── quickstart.md
│ │ ├── authentication.md
│ │ ├── geoblock.md
│ │ ├── timeseries.md
│ │ ├── clients/
│ │ │ ├── methods-overview.md
│ │ │ ├── methods-public.md
│ │ │ ├── methods-l1.md
│ │ │ ├── methods-l2.md
│ │ │ └── methods-builder.md
│ │ ├── orders/
│ │ │ ├── orders.md
│ │ │ ├── create-order.md
│ │ │ ├── create-order-batch.md
│ │ │ ├── get-order.md
│ │ │ ├── get-active-order.md
│ │ │ ├── check-scoring.md
│ │ │ ├── cancel-orders.md
│ │ │ └── onchain-order-info.md
│ │ ├── trades/
│ │ │ ├── trades-overview.md
│ │ │ └── trades.md
│ │ └── websocket/
│ │ ├── wss-overview.md
│ │ ├── wss-auth.md
│ │ ├── user-channel.md
│ │ └── market-channel.md
│ ├── sports-websocket/
│ │ ├── overview.md
│ │ ├── message-format.md
│ │ └── quickstart.md
│ ├── RTDS/
│ │ ├── RTDS-overview.md
│ │ ├── RTDS-crypto-prices.md
│ │ └── RTDS-comments.md
│ └── gamma-markets-api/
│ ├── overview.md
│ ├── gamma-structure.md
│ └── fetch-markets-guide.md
├── api-reference/
│ ├── orderbook/
│ │ ├── get-order-book-summary.md
│ │ └── get-multiple-order-books-summaries-by-request.md
│ ├── pricing/
│ │ ├── get-market-price.md
│ │ ├── get-multiple-market-prices.md
│ │ ├── get-multiple-market-prices-by-request.md
│ │ ├── get-midpoint-price.md
│ │ └── get-price-history-for-a-traded-token.md
│ └── spreads/
│ └── get-bid-ask-spreads.md
└── quickstart-websocket/
└── WSS-Quickstart.md
```
## The Scrape Script (scrape.sh)
```bash
#!/bin/bash
# Base URL
BASE_URL="https://docs.polymarket.com"
# Output directory
OUTPUT_DIR="PolymarketDocumentation"
# Create output directory
mkdir -p "$OUTPUT_DIR"
# Read URLs from TARGET.md (skip comments and empty lines)
grep -v '^#' "$OUTPUT_DIR/TARGET.md" | grep -v '^$' | while read -r url; do
# Extract the path portion (remove https://docs.polymarket.com/)
path="${url#https://docs.polymarket.com/}"
# Remove .md extension for directory structure
filename=$(basename "$path" .md)
dir=$(dirname "$path")
# Create directory
mkdir -p "$OUTPUT_DIR/$dir"
# Determine output file path
output_file="$OUTPUT_DIR/$path"
# Fetch the page
echo "Fetching: $url -> $output_file"
curl -s "$url" -o "$output_file"
# Check if successful
if [ $? -eq 0 ] && [ -s "$output_file" ]; then
echo " ✅ Success: $filename"
else
echo " ❌ Failed: $filename"
fi
# Rate limit (0.5 seconds between requests)
sleep 0.5
done
echo "Done! Scraped files to $OUTPUT_DIR/"
```
## Alternative: Using Python Script
```python
#!/usr/bin/env python3
import os
import urllib.request
import time
import re
BASE_URL = "https://docs.polymarket.com"
OUTPUT_DIR = "PolymarketDocumentation"
# Read URLs from TARGET.md
with open("TARGET.md", "r") as f:
urls = [line.strip() for line in f if line.strip() and not line.startswith("#")]
for url in urls:
# Extract path and create directories
path = url.replace("https://docs.polymarket.com/", "")
filepath = os.path.join(OUTPUT_DIR, path)
os.makedirs(os.path.dirname(filepath), exist_ok=True)
# Fetch the page
print(f"Fetching: {url}")
try:
urllib.request.urlretrieve(url, filepath)
print(f" ✅ Saved: {filepath}")
except Exception as e:
print(f" ❌ Error: {e}")
# Rate limit
time.sleep(0.5)
print("Done!")
```
## Notes
- The `.md` suffix converts HTML pages to markdown format automatically
- Some URLs may require authentication - handle accordingly
- Rate limiting should be respected between requests
- Check for HTTP 200 status codes to verify successful fetches
## Adding New URLs
To add new URLs to scrape, simply edit `TARGET.md` and add the URL on a new line:
```markdown
## New Section
https://docs.polymarket.com/new-section/page.md
```
Then run the scrape script again to fetch the new URLs.
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Max Bodewes
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+2
View File
@@ -0,0 +1,2 @@
# PolymarketDocumentation
Full and completely scraped and maintained Polymarket documentation
+488
View File
@@ -0,0 +1,488 @@
# Target URLs for Polymarket Documentation
These URLs will be scraped and organized into the repository.
## Quickstart
https://docs.polymarket.com/quickstart.md
https://docs.polymarket.com/quickstart/overview.md
https://docs.polymarket.com/quickstart/fetching-data.md
https://docs.polymarket.com/quickstart/first-order.md
https://docs.polymarket.com/quickstart/introduction/rate-limits.md
https://docs.polymarket.com/quickstart/reference/endpoints.md
## Market Makers
https://docs.polymarket.com/market-makers/overview.md
https://docs.polymarket.com/market-makers/getting-started.md
https://docs.polymarket.com/market-makers/trading.md
https://docs.polymarket.com/market-makers/liquidity-rewards.md
https://docs.polymarket.com/market-makers/maker-rebates.md
https://docs.polymarket.com/market-makers/inventory.md
https://docs.polymarket.com/market-makers/combos.md
https://docs.polymarket.com/developers/market-makers/introduction.md
https://docs.polymarket.com/developers/market-makers/setup.md
https://docs.polymarket.com/developers/market-makers/data-feeds.md
## Polymarket Builders Program
https://docs.polymarket.com/builders/overview.md
https://docs.polymarket.com/builders/tiers.md
https://docs.polymarket.com/builders/api-keys.md
https://docs.polymarket.com/developers/builders/builder-intro.md
https://docs.polymarket.com/developers/builders/builder-tiers.md
https://docs.polymarket.com/developers/builders/builder-profile.md
https://docs.polymarket.com/developers/builders/order-attribution.md
https://docs.polymarket.com/developers/builders/relayer-client.md
https://docs.polymarket.com/developers/builders/blockchain-data-resources.md
https://docs.polymarket.com/developers/builders/examples.md
## Central Limit Order Book (CLOB)
https://docs.polymarket.com/trading/overview.md
https://docs.polymarket.com/trading/quickstart.md
https://docs.polymarket.com/developers/CLOB/introduction.md
https://docs.polymarket.com/developers/CLOB/status.md
https://docs.polymarket.com/developers/CLOB/quickstart.md
https://docs.polymarket.com/developers/CLOB/authentication.md
https://docs.polymarket.com/developers/CLOB/geoblock.md
https://docs.polymarket.com/developers/CLOB/clients/methods-overview.md
https://docs.polymarket.com/developers/CLOB/clients/methods-public.md
https://docs.polymarket.com/developers/CLOB/clients/methods-l1.md
https://docs.polymarket.com/developers/CLOB/clients/methods-l2.md
https://docs.polymarket.com/developers/CLOB/clients/methods-builder.md
## API Reference - Market Data
https://docs.polymarket.com/api-reference/introduction.md
https://docs.polymarket.com/api-reference/authentication.md
https://docs.polymarket.com/api-reference/rate-limits.md
https://docs.polymarket.com/api-reference/geoblock.md
https://docs.polymarket.com/api-reference/clients-sdks.md
## API Reference - Market Data (Data API)
https://docs.polymarket.com/market-data/overview.md
https://docs.polymarket.com/market-data/fetching-markets.md
https://docs.polymarket.com/api-reference/market-data/get-order-book.md
https://docs.polymarket.com/api-reference/market-data/get-order-books-request-body.md
https://docs.polymarket.com/api-reference/market-data/get-market-price.md
https://docs.polymarket.com/api-reference/market-data/get-market-prices-query-parameters.md
https://docs.polymarket.com/api-reference/market-data/get-market-prices-request-body.md
https://docs.polymarket.com/api-reference/data/get-midpoint-price.md
https://docs.polymarket.com/api-reference/market-data/get-midpoint-prices-query-parameters.md
https://docs.polymarket.com/api-reference/market-data/get-midpoint-prices-request-body.md
https://docs.polymarket.com/api-reference/market-data/get-spread.md
https://docs.polymarket.com/api-reference/market-data/get-spreads.md
https://docs.polymarket.com/api-reference/market-data/get-last-trade-price.md
https://docs.polymarket.com/api-reference/market-data/get-last-trade-prices-query-parameters.md
https://docs.polymarket.com/api-reference/market-data/get-last-trade-prices-request-body.md
https://docs.polymarket.com/api-reference/market-data/get-fee-rate.md
https://docs.polymarket.com/api-reference/market-data/get-fee-rate-by-path-parameter.md
https://docs.polymarket.com/api-reference/market-data/get-tick-size.md
https://docs.polymarket.com/api-reference/market-data/get-tick-size-by-path-parameter.md
https://docs.polymarket.com/api-reference/data/get-server-time.md
## API Reference - Orderbook
## API Reference - WSS RFQ
https://docs.polymarket.com/api-reference/wss/rfq.md
## API Reference - Trade (CLOB)
https://docs.polymarket.com/api-reference/trade/post-a-new-order.md
https://docs.polymarket.com/api-reference/trade/post-multiple-orders.md
https://docs.polymarket.com/api-reference/trade/get-single-order-by-id.md
https://docs.polymarket.com/api-reference/trade/get-user-orders.md
https://docs.polymarket.com/api-reference/trade/get-trades.md
https://docs.polymarket.com/api-reference/trade/cancel-single-order.md
https://docs.polymarket.com/api-reference/trade/cancel-multiple-orders.md
https://docs.polymarket.com/api-reference/trade/cancel-all-orders.md
https://docs.polymarket.com/api-reference/trade/cancel-orders-for-a-market.md
https://docs.polymarket.com/api-reference/trade/get-order-scoring-status.md
https://docs.polymarket.com/api-reference/trade/send-heartbeat.md
https://docs.polymarket.com/api-reference/trade/get-builder-trades.md
## Historical Timeseries Data
https://docs.polymarket.com/developers/CLOB/timeseries.md
## Order Management
https://docs.polymarket.com/developers/CLOB/orders/orders.md
https://docs.polymarket.com/developers/CLOB/orders/create-order.md
https://docs.polymarket.com/developers/CLOB/orders/create-order-batch.md
https://docs.polymarket.com/developers/CLOB/orders/get-order.md
https://docs.polymarket.com/developers/CLOB/orders/get-active-order.md
https://docs.polymarket.com/developers/CLOB/orders/check-scoring.md
https://docs.polymarket.com/developers/CLOB/orders/cancel-orders.md
https://docs.polymarket.com/developers/CLOB/orders/onchain-order-info.md
https://docs.polymarket.com/trading/orders/overview.md
https://docs.polymarket.com/trading/orders/create.md
https://docs.polymarket.com/trading/orders/cancel.md
https://docs.polymarket.com/trading/orders/attribution.md
## Trades
https://docs.polymarket.com/developers/CLOB/trades/trades-overview.md
https://docs.polymarket.com/developers/CLOB/trades/trades.md
## Websocket
https://docs.polymarket.com/market-data/websocket/overview.md
https://docs.polymarket.com/market-data/websocket/market-channel.md
https://docs.polymarket.com/market-data/websocket/user-channel.md
https://docs.polymarket.com/developers/CLOB/websocket/wss-overview.md
https://docs.polymarket.com/quickstart/websocket/WSS-Quickstart.md
https://docs.polymarket.com/developers/CLOB/websocket/wss-auth.md
https://docs.polymarket.com/developers/CLOB/websocket/user-channel.md
https://docs.polymarket.com/developers/CLOB/websocket/market-channel.md
https://docs.polymarket.com/api-reference/wss/market.md
https://docs.polymarket.com/api-reference/wss/user.md
## Sports Websocket
https://docs.polymarket.com/developers/sports-websocket/overview.md
https://docs.polymarket.com/developers/sports-websocket/message-format.md
https://docs.polymarket.com/developers/sports-websocket/quickstart.md
https://docs.polymarket.com/market-data/websocket/sports.md
https://docs.polymarket.com/api-reference/wss/sports.md
## Real Time Data Stream
https://docs.polymarket.com/market-data/websocket/rtds.md
https://docs.polymarket.com/developers/RTDS/RTDS-overview.md
https://docs.polymarket.com/developers/RTDS/RTDS-crypto-prices.md
https://docs.polymarket.com/developers/RTDS/RTDS-comments.md
## Gamma Structure
https://docs.polymarket.com/developers/gamma-markets-api/overview.md
https://docs.polymarket.com/developers/gamma-markets-api/gamma-structure.md
https://docs.polymarket.com/developers/gamma-markets-api/fetch-markets-guide.md
## Gamma Endpoints - Status
## API Reference - Sports
https://docs.polymarket.com/api-reference/sports/list-teams.md
https://docs.polymarket.com/api-reference/sports/get-sports-metadata-information.md
https://docs.polymarket.com/api-reference/sports/get-valid-sports-market-types.md
## API Reference - Tags
https://docs.polymarket.com/api-reference/tags/list-tags.md
https://docs.polymarket.com/api-reference/tags/get-tag-by-id.md
https://docs.polymarket.com/api-reference/tags/get-tag-by-slug.md
https://docs.polymarket.com/api-reference/tags/get-related-tags-relationships-by-tag-id.md
https://docs.polymarket.com/api-reference/tags/get-related-tags-relationships-by-tag-slug.md
https://docs.polymarket.com/api-reference/tags/get-tags-related-to-a-tag-id.md
https://docs.polymarket.com/api-reference/tags/get-tags-related-to-a-tag-slug.md
## API Reference - Events
https://docs.polymarket.com/api-reference/events/list-events.md
https://docs.polymarket.com/api-reference/events/list-events-keyset-pagination.md
https://docs.polymarket.com/api-reference/events/get-event-by-id.md
https://docs.polymarket.com/api-reference/events/get-event-tags.md
https://docs.polymarket.com/api-reference/events/get-event-by-slug.md
## API Reference - Markets
https://docs.polymarket.com/api-reference/markets/list-markets.md
https://docs.polymarket.com/api-reference/markets/list-markets-keyset-pagination.md
https://docs.polymarket.com/api-reference/markets/get-market-by-id.md
https://docs.polymarket.com/api-reference/markets/get-market-tags-by-id.md
https://docs.polymarket.com/api-reference/markets/get-market-by-slug.md
https://docs.polymarket.com/api-reference/markets/get-clob-market-info.md
https://docs.polymarket.com/api-reference/markets/get-market-by-token.md
https://docs.polymarket.com/api-reference/markets/get-prices-history.md
https://docs.polymarket.com/api-reference/markets/get-batch-prices-history.md
https://docs.polymarket.com/api-reference/markets/get-sampling-markets.md
https://docs.polymarket.com/api-reference/markets/get-simplified-markets.md
https://docs.polymarket.com/api-reference/markets/get-sampling-simplified-markets.md
## API Reference - Series
https://docs.polymarket.com/api-reference/series/list-series.md
https://docs.polymarket.com/api-reference/series/get-series-by-id.md
## API Reference - Comments
https://docs.polymarket.com/api-reference/comments/list-comments.md
https://docs.polymarket.com/api-reference/comments/get-comments-by-comment-id.md
https://docs.polymarket.com/api-reference/comments/get-comments-by-user-address.md
## API Reference - Profiles
https://docs.polymarket.com/api-reference/profiles/get-public-profile-by-wallet-address.md
## API Reference - Search
https://docs.polymarket.com/api-reference/search/search-markets-events-and-profiles.md
## API Reference - Data API Status
## API Reference - Misc
https://docs.polymarket.com/api-reference/misc/download-an-accounting-snapshot-zip-of-csvs.md
https://docs.polymarket.com/api-reference/misc/get-total-markets-a-user-has-traded.md
https://docs.polymarket.com/api-reference/misc/get-open-interest.md
https://docs.polymarket.com/api-reference/misc/get-live-volume-for-an-event.md
## API Reference - Core
https://docs.polymarket.com/api-reference/core/get-current-positions-for-a-user.md
https://docs.polymarket.com/api-reference/core/get-trades-for-a-user-or-markets.md
https://docs.polymarket.com/api-reference/core/get-user-activity.md
https://docs.polymarket.com/api-reference/core/get-top-holders-for-markets.md
https://docs.polymarket.com/api-reference/core/get-total-value-of-a-users-positions.md
https://docs.polymarket.com/api-reference/core/get-closed-positions-for-a-user.md
https://docs.polymarket.com/api-reference/core/get-trader-leaderboard-rankings.md
https://docs.polymarket.com/api-reference/core/get-positions-for-a-market.md
## API Reference - Builders
https://docs.polymarket.com/api-reference/builders/get-aggregated-builder-leaderboard.md
https://docs.polymarket.com/api-reference/builders/get-daily-builder-volume-time-series.md
## Bridge & Swap - Overview
https://docs.polymarket.com/developers/misc-endpoints/bridge-overview.md
## API Reference - Bridge
https://docs.polymarket.com/api-reference/bridge/get-supported-assets.md
https://docs.polymarket.com/api-reference/bridge/get-a-quote.md
https://docs.polymarket.com/api-reference/bridge/create-withdrawal-addresses.md
https://docs.polymarket.com/api-reference/bridge/get-transaction-status.md
https://docs.polymarket.com/api-reference/bridge/create-bridge-addresses.md
https://docs.polymarket.com/trading/bridge/deposit.md
https://docs.polymarket.com/trading/bridge/quote.md
https://docs.polymarket.com/trading/bridge/status.md
https://docs.polymarket.com/trading/bridge/supported-assets.md
https://docs.polymarket.com/trading/bridge/withdraw.md
## Subgraph
## Resolution
https://docs.polymarket.com/developers/resolution/UMA.md
## Conditional Token Frameworks (CTF)
https://docs.polymarket.com/trading/ctf/overview.md
https://docs.polymarket.com/trading/ctf/split.md
https://docs.polymarket.com/trading/ctf/merge.md
https://docs.polymarket.com/trading/ctf/redeem.md
https://docs.polymarket.com/developers/CTF/overview.md
https://docs.polymarket.com/developers/CTF/split.md
https://docs.polymarket.com/developers/CTF/merge.md
https://docs.polymarket.com/developers/CTF/redeem.md
https://docs.polymarket.com/developers/CTF/deployment-resources.md
## Proxy Wallets
https://docs.polymarket.com/developers/proxy-wallet.md
## Negative Risk
https://docs.polymarket.com/advanced/neg-risk.md
https://docs.polymarket.com/developers/neg-risk/overview.md
## Changelog
https://docs.polymarket.com/changelog/changelog.md
## Polymarket Learn - FAQ
https://docs.polymarket.com/polymarket-learn/FAQ/does-polymarket-have-an-api.md
https://docs.polymarket.com/polymarket-learn/FAQ/embeds.md
https://docs.polymarket.com/polymarket-learn/FAQ/geoblocking.md
https://docs.polymarket.com/polymarket-learn/FAQ/how-to-export-private-key.md
https://docs.polymarket.com/polymarket-learn/FAQ/is-my-money-safe.md
https://docs.polymarket.com/polymarket-learn/FAQ/is-polymarket-the-house.md
https://docs.polymarket.com/polymarket-learn/FAQ/polling.md
https://docs.polymarket.com/polymarket-learn/FAQ/recover-missing-deposit.md
https://docs.polymarket.com/polymarket-learn/FAQ/sell-early.md
https://docs.polymarket.com/polymarket-learn/FAQ/support.md
https://docs.polymarket.com/polymarket-learn/FAQ/wen-token.md
https://docs.polymarket.com/polymarket-learn/FAQ/what-are-prediction-markets.md
https://docs.polymarket.com/polymarket-learn/FAQ/why-do-i-need-crypto.md
## Polymarket Learn - Deposits
https://docs.polymarket.com/polymarket-learn/deposits/coinbase.md
https://docs.polymarket.com/polymarket-learn/deposits/how-to-withdraw.md
https://docs.polymarket.com/polymarket-learn/deposits/large-cross-chain-deposits.md
https://docs.polymarket.com/polymarket-learn/deposits/moonpay.md
https://docs.polymarket.com/polymarket-learn/deposits/supported-tokens.md
https://docs.polymarket.com/polymarket-learn/deposits/usdc-on-eth.md
## Polymarket Learn - Get Started
https://docs.polymarket.com/polymarket-learn/get-started/how-to-deposit.md
https://docs.polymarket.com/polymarket-learn/get-started/how-to-signup.md
https://docs.polymarket.com/polymarket-learn/get-started/making-your-first-trade.md
https://docs.polymarket.com/polymarket-learn/get-started/what-is-polymarket.md
## Polymarket Learn - Markets
https://docs.polymarket.com/polymarket-learn/markets/dispute.md
https://docs.polymarket.com/polymarket-learn/markets/how-are-markets-clarified.md
https://docs.polymarket.com/polymarket-learn/markets/how-are-markets-created.md
https://docs.polymarket.com/polymarket-learn/markets/how-are-markets-resolved.md
## Polymarket Learn - Trading
https://docs.polymarket.com/polymarket-learn/trading/fees.md
https://docs.polymarket.com/polymarket-learn/trading/holding-rewards.md
https://docs.polymarket.com/polymarket-learn/trading/how-are-prices-calculated.md
https://docs.polymarket.com/polymarket-learn/trading/limit-orders.md
https://docs.polymarket.com/polymarket-learn/trading/liquidity-rewards.md
https://docs.polymarket.com/polymarket-learn/trading/maker-rebates-program.md
https://docs.polymarket.com/polymarket-learn/trading/market-orders.md
https://docs.polymarket.com/polymarket-learn/trading/no-limits.md
https://docs.polymarket.com/polymarket-learn/trading/using-the-orderbook.md
## Polymarket 101
https://docs.polymarket.com/polymarket-101.md
## Concepts
https://docs.polymarket.com/concepts/markets-events.md
https://docs.polymarket.com/concepts/order-lifecycle.md
https://docs.polymarket.com/concepts/positions-tokens.md
https://docs.polymarket.com/concepts/prices-orderbook.md
https://docs.polymarket.com/concepts/resolution.md
https://docs.polymarket.com/concepts/pusd.md
## Trading
https://docs.polymarket.com/trading/fees.md
https://docs.polymarket.com/trading/gasless.md
https://docs.polymarket.com/trading/orderbook.md
https://docs.polymarket.com/trading/clients/public.md
https://docs.polymarket.com/trading/clients/l1.md
https://docs.polymarket.com/trading/clients/l2.md
https://docs.polymarket.com/trading/clients/builder.md
https://docs.polymarket.com/trading/deposit-wallets.md
https://docs.polymarket.com/trading/taker-rebates.md
## Index & Resources
https://docs.polymarket.com/index.md
https://docs.polymarket.com/resources/contract-addresses.md
https://docs.polymarket.com/resources/error-codes.md
https://docs.polymarket.com/resources/contracts.md
## NEW - API Reference - Rebates (2026-03-27)
https://docs.polymarket.com/api-reference/rebates/get-current-rebated-fees-for-a-maker.md
## NEW - API Reference - Relayer
https://docs.polymarket.com/api-reference/relayer-api-keys/get-all-relayer-api-keys.md
https://docs.polymarket.com/api-reference/relayer/check-if-a-safe-is-deployed.md
https://docs.polymarket.com/api-reference/relayer/check-if-a-wallet-is-deployed.md
https://docs.polymarket.com/api-reference/relayer/get-a-transaction-by-id.md
https://docs.polymarket.com/api-reference/relayer/get-current-nonce-for-a-user.md
https://docs.polymarket.com/api-reference/relayer/get-recent-transactions-for-a-user.md
https://docs.polymarket.com/api-reference/relayer/get-relayer-address-and-nonce.md
https://docs.polymarket.com/api-reference/relayer/submit-a-transaction.md
## NEW - API Reference - Rewards
https://docs.polymarket.com/api-reference/rewards/get-current-active-rewards-configurations.md
https://docs.polymarket.com/api-reference/rewards/get-earnings-for-user-by-date.md
https://docs.polymarket.com/api-reference/rewards/get-multiple-markets-with-rewards.md
https://docs.polymarket.com/api-reference/rewards/get-raw-rewards-for-a-specific-market.md
https://docs.polymarket.com/api-reference/rewards/get-reward-percentages-for-user.md
https://docs.polymarket.com/api-reference/rewards/get-total-earnings-for-user-by-date.md
https://docs.polymarket.com/api-reference/rewards/get-user-earnings-and-markets-configuration.md
## NEW - Resources
https://docs.polymarket.com/resources/blockchain-data.md
https://docs.polymarket.com/resources/referral-program.md
## NEW - Trading
https://docs.polymarket.com/trading/matching-engine.md
## Dev Tooling
https://docs.polymarket.com/dev-tooling.md
https://docs.polymarket.com/dev-tooling/python.md
https://docs.polymarket.com/dev-tooling/typescript.md
## NEW - Builders
https://docs.polymarket.com/builders/fees.md
## NEW - API Reference - Combo Markets (2026-06-17)
https://docs.polymarket.com/api-reference/combo-markets/get-combo-markets.md
## NEW - API Reference - Core (Combo) (2026-06-17)
https://docs.polymarket.com/api-reference/core/get-user-combo-activity.md
https://docs.polymarket.com/api-reference/core/get-user-combo-positions.md
## NEW - API Reference - Maker (RFQ) (2026-06-17)
https://docs.polymarket.com/api-reference/maker/cancel-a-quote.md
https://docs.polymarket.com/api-reference/maker/confirm-or-decline-last-look.md
https://docs.polymarket.com/api-reference/maker/submit-a-quote.md
## NEW - Perps (2026-07-13)
https://docs.polymarket.com/perps/overview.md
https://docs.polymarket.com/perps/account-management.md
https://docs.polymarket.com/perps/authenticated-sessions.md
https://docs.polymarket.com/perps/changelog.md
https://docs.polymarket.com/perps/concepts.md
https://docs.polymarket.com/perps/faq.md
https://docs.polymarket.com/perps/fund-your-account.md
https://docs.polymarket.com/perps/market-data.md
https://docs.polymarket.com/perps/overview.md
https://docs.polymarket.com/perps/place-your-first-trade.md
https://docs.polymarket.com/perps/rate-limits.md
https://docs.polymarket.com/perps/realtime-updates.md
https://docs.polymarket.com/perps/referral-program.md
https://docs.polymarket.com/perps/trading.md
https://docs.polymarket.com/perps/learn-about-trading/architecture.md
https://docs.polymarket.com/perps/learn-about-trading/fees.md
https://docs.polymarket.com/perps/learn-about-trading/funding.md
https://docs.polymarket.com/perps/learn-about-trading/geographic-restrictions.md
https://docs.polymarket.com/perps/learn-about-trading/index-price.md
https://docs.polymarket.com/perps/learn-about-trading/liquidation-mechanics.md
https://docs.polymarket.com/perps/learn-about-trading/margin.md
https://docs.polymarket.com/perps/learn-about-trading/mark-price.md
https://docs.polymarket.com/perps/learn-about-trading/market-sessions.md
https://docs.polymarket.com/perps/learn-about-trading/markets.md
https://docs.polymarket.com/perps/learn-about-trading/overview.md
## NEW - Perps WebSocket (2026-07-13)
https://docs.polymarket.com/api-reference/wss/perps-auth.md
https://docs.polymarket.com/api-reference/wss/perps-auto-cancel.md
https://docs.polymarket.com/api-reference/wss/perps-balances.md
https://docs.polymarket.com/api-reference/wss/perps-bbo.md
https://docs.polymarket.com/api-reference/wss/perps-book.md
https://docs.polymarket.com/api-reference/wss/perps-cancel-orders.md
https://docs.polymarket.com/api-reference/wss/perps-cancel-orders-coid.md
https://docs.polymarket.com/api-reference/wss/perps-deposits.md
https://docs.polymarket.com/api-reference/wss/perps-fills.md
https://docs.polymarket.com/api-reference/wss/perps-funding.md
https://docs.polymarket.com/api-reference/wss/perps-klines.md
https://docs.polymarket.com/api-reference/wss/perps-orders.md
https://docs.polymarket.com/api-reference/wss/perps-ping.md
https://docs.polymarket.com/api-reference/wss/perps-place-orders.md
https://docs.polymarket.com/api-reference/wss/perps-portfolio.md
https://docs.polymarket.com/api-reference/wss/perps-statistics.md
https://docs.polymarket.com/api-reference/wss/perps-tickers.md
https://docs.polymarket.com/api-reference/wss/perps-trades.md
https://docs.polymarket.com/api-reference/wss/perps-update-leverage.md
https://docs.polymarket.com/api-reference/wss/perps-withdrawals.md
## NEW - Account & Trading API (2026-07-13)
https://docs.polymarket.com/api-reference/apply-referral-code.md
https://docs.polymarket.com/api-reference/cancel-orders.md
https://docs.polymarket.com/api-reference/cancel-orders-coid.md
https://docs.polymarket.com/api-reference/check-invite-code.md
https://docs.polymarket.com/api-reference/create-account-invite.md
https://docs.polymarket.com/api-reference/create-orders.md
https://docs.polymarket.com/api-reference/create-proxy.md
https://docs.polymarket.com/api-reference/delete-proxy.md
https://docs.polymarket.com/api-reference/get-account-limits.md
https://docs.polymarket.com/api-reference/get-account-referral.md
https://docs.polymarket.com/api-reference/get-account-rewards.md
https://docs.polymarket.com/api-reference/get-account-stats.md
https://docs.polymarket.com/api-reference/get-auto-cancel-status.md
https://docs.polymarket.com/api-reference/get-balances.md
https://docs.polymarket.com/api-reference/get-bbo.md
https://docs.polymarket.com/api-reference/get-book.md
https://docs.polymarket.com/api-reference/get-collateral-assets.md
https://docs.polymarket.com/api-reference/get-credentials.md
https://docs.polymarket.com/api-reference/get-deposits.md
https://docs.polymarket.com/api-reference/get-equity.md
https://docs.polymarket.com/api-reference/get-exchange-info.md
https://docs.polymarket.com/api-reference/get-fees.md
https://docs.polymarket.com/api-reference/get-fills.md
https://docs.polymarket.com/api-reference/get-funding-charges.md
https://docs.polymarket.com/api-reference/get-historical-funding.md
https://docs.polymarket.com/api-reference/get-index.md
https://docs.polymarket.com/api-reference/get-instrument-config.md
https://docs.polymarket.com/api-reference/get-instruments.md
https://docs.polymarket.com/api-reference/get-internal-transfers.md
https://docs.polymarket.com/api-reference/get-klines.md
https://docs.polymarket.com/api-reference/get-limit-tiers.md
https://docs.polymarket.com/api-reference/get-open-orders.md
https://docs.polymarket.com/api-reference/get-orders.md
https://docs.polymarket.com/api-reference/get-pnl.md
https://docs.polymarket.com/api-reference/get-portfolio.md
https://docs.polymarket.com/api-reference/get-public-portfolio.md
https://docs.polymarket.com/api-reference/get-recent-trades.md
https://docs.polymarket.com/api-reference/get-server-time.md
https://docs.polymarket.com/api-reference/get-statistics.md
https://docs.polymarket.com/api-reference/get-tickers.md
https://docs.polymarket.com/api-reference/get-withdrawals.md
https://docs.polymarket.com/api-reference/internal-transfer.md
https://docs.polymarket.com/api-reference/set-auto-cancel.md
https://docs.polymarket.com/api-reference/test-connection.md
https://docs.polymarket.com/api-reference/update-leverage.md
https://docs.polymarket.com/api-reference/withdraw.md
@@ -0,0 +1,145 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Negative Risk Markets
> Capital-efficient trading for multi-outcome events
**Negative risk** is a mechanism for multi-outcome events where only one outcome can win. It enables capital-efficient trading by allowing positions across all outcomes within an event to be related through a **conversion** operation.
## How It Works
In a standard multi-outcome event, each market is independent. If you want to bet against one outcome, you must buy that outcome's No tokens—but those No tokens have no relationship to the other outcomes.
Negative risk changes this. In a neg risk event:
* A **No share** in any market can be converted into **1 Yes share in every other market**
* This conversion happens through the Neg Risk Adapter contract
### Example
Consider an event: "Who will win the 2024 Presidential Election?" with three outcomes:
| Outcome | Your Position |
| ------- | ------------- |
| Trump | — |
| Harris | — |
| Other | 1 No |
With negative risk, that 1 No on "Other" can be converted into:
| Outcome | After Conversion |
| ------- | ---------------- |
| Trump | 1 Yes |
| Harris | 1 Yes |
| Other | — |
This is capital-efficient because betting against one outcome is economically equivalent to betting *for* all other outcomes.
## Identifying Neg Risk Markets
The Gamma API includes a `negRisk` boolean on events and markets:
```json theme={null}
{
"id": "123",
"title": "Who will win the 2024 Presidential Election?",
"negRisk": true,
"markets": [...]
}
```
When placing orders on neg risk markets, you must specify this in your order options:
```typescript theme={null}
const response = await client.createAndPostOrder(
{
tokenID: "TOKEN_ID",
price: 0.5,
size: 100,
side: Side.BUY,
},
{
tickSize: "0.01",
negRisk: true, // Required for neg risk markets
},
);
```
## Contract Addresses
Neg risk markets use different contracts than standard markets:
See [Contracts](/resources/contracts) for the Neg Risk Adapter and Neg Risk CTF Exchange addresses.
## Augmented Negative Risk
Standard negative risk requires the complete set of outcomes to be known at market creation. But sometimes new outcomes emerge after trading begins (e.g., a new candidate enters a race).
**Augmented negative risk** solves this with:
| Outcome Type | Description |
| ------------------------ | ------------------------------------------------------------- |
| **Named outcomes** | Known outcomes (e.g., "Trump", "Harris") |
| **Placeholder outcomes** | Reserved slots that can be clarified later (e.g., "Person A") |
| **Explicit Other** | Catches any outcome not explicitly named |
### How Placeholders Work
1. Event launches with named outcomes + placeholders + "Other"
2. When a new outcome emerges, a placeholder is clarified via the bulletin board
3. The "Other" definition narrows as placeholders are assigned
### Trading Rules for Augmented Neg Risk
<Warning>
Only trade on **named outcomes**. Placeholder outcomes should be ignored until
they are named or until resolution occurs. The Polymarket UI does not display
unnamed outcomes.
</Warning>
* If the correct outcome at resolution is not named, the market resolves to "Other"
* The "Other" outcome's definition changes as placeholders are clarified—avoid trading it directly
### Identifying Augmented Neg Risk
An event is augmented neg risk when both flags are true:
```json theme={null}
{
"enableNegRisk": true,
"negRiskAugmented": true
}
```
<Note>
The Gamma API includes a boolean field `negRisk` on events and markets, which indicates whether the event uses negative risk. For augmented neg risk events, an additional `enableNegRisk` field is also `true`. When placing orders, the SDK option is always `negRisk: true` / `neg_risk: True` regardless of whether the market is standard or augmented neg risk.
</Note>
## Technical Details
### Conversion Mechanics
The conversion operation is atomic and happens through the Neg Risk Adapter:
1. You hold 1 No token for Outcome A
2. Call the convert function on the adapter
3. You receive 1 Yes token for every other outcome in the event
## Resources
* [Neg Risk Adapter Source Code](https://github.com/Polymarket/neg-risk-ctf-adapter)
* [Gamma API Documentation](/market-data/overview)
## Next Steps
<CardGroup cols={2}>
<Card title="Markets & Events" icon="calendar" href="/concepts/markets-events">
Understand how multi-market events are structured.
</Card>
<Card title="Positions & Tokens" icon="coins" href="/concepts/positions-tokens">
Learn about token operations like split, merge, and redeem.
</Card>
</CardGroup>
@@ -0,0 +1,226 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Apply Referral Code
> Apply a referral code to the authenticated account after signup. Accounts
can only apply a referral code if they do not already have one.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json post /v1/account/referral
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/referral:
post:
summary: Apply Referral Code
description: >
Apply a referral code to the authenticated account after signup.
Accounts
can only apply a referral code if they do not already have one.
operationId: applyReferral
requestBody:
required: true
description: Referral code to apply.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountReferralRequest'
examples:
applyReferral:
summary: Apply a referral code
value:
code: ABC123
responses:
'200':
description: Referral code accepted.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericAccepted'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
AccountReferralRequest:
type: object
required:
- code
properties:
code:
$ref: '#/components/schemas/code'
GenericAccepted:
type: object
required:
- status
properties:
status:
type: string
enum:
- ok
code:
type: string
description: Referral or invite code
example: ABC123
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,437 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Authentication
> How to authenticate requests to the CLOB API
The CLOB API uses two levels of authentication: **L1 (Private Key)** and **L2 (API Key)**. Either can be accomplished using the CLOB client or REST API.
## Public vs Authenticated
<CardGroup cols={1}>
<Card title="Public (No Auth)" icon="unlock">
The **Gamma API**, **Data API**, and CLOB read endpoints (orderbook, prices, spreads) require no authentication.
</Card>
<Card title="Authenticated (CLOB)" icon="lock">
CLOB trading endpoints (placing orders, cancellations, heartbeat) require all 5 `POLY_*` L2 HTTP headers.
</Card>
</CardGroup>
***
## Two-Level Authentication Model
The CLOB uses two levels of authentication: L1 (Private Key) and L2 (API Key). Either can be accomplished using the CLOB client or REST API
### L1 Authentication
L1 authentication uses the wallet's private key to sign an EIP-712 message used in the request header. It proves ownership and control over the private key. The private key stays in control of the user and all trading activity remains non-custodial.
**Used for:**
* Creating API credentials
* Deriving existing API credentials
* Signing and creating user's orders locally
### L2 Authentication
L2 uses API credentials (apiKey, secret, passphrase) generated from L1 authentication. These are used solely to authenticate requests made to the CLOB API. Requests are signed using HMAC-SHA256.
**Used for:**
* Cancel or get user's open orders
* Check user's balances and allowances
* Post user's signed orders
<Info>
Even with L2 authentication headers, methods that create user orders still
require the user to sign the order payload.
</Info>
***
## Getting API Credentials
Before making authenticated requests, you need to obtain API credentials using L1 authentication.
### Using the SDK
<Tabs>
<Tab title="TypeScript">
```typescript theme={null}
import { ClobClient } from "@polymarket/clob-client-v2";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const signer = createWalletClient({ account, transport: http() });
const client = new ClobClient({
host: "https://clob.polymarket.com",
chain: 137, // Polygon mainnet
signer,
});
// Creates new credentials or derives existing ones
const credentials = await client.createOrDeriveApiKey();
console.log(credentials);
// {
// key: "550e8400-e29b-41d4-a716-446655440000",
// secret: "base64EncodedSecretString",
// passphrase: "randomPassphraseString"
// }
```
</Tab>
<Tab title="Python">
```python theme={null}
from py_clob_client_v2 import ClobClient
import os
client = ClobClient(
host="https://clob.polymarket.com",
chain_id=137, # Polygon mainnet
key=os.getenv("PRIVATE_KEY")
)
# Creates new credentials or derives existing ones
credentials = client.create_or_derive_api_key()
print(credentials)
# {
# "apiKey": "550e8400-e29b-41d4-a716-446655440000",
# "secret": "base64EncodedSecretString",
# "passphrase": "randomPassphraseString"
# }
```
</Tab>
<Tab title="Rust">
```rust theme={null}
use std::str::FromStr;
use polymarket_client_sdk_v2::POLYGON;
use polymarket_client_sdk_v2::auth::{LocalSigner, Signer};
use polymarket_client_sdk_v2::clob::{Client, Config};
let private_key = std::env::var("POLYMARKET_PRIVATE_KEY")?;
let signer = LocalSigner::from_str(&private_key)?
.with_chain_id(Some(POLYGON));
// Creates new credentials or derives existing ones,
// then initializes the authenticated client — all in one step
let client = Client::new("https://clob.polymarket.com", Config::default())?
.authentication_builder(&signer)
.authenticate()
.await?;
let credentials = client.credentials();
println!("API Key: {}", credentials.key());
```
</Tab>
</Tabs>
<Warning>
**Never commit private keys to version control.** Always use environment
variables or secure key management systems.
</Warning>
### Using the REST API
While we highly recommend using our provided clients to handle signing and authentication, the following is for developers who choose NOT to use our [Python](https://github.com/Polymarket/py-clob-client-v2) or [TypeScript](https://github.com/Polymarket/clob-client-v2) clients.
**Create API Credentials**
```bash theme={null}
POST https://clob.polymarket.com/auth/api-key
```
**Derive API Credentials**
```bash theme={null}
GET https://clob.polymarket.com/auth/derive-api-key
```
Required L1 headers:
| Header | Description |
| ---------------- | ---------------------- |
| `POLY_ADDRESS` | Polygon signer address |
| `POLY_SIGNATURE` | CLOB EIP-712 signature |
| `POLY_TIMESTAMP` | Current UNIX timestamp |
| `POLY_NONCE` | Nonce (default: 0) |
The `POLY_SIGNATURE` is generated by signing the following EIP-712 struct:
<Accordion title="EIP-712 Signing Example">
<CodeGroup>
```typescript TypeScript theme={null}
const domain = {
name: "ClobAuthDomain",
version: "1",
chainId: chainId, // Polygon Chain ID 137
};
const types = {
ClobAuth: [
{ name: "address", type: "address" },
{ name: "timestamp", type: "string" },
{ name: "nonce", type: "uint256" },
{ name: "message", type: "string" },
],
};
const value = {
address: signingAddress, // The Signing address
timestamp: ts, // The CLOB API server timestamp
nonce: nonce, // The nonce used
message: "This message attests that I control the given wallet",
};
const sig = await signer._signTypedData(domain, types, value);
```
```python Python theme={null}
domain = {
"name": "ClobAuthDomain",
"version": "1",
"chainId": chainId, # Polygon Chain ID 137
}
types = {
"ClobAuth": [
{"name": "address", "type": "address"},
{"name": "timestamp", "type": "string"},
{"name": "nonce", "type": "uint256"},
{"name": "message", "type": "string"},
]
}
value = {
"address": signingAddress, # The signing address
"timestamp": ts, # The CLOB API server timestamp
"nonce": nonce, # The nonce used
"message": "This message attests that I control the given wallet",
}
sig = signer.sign_typed_data(domain, types, value)
```
</CodeGroup>
</Accordion>
Reference implementations:
* [TypeScript](https://github.com/Polymarket/clob-client-v2/blob/main/src/signing/eip712.ts)
* [Python](https://github.com/Polymarket/py-clob-client-v2/blob/main/py_clob_client_v2/signing/eip712.py)
Response:
```json theme={null}
{
"apiKey": "550e8400-e29b-41d4-a716-446655440000",
"secret": "base64EncodedSecretString",
"passphrase": "randomPassphraseString"
}
```
**You'll need all three values for L2 authentication.**
***
## L2 Authentication Headers
All trading endpoints require these 5 headers:
| Header | Description |
| ----------------- | ----------------------------- |
| `POLY_ADDRESS` | Polygon signer address |
| `POLY_SIGNATURE` | HMAC signature for request |
| `POLY_TIMESTAMP` | Current UNIX timestamp |
| `POLY_API_KEY` | User's API `apiKey` value |
| `POLY_PASSPHRASE` | User's API `passphrase` value |
The `POLY_SIGNATURE` for L2 is an HMAC-SHA256 signature created using the user's API credentials `secret` value. Reference implementations can be found in the [TypeScript](https://github.com/Polymarket/clob-client-v2/blob/main/src/signing/hmac.ts) and [Python](https://github.com/Polymarket/py-clob-client-v2/blob/main/py_clob_client_v2/signing/hmac.py) clients.
### CLOB Client
<Tabs>
<Tab title="TypeScript">
```typescript theme={null}
import { ClobClient, Side } from "@polymarket/clob-client-v2";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const signer = createWalletClient({ account, transport: http() });
const depositWalletAddress = process.env.DEPOSIT_WALLET_ADDRESS!;
const client = new ClobClient({
host: "https://clob.polymarket.com",
chain: 137,
signer,
creds: apiCreds, // Generated from L1 auth, API credentials enable L2 methods
signatureType: 3, // POLY_1271, explained below
funderAddress: depositWalletAddress, // deposit wallet funder
});
// Now you can trade!
const order = await client.createAndPostOrder(
{ tokenID: "123456", price: 0.65, size: 100, side: Side.BUY },
{ tickSize: "0.01", negRisk: false }
);
```
</Tab>
<Tab title="Python">
```python theme={null}
from py_clob_client_v2 import ClobClient, OrderArgs, PartialCreateOrderOptions
from py_clob_client_v2.order_builder.constants import BUY
import os
client = ClobClient(
host="https://clob.polymarket.com",
chain_id=137,
key=os.getenv("PRIVATE_KEY"),
creds=api_creds, # Generated from L1 auth, API credentials enable L2 methods
signature_type=3, # POLY_1271, explained below
funder=os.getenv("DEPOSIT_WALLET_ADDRESS")
)
# Now you can trade!
order = client.create_and_post_order(
OrderArgs(token_id="123456", price=0.65, size=100, side=BUY),
options=PartialCreateOrderOptions(tick_size="0.01", neg_risk=False),
)
```
</Tab>
<Tab title="Rust">
```rust theme={null}
use polymarket_client_sdk_v2::clob::types::{Side, SignatureType};
use polymarket_client_sdk_v2::types::dec;
let deposit_wallet = std::env::var("DEPOSIT_WALLET_ADDRESS")?.parse()?;
let client = Client::new("https://clob.polymarket.com", Config::default())?
.authentication_builder(&signer)
.funder(deposit_wallet)
.signature_type(SignatureType::Poly1271)
.authenticate()
.await?;
// Now you can trade!
let order = client.limit_order()
.token_id("123456".parse()?)
.price(dec!(0.65))
.size(dec!(100))
.side(Side::Buy)
.build().await?;
let signed = client.sign(&signer, order).await?;
let response = client.post_order(signed).await?;
```
</Tab>
</Tabs>
<Info>
Even with L2 authentication headers, methods that create user orders still
require the user to sign the order payload.
</Info>
***
## Signature Types and Funder
When initializing the L2 client, you must specify your wallet **signatureType** and the **funder** address which holds the funds:
| Signature Type | Value | Description |
| -------------- | ----- | -------------------------------------------------------------------------------------------------------------------------- |
| EOA | `0` | Standard Ethereum wallet (MetaMask). Funder is the EOA address and will need POL to pay gas on transactions. |
| POLY\_PROXY | `1` | Existing Polymarket proxy wallet flow, commonly used by users who logged in via Magic Link email/Google. |
| GNOSIS\_SAFE | `2` | Existing Gnosis Safe wallet flow. Existing Safe users can continue using this type. |
| POLY\_1271 | `3` | Deposit wallet flow for new API users. The funder is the deposit wallet address and orders are validated through ERC-1271. |
<Tip>
New API users should use deposit wallets with `POLY_1271`. Existing Safe and
Proxy users are unaffected and can keep using their current funder address and
signature type. See the [Deposit Wallet Guide](/trading/deposit-wallets) for
setup details.
</Tip>
***
## Security Best Practices
<AccordionGroup>
<Accordion title="Never expose private keys">
Store private keys in environment variables or secure key management systems. Never commit them to version control.
```bash theme={null}
# .env (never commit this file)
PRIVATE_KEY=0x...
```
</Accordion>
<Accordion title="Implement request signing on the server">
Never expose your API secret in client-side code. All authenticated requests should originate from your backend.
</Accordion>
</AccordionGroup>
***
## Troubleshooting
<AccordionGroup>
<Accordion title="Error - INVALID_SIGNATURE">
Your wallet's private key is incorrect or improperly formatted.
**Solutions:**
* Verify your private key is a valid hex string (starts with "0x")
* Ensure you're using the correct key for the intended address
* Check that the key has proper permissions
</Accordion>
<Accordion title="Error - NONCE_ALREADY_USED">
The nonce you provided has already been used to create an API key.
**Solutions:**
* Use `deriveApiKey()` with the same nonce to retrieve existing credentials
* Or use a different nonce with `createApiKey()`
</Accordion>
<Accordion title="Error - Invalid Funder Address">
Your funder address is incorrect or doesn't match your wallet.
**Solution:** Check your Polymarket profile address at [polymarket.com/settings](https://polymarket.com/settings).
If it does not exist or user has never logged into Polymarket.com, deploy it first before creating L2 authentication.
</Accordion>
<Accordion title="Lost both credentials and nonce">
Unfortunately, there's no way to recover lost API credentials without the nonce. You'll need to create new credentials:
```typescript theme={null}
// Create fresh credentials with a new nonce
const newCreds = await client.createApiKey();
// Save the nonce this time!
```
</Accordion>
</AccordionGroup>
***
## Next Steps
<CardGroup cols={2}>
<Card title="Place Your First Order" icon="plus" href="/trading/quickstart">
Learn how to create and submit orders.
</Card>
<Card title="Geographic Restrictions" icon="globe" href="/api-reference/geoblock">
Check trading availability by region.
</Card>
</CardGroup>
@@ -0,0 +1,128 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create bridge addresses
## OpenAPI
````yaml /api-spec/bridge-openapi.yaml post /deposit
openapi: 3.0.3
info:
title: Polymarket Bridge API
version: 1.0.0
description: HTTP API for Polymarket bridge and swap operations.
servers:
- url: https://bridge.polymarket.com
description: Polymarket Bridge API
security: []
tags:
- name: Bridge
description: Bridge and swap operations for Polymarket
paths:
/deposit:
post:
tags:
- Bridge
summary: Create bridge addresses
parameters:
- $ref: '#/components/parameters/BuilderCodeHeader'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DepositRequest'
example:
address: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
responses:
'201':
description: Bridge addresses created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/DepositResponse'
'400':
description: >-
Bad Request - Invalid address, request body, or malformed
X-Builder-Code
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
parameters:
BuilderCodeHeader:
name: X-Builder-Code
in: header
required: false
description: >
Optional builder code (bytes32 hex) attributing this request to your
integration so transfer issues can be traced to your app. Omitting it
still succeeds but returns a `missing_builder_code` warning; a malformed
code returns 400. Get your code at
https://polymarket.com/settings?tab=builder
schema:
type: string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0x00000000000000000000000000000000000000000000000000000000abcd1234'
schemas:
DepositRequest:
type: object
required:
- address
properties:
address:
$ref: '#/components/schemas/Address'
description: >-
Your Polymarket wallet address where deposited funds will be
credited as pUSD
DepositResponse:
type: object
properties:
address:
type: object
description: Bridge addresses for different blockchain networks
properties:
evm:
type: string
description: >-
EVM-compatible bridge address (Ethereum, Polygon, Arbitrum,
Base, etc.)
example: '0x23566f8b2E82aDfCf01846E54899d110e97AC053'
svm:
type: string
description: Solana Virtual Machine bridge address
example: CrvTBvzryYxBHbWu2TiQpcqD5M7Le7iBKzVmEj3f36Jb
btc:
type: string
description: Bitcoin bridge address
example: bc1q8eau83qffxcj8ht4hsjdza3lha9r3egfqysj3g
note:
type: string
description: Additional information about the bridge addresses
example: >-
Only certain chains and tokens are supported. See /supported-assets
for details.
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
Address:
type: string
description: Ethereum address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
````
@@ -0,0 +1,152 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create withdrawal addresses
## OpenAPI
````yaml /api-spec/bridge-openapi.yaml post /withdraw
openapi: 3.0.3
info:
title: Polymarket Bridge API
version: 1.0.0
description: HTTP API for Polymarket bridge and swap operations.
servers:
- url: https://bridge.polymarket.com
description: Polymarket Bridge API
security: []
tags:
- name: Bridge
description: Bridge and swap operations for Polymarket
paths:
/withdraw:
post:
tags:
- Bridge
summary: Create withdrawal addresses
parameters:
- $ref: '#/components/parameters/BuilderCodeHeader'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WithdrawalRequest'
example:
address: '0x9156dd10bea4c8d7e2d591b633d1694b1d764756'
toChainId: '1'
toTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
recipientAddr: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
responses:
'201':
description: Withdrawal addresses created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/DepositResponse'
example:
address:
evm: '0x23566f8b2E82aDfCf01846E54899d110e97AC053'
svm: CrvTBvzryYxBHbWu2TiQpcqD5M7Le7iBKzVmEj3f36Jb
btc: bc1q8eau83qffxcj8ht4hsjdza3lha9r3egfqysj3g
note: >-
Send funds to these addresses to bridge to your destination
chain and token.
'400':
description: Bad Request - Invalid/missing parameters or malformed X-Builder-Code
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
parameters:
BuilderCodeHeader:
name: X-Builder-Code
in: header
required: false
description: >
Optional builder code (bytes32 hex) attributing this request to your
integration so transfer issues can be traced to your app. Omitting it
still succeeds but returns a `missing_builder_code` warning; a malformed
code returns 400. Get your code at
https://polymarket.com/settings?tab=builder
schema:
type: string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0x00000000000000000000000000000000000000000000000000000000abcd1234'
schemas:
WithdrawalRequest:
type: object
required:
- address
- toChainId
- toTokenAddress
- recipientAddr
properties:
address:
$ref: '#/components/schemas/Address'
description: Source Polymarket wallet address on Polygon
toChainId:
type: string
description: >-
Destination chain ID (e.g., "1" for Ethereum, "8453" for Base,
"1151111081099710" for Solana)
example: '1'
toTokenAddress:
type: string
description: Destination token contract address
example: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
recipientAddr:
type: string
description: Destination wallet address where funds will be sent
example: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
DepositResponse:
type: object
properties:
address:
type: object
description: Bridge addresses for different blockchain networks
properties:
evm:
type: string
description: >-
EVM-compatible bridge address (Ethereum, Polygon, Arbitrum,
Base, etc.)
example: '0x23566f8b2E82aDfCf01846E54899d110e97AC053'
svm:
type: string
description: Solana Virtual Machine bridge address
example: CrvTBvzryYxBHbWu2TiQpcqD5M7Le7iBKzVmEj3f36Jb
btc:
type: string
description: Bitcoin bridge address
example: bc1q8eau83qffxcj8ht4hsjdza3lha9r3egfqysj3g
note:
type: string
description: Additional information about the bridge addresses
example: >-
Only certain chains and tokens are supported. See /supported-assets
for details.
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
Address:
type: string
description: Ethereum address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
````
@@ -0,0 +1,224 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get a quote
## OpenAPI
````yaml /api-spec/bridge-openapi.yaml post /quote
openapi: 3.0.3
info:
title: Polymarket Bridge API
version: 1.0.0
description: HTTP API for Polymarket bridge and swap operations.
servers:
- url: https://bridge.polymarket.com
description: Polymarket Bridge API
security: []
tags:
- name: Bridge
description: Bridge and swap operations for Polymarket
paths:
/quote:
post:
tags:
- Bridge
summary: Get a quote
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/QuoteRequest'
example:
fromAmountBaseUnit: '10000000'
fromChainId: '137'
fromTokenAddress: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359'
recipientAddress: '0x17eC161f126e82A8ba337f4022d574DBEaFef575'
toChainId: '137'
toTokenAddress: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
responses:
'200':
description: Quote retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/QuoteResponse'
example:
estCheckoutTimeMs: 25000
estFeeBreakdown:
appFeeLabel: Fun.xyz fee
appFeePercent: 0
appFeeUsd: 0
fillCostPercent: 0
fillCostUsd: 0
gasUsd: 0.003854
maxSlippage: 0
minReceived: 14.488305
swapImpact: 0
swapImpactUsd: 0
totalImpact: 0
totalImpactUsd: 0
estInputUsd: 14.488305
estOutputUsd: 14.488305
estToTokenBaseUnit: '14491203'
quoteId: >-
0x00c34ba467184b0146406d62b0e60aaa24ed52460bd456222b6155a0d9de0ad5
'400':
description: Bad Request - Missing required field
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
missingFromAmount:
value:
error: fromAmountBaseUnit is required
missingFromChainId:
value:
error: fromChainId is required
missingFromTokenAddress:
value:
error: fromTokenAddress is required
missingRecipientAddress:
value:
error: recipientAddress is required
missingToChainId:
value:
error: toChainId is required
missingToTokenAddress:
value:
error: toTokenAddress is required
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: cannot get quote
components:
schemas:
QuoteRequest:
type: object
required:
- fromAmountBaseUnit
- fromChainId
- fromTokenAddress
- recipientAddress
- toChainId
- toTokenAddress
properties:
fromAmountBaseUnit:
type: string
description: Amount of tokens to send
example: '10000000'
fromChainId:
type: string
description: Source Chain ID
example: '137'
fromTokenAddress:
type: string
description: Source token address
example: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359'
recipientAddress:
type: string
description: Address of the recipient
example: '0x17eC161f126e82A8ba337f4022d574DBEaFef575'
toChainId:
type: string
description: Destination Chain ID
example: '137'
toTokenAddress:
type: string
description: Destination token address
example: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
QuoteResponse:
type: object
properties:
estCheckoutTimeMs:
type: integer
description: Estimated time to complete the checkout in milliseconds
example: 25000
estFeeBreakdown:
$ref: '#/components/schemas/FeeBreakdown'
estInputUsd:
type: number
description: Estimated token amount received in USD
example: 14.488305
estOutputUsd:
type: number
description: Estimated token amount sent in USD
example: 14.488305
estToTokenBaseUnit:
type: string
description: Estimated token amount received
example: '14491203'
quoteId:
type: string
description: Unique quote id of the request
example: '0x00c34ba467184b0146406d62b0e60aaa24ed52460bd456222b6155a0d9de0ad5'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
FeeBreakdown:
type: object
description: Breakdown of the estimated fees
properties:
appFeeLabel:
type: string
description: Label of the app fee
example: Fun.xyz fee
appFeePercent:
type: number
description: App fees as a percentage of the total amount sent
example: 0
appFeeUsd:
type: number
description: App fees in USD
example: 0
fillCostPercent:
type: number
description: Fill cost percentage of the total amount sent
example: 0
fillCostUsd:
type: number
description: Fill cost in USD
example: 0
gasUsd:
type: number
description: Gas fee in USD
example: 0.003854
maxSlippage:
type: number
description: Maximum potential slippage as a percentage
example: 0
minReceived:
type: number
description: Amount after factoring slippage
example: 14.488305
swapImpact:
type: number
description: Swap impact as a percentage of the total amount sent
example: 0
swapImpactUsd:
type: number
description: Swap impact of the transaction in USD
example: 0
totalImpact:
type: number
description: Total impact as a percentage of the total amount sent
example: 0
totalImpactUsd:
type: number
description: Impact cost of the transaction
example: 0
````
@@ -0,0 +1,99 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get supported assets
## OpenAPI
````yaml /api-spec/bridge-openapi.yaml get /supported-assets
openapi: 3.0.3
info:
title: Polymarket Bridge API
version: 1.0.0
description: HTTP API for Polymarket bridge and swap operations.
servers:
- url: https://bridge.polymarket.com
description: Polymarket Bridge API
security: []
tags:
- name: Bridge
description: Bridge and swap operations for Polymarket
paths:
/supported-assets:
get:
tags:
- Bridge
summary: Get supported assets
responses:
'200':
description: Successfully retrieved supported assets
content:
application/json:
schema:
$ref: '#/components/schemas/SupportedAssetsResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
SupportedAssetsResponse:
type: object
properties:
supportedAssets:
type: array
items:
$ref: '#/components/schemas/SupportedAsset'
description: >-
List of supported assets with minimum amounts for deposits and
withdrawals
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
SupportedAsset:
type: object
properties:
chainId:
type: string
description: Chain ID
example: '1'
chainName:
type: string
description: Human-readable chain name
example: Ethereum
token:
$ref: '#/components/schemas/Token'
minCheckoutUsd:
type: number
description: Minimum amount in USD for deposits and withdrawals
example: 45
Token:
type: object
properties:
name:
type: string
description: Full token name
example: USD Coin
symbol:
type: string
description: Token symbol
example: USDC
address:
type: string
description: Token contract address
example: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
decimals:
type: integer
description: Token decimals
example: 6
````
@@ -0,0 +1,154 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get transaction status
## OpenAPI
````yaml /api-spec/bridge-openapi.yaml get /status/{address}
openapi: 3.0.3
info:
title: Polymarket Bridge API
version: 1.0.0
description: HTTP API for Polymarket bridge and swap operations.
servers:
- url: https://bridge.polymarket.com
description: Polymarket Bridge API
security: []
tags:
- name: Bridge
description: Bridge and swap operations for Polymarket
paths:
/status/{address}:
get:
tags:
- Bridge
summary: Get transaction status
parameters:
- name: address
in: path
required: true
description: >-
The address to query for transaction status (EVM, SVM, or BTC
address from the `/deposit` or `/withdraw` response)
schema:
type: string
example: EXoZue2avJae1d45B3fVw2unhkrtToSYQqHtHgfZ2cbE
responses:
'200':
description: Successfully retrieved transaction status
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionStatusResponse'
example:
transactions:
- fromChainId: '1151111081099710'
fromTokenAddress: '11111111111111111111111111111111'
fromAmountBaseUnit: '13566635'
toChainId: '137'
toTokenAddress: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
status: DEPOSIT_DETECTED
- fromChainId: '1151111081099710'
fromTokenAddress: '11111111111111111111111111111111'
fromAmountBaseUnit: '13400000'
toChainId: '137'
toTokenAddress: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
createdTimeMs: 1757646914535
status: PROCESSING
- fromChainId: '1151111081099710'
fromTokenAddress: '11111111111111111111111111111111'
fromAmountBaseUnit: '13500152'
toChainId: '137'
toTokenAddress: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
txHash: >-
3atr19NAiNCYt24RHM1WnzZp47RXskpTDzspJoCBBaMFwUB8fk37hFkxz35P5UEnnmWz21rb2t5wJ8pq3EE2XnxU
createdTimeMs: 1757531217339
status: COMPLETED
'400':
description: Bad Request - Missing address parameter
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: address is required
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: cannot get transaction status
components:
schemas:
TransactionStatusResponse:
type: object
properties:
transactions:
type: array
items:
$ref: '#/components/schemas/Transaction'
description: List of transactions for the given address
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
Transaction:
type: object
properties:
fromChainId:
type: string
description: Source chain ID
example: '1151111081099710'
fromTokenAddress:
type: string
description: Source token contract address
example: '11111111111111111111111111111111'
fromAmountBaseUnit:
type: string
description: Amount in base units (without decimals)
example: '13566635'
toChainId:
type: string
description: Destination chain ID
example: '137'
toTokenAddress:
type: string
description: Destination token contract address
example: '0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB'
status:
type: string
description: >
Current status of the transaction. If a transaction fails, remains
stuck, or funds are held due to a compliance check, direct users to
our Bridge API provider's support
(https://intercom.help/funxyz/en/articles/10732578-contact-us).
enum:
- DEPOSIT_DETECTED
- PROCESSING
- ORIGIN_TX_CONFIRMED
- SUBMITTED
- COMPLETED
- FAILED
example: COMPLETED
txHash:
type: string
description: Transaction hash (only available when status is COMPLETED)
example: >-
3atr19NAiNCYt24RHM1WnzZp47RXskpTDzspJoCBBaMFwUB8fk37hFkxz35P5UEnnmWz21rb2t5wJ8pq3EE2XnxU
createdTimeMs:
type: number
description: >-
Unix timestamp in milliseconds when transaction was created (missing
when status is DEPOSIT_DETECTED)
example: 1757531217339
````
@@ -0,0 +1,122 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get aggregated builder leaderboard
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/builders/leaderboard
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/builders/leaderboard:
get:
tags:
- Builders
summary: Get aggregated builder leaderboard
parameters:
- in: query
name: timePeriod
schema:
type: string
enum:
- DAY
- WEEK
- MONTH
- ALL
default: DAY
description: |
The time period to aggregate results over.
- in: query
name: limit
schema:
type: integer
default: 25
minimum: 0
maximum: 50
description: Maximum number of builders to return
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 1000
description: Starting index for pagination
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/LeaderboardEntry'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
LeaderboardEntry:
type: object
properties:
rank:
type: string
description: The rank position of the builder
builder:
type: string
description: The builder name or identifier
builderCode:
type: string
description: >-
The builder's onchain attribution code as attached to orders via
`builderCode` (see CLOB V2). Empty string for legacy builders
without a registered code.
volume:
type: number
description: Total trading volume attributed to this builder
activeUsers:
type: integer
description: Number of active users for this builder
verified:
type: boolean
description: Whether the builder is verified
builderLogo:
type: string
description: URL to the builder's logo image
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,111 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get daily builder volume time-series
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/builders/volume
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/builders/volume:
get:
tags:
- Builders
summary: Get daily builder volume time-series
parameters:
- in: query
name: timePeriod
schema:
type: string
enum:
- DAY
- WEEK
- MONTH
- ALL
default: DAY
description: |
The time period to fetch daily records for.
responses:
'200':
description: Success - Returns array of daily volume records
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BuilderVolumeEntry'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
BuilderVolumeEntry:
type: object
properties:
dt:
type: string
format: date-time
description: The timestamp for this volume entry in ISO 8601 format
example: '2025-11-15T00:00:00Z'
builder:
type: string
description: The builder name or identifier
builderCode:
type: string
description: >-
The builder's onchain attribution code as attached to orders via
`builderCode` (see CLOB V2). Empty string for legacy builders
without a registered code.
builderLogo:
type: string
description: URL to the builder's logo image
verified:
type: boolean
description: Whether the builder is verified
volume:
type: number
description: Trading volume for this builder on this date
activeUsers:
type: integer
description: Number of active users for this builder on this date
rank:
type: string
description: The rank position of the builder on this date
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,278 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Cancel Orders COID
> Cancel orders by client order ID.
Requires proxy signature, see [proxy signing](/http/signing#2-proxy-signing).
<Badge color="gray" size="md">Request Weight: **1 + floor(n / 20)**</Badge> <Badge color="gray" size="md">Action Weight: **0**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json delete /v1/trade/orders-coid
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/trade/orders-coid:
delete:
summary: Cancel Orders COID
description: >
Cancel orders by client order ID.
Requires proxy signature, see [proxy
signing](/http/signing#2-proxy-signing).
operationId: cancelOrdersByCoid
requestBody:
description: Cancel by coid request.
content:
application/json:
schema:
$ref: '#/components/schemas/CancelByCoidRequest'
responses:
'200':
description: Cancel response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CancelResponse'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
CancelByCoidRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpCancelOrdersByCoid'
- $ref: '#/components/schemas/BaseOp'
- type: object
properties:
exp:
$ref: '#/components/schemas/exp'
CancelResponse:
oneOf:
- $ref: '#/components/schemas/CancelAccepted'
- $ref: '#/components/schemas/CancelRejected'
OpCancelOrdersByCoid:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- cancelOrdersCOID
args:
type: array
description: |
Array of client order IDs to cancel. Cancelling an order that has
attached take-profit / stop-loss children (see `CreateOrder.tr`)
cascades to those children — they are cancelled with reason
`ParentCancelled`.
items:
$ref: '#/components/schemas/coid'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
exp:
type: integer
description: >-
Command expiry timestamp in Unix milliseconds. If provided, it must be
in the future and within the gateway's default command timeout. It can
shorten request validity but cannot extend it. This is not an order
auto-cancel time.
example: 1767225600000
CancelAccepted:
type: object
required:
- status
- oid
properties:
status:
type: string
enum:
- ok
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
description: Echoed only when the request carried a client_order_id.
CancelRejected:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
error:
$ref: '#/components/schemas/error'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
coid:
type: string
description: Client order ID
minLength: 32
maxLength: 32
pattern: ^[0-9a-f]{32}$
example: 550e8400e29b41d4a716446655440000
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
oid:
type: integer
description: Order ID
example: 1234567890
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,277 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Cancel Orders
> Cancel orders.
Requires proxy signature, see [proxy signing](/http/signing#2-proxy-signing).
<Badge color="gray" size="md">Request Weight: **1 + floor(n / 20)**</Badge> <Badge color="gray" size="md">Action Weight: **0**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json delete /v1/trade/orders
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/trade/orders:
delete:
summary: Cancel Orders
description: >
Cancel orders.
Requires proxy signature, see [proxy
signing](/http/signing#2-proxy-signing).
operationId: cancelOrders
requestBody:
description: Cancel request.
content:
application/json:
schema:
$ref: '#/components/schemas/CancelRequest'
responses:
'200':
description: Cancel response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/CancelResponse'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
CancelRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpCancelOrders'
- $ref: '#/components/schemas/BaseOp'
- type: object
properties:
exp:
$ref: '#/components/schemas/exp'
CancelResponse:
oneOf:
- $ref: '#/components/schemas/CancelAccepted'
- $ref: '#/components/schemas/CancelRejected'
OpCancelOrders:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- cancelOrders
args:
type: array
description: |
Array of order IDs to cancel. Cancelling an order that has attached
take-profit / stop-loss children (see `CreateOrder.tr`) cascades to
those children — they are cancelled with reason `ParentCancelled`.
items:
$ref: '#/components/schemas/oid'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
exp:
type: integer
description: >-
Command expiry timestamp in Unix milliseconds. If provided, it must be
in the future and within the gateway's default command timeout. It can
shorten request validity but cannot extend it. This is not an order
auto-cancel time.
example: 1767225600000
CancelAccepted:
type: object
required:
- status
- oid
properties:
status:
type: string
enum:
- ok
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
description: Echoed only when the request carried a client_order_id.
CancelRejected:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
error:
$ref: '#/components/schemas/error'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
oid:
type: integer
description: Order ID
example: 1234567890
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
coid:
type: string
description: Client order ID
minLength: 32
maxLength: 32
pattern: ^[0-9a-f]{32}$
example: 550e8400e29b41d4a716446655440000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,162 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Check Invite Code
> Check whether an invite code can be used. When `address` is provided, the
response is invalid if that address already has an account.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/invite
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/invite:
get:
summary: Check Invite Code
description: >
Check whether an invite code can be used. When `address` is provided,
the
response is invalid if that address already has an account.
operationId: checkInviteCode
parameters:
- name: code
in: query
required: true
schema:
$ref: '#/components/schemas/code'
- name: address
in: query
required: false
schema:
$ref: '#/components/schemas/address'
responses:
'200':
description: Invite code validation response.
content:
application/json:
schema:
$ref: '#/components/schemas/InviteCheckResponse'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
code:
type: string
description: Referral or invite code
example: ABC123
address:
type: string
description: Address
example: '0x1234567890abcdef1234567890abcdef12345678'
InviteCheckResponse:
type: object
required:
- valid
properties:
valid:
type: boolean
description: Whether the invite code can be used.
error:
type: string
description: Present when the invite code is invalid or unusable.
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,99 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Clients & SDKs
> Official open-source libraries for interacting with Polymarket
Polymarket provides official open-source clients in TypeScript, Python, and Rust. All three support the full CLOB API including market data, order management, and authentication.
## Installation
<CodeGroup>
```bash TypeScript theme={null}
npm install @polymarket/clob-client-v2 viem
```
```bash Python theme={null}
pip install py-clob-client-v2
```
```bash Rust theme={null}
cargo add polymarket_client_sdk_v2 --features clob
```
</CodeGroup>
## Quick Example
<CodeGroup>
```typescript TypeScript theme={null}
import { ClobClient } from "@polymarket/clob-client-v2";
const client = new ClobClient({
host: "https://clob.polymarket.com",
chain: 137,
signer,
creds: apiCreds,
});
const markets = await client.getMarkets();
```
```python Python theme={null}
from py_clob_client_v2 import ClobClient
client = ClobClient(
"https://clob.polymarket.com",
key=private_key,
chain_id=137,
creds=api_creds,
)
markets = client.get_markets()
```
```rust Rust theme={null}
use polymarket_client_sdk_v2::clob::{Client, Config};
let client = Client::new("https://clob.polymarket.com", Config::default())?
.authentication_builder(&signer)
.authenticate()
.await?;
let markets = client.markets(None).await?;
```
</CodeGroup>
## Source Code
| Language | Package | Repository |
| ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ |
| TypeScript | `@polymarket/clob-client-v2` | [github.com/Polymarket/clob-client-v2](https://github.com/Polymarket/clob-client-v2) |
| Python | `py-clob-client-v2` | [github.com/Polymarket/py-clob-client-v2](https://github.com/Polymarket/py-clob-client-v2) |
| Rust | `polymarket_client_sdk_v2` | [github.com/Polymarket/rs-clob-client-v2](https://github.com/Polymarket/rs-clob-client-v2) |
Each repository includes working examples in the `/examples` directory.
## Relayer SDK
For [gasless transactions](/trading/gasless), the relayer client handles deposit
wallet creation and signed wallet batches for new API users. Existing Safe and
Proxy wallet flows remain supported.
| Language | Package | Repository |
| ---------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
| TypeScript | `@polymarket/builder-relayer-client` | [github.com/Polymarket/builder-relayer-client](https://github.com/Polymarket/builder-relayer-client) |
| Python | `py-builder-relayer-client` | [github.com/Polymarket/py-builder-relayer-client](https://github.com/Polymarket/py-builder-relayer-client) |
## Next Steps
<CardGroup cols={2}>
<Card title="Quickstart" icon="rocket" href="/quickstart">
Set up your client and place your first order.
</Card>
<Card title="Authentication" icon="lock" href="/api-reference/authentication">
Understand L1/L2 auth and API credentials.
</Card>
</CardGroup>
@@ -0,0 +1,218 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get combo markets
> Returns active markets that can be used as combo legs, ordered by volume
descending. This endpoint is public and does not require CLOB
authentication.
Entries in `position_ids`, `outcomes`, and `outcome_prices` correspond by
array index (`[0]` is YES, `[1]` is NO). Use `next_cursor` unchanged in
the next request; a value of `null` indicates the final page.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml get /v1/rfq/combo-markets
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/rfq/combo-markets:
get:
tags:
- Combo Markets
summary: Get combo markets
description: >
Returns active markets that can be used as combo legs, ordered by volume
descending. This endpoint is public and does not require CLOB
authentication.
Entries in `position_ids`, `outcomes`, and `outcome_prices` correspond
by
array index (`[0]` is YES, `[1]` is NO). Use `next_cursor` unchanged in
the next request; a value of `null` indicates the final page.
operationId: getComboMarkets
parameters:
- name: limit
in: query
required: false
description: Number of markets to return. Defaults to `50`; maximum `100`.
schema:
type: integer
minimum: 1
maximum: 100
default: 50
- name: cursor
in: query
required: false
description: Opaque cursor returned as `next_cursor` by the previous response.
schema:
type: string
- name: exclude
in: query
required: false
description: >-
Comma-separated condition IDs to omit, such as markets already
shown.
schema:
type: string
example: 0x4cd7...110ff,0x0391ab0e...
responses:
'200':
description: Catalog page of combo-able markets
content:
application/json:
schema:
$ref: '#/components/schemas/ComboMarketsResponse'
example:
markets:
- id: '1897034'
condition_id: 0x4cd7...110ff
position_ids:
- 1012585...362880
- 1012585...362881
slug: fifwc-mex-rsa-2026-06-11-mex
title: Will Mexico win on 2026-06-11?
outcomes:
- 'Yes'
- 'No'
outcome_prices:
- '0.685'
- '0.315'
image: https://...
volume: 330327.7128580074
tags:
- sports
- soccer
- games
- world-cup
next_cursor: Mg
'400':
$ref: '#/components/responses/BadRequest'
security: []
components:
schemas:
ComboMarketsResponse:
type: object
properties:
markets:
type: array
items:
$ref: '#/components/schemas/ComboMarket'
next_cursor:
type:
- string
- 'null'
description: Cursor for the next page, or `null` on the final page.
required:
- markets
- next_cursor
ComboMarket:
type: object
properties:
id:
type: string
condition_id:
type: string
position_ids:
type: array
description: Combo position IDs; `[0]` is YES, `[1]` is NO.
items:
type: string
slug:
type: string
title:
type: string
outcomes:
type: array
items:
type: string
outcome_prices:
type: array
items:
type: string
image:
type: string
volume:
type: number
format: double
tags:
type: array
items:
type: string
required:
- id
- condition_id
- position_ids
- slug
- title
- outcomes
- outcome_prices
- image
- volume
- tags
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
````
@@ -0,0 +1,212 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get comments by comment id
## OpenAPI
````yaml /api-spec/gamma-openapi.yaml get /comments/{id}
openapi: 3.0.3
info:
title: Markets API
version: 1.0.0
description: REST API specification for public endpoints used by the Markets service.
servers:
- url: https://gamma-api.polymarket.com
description: Polymarket Gamma API Production Server
security: []
tags:
- name: Gamma Status
description: Gamma API status and health check
- name: Sports
description: Sports-related endpoints including teams and game data
- name: Tags
description: Tag management and related tag operations
- name: Events
description: Event management and event-related operations
- name: Markets
description: Market data and market-related operations
- name: Comments
description: Comment system and user interactions
- name: Series
description: Series management and related operations
- name: Profiles
description: User profile management
- name: Search
description: Search functionality across different entity types
paths:
/comments/{id}:
get:
tags:
- Comments
summary: Get comments by comment id
operationId: getCommentsById
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: get_positions
in: query
schema:
type: boolean
responses:
'200':
description: Comments
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Comment'
components:
schemas:
Comment:
type: object
properties:
id:
type: string
body:
type: string
nullable: true
parentEntityType:
type: string
nullable: true
parentEntityID:
type: integer
nullable: true
parentCommentID:
type: string
nullable: true
userAddress:
type: string
nullable: true
replyAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
updatedAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
reactions:
type: array
items:
$ref: '#/components/schemas/Reaction'
reportCount:
type: integer
nullable: true
reactionCount:
type: integer
nullable: true
CommentProfile:
type: object
properties:
name:
type: string
nullable: true
pseudonym:
type: string
nullable: true
displayUsernamePublic:
type: boolean
nullable: true
bio:
type: string
nullable: true
isMod:
type: boolean
nullable: true
isCreator:
type: boolean
nullable: true
proxyWallet:
type: string
nullable: true
baseAddress:
type: string
nullable: true
profileImage:
type: string
nullable: true
profileImageOptimized:
$ref: '#/components/schemas/ImageOptimization'
positions:
type: array
items:
$ref: '#/components/schemas/CommentPosition'
Reaction:
type: object
properties:
id:
type: string
commentID:
type: integer
nullable: true
reactionType:
type: string
nullable: true
icon:
type: string
nullable: true
userAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
ImageOptimization:
type: object
properties:
id:
type: string
imageUrlSource:
type: string
nullable: true
imageUrlOptimized:
type: string
nullable: true
imageSizeKbSource:
type: number
nullable: true
imageSizeKbOptimized:
type: number
nullable: true
imageOptimizedComplete:
type: boolean
nullable: true
imageOptimizedLastUpdated:
type: string
nullable: true
relID:
type: integer
nullable: true
field:
type: string
nullable: true
relname:
type: string
nullable: true
CommentPosition:
type: object
properties:
tokenId:
type: string
nullable: true
positionSize:
type: string
nullable: true
````
@@ -0,0 +1,237 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get comments by user address
## OpenAPI
````yaml /api-spec/gamma-openapi.yaml get /comments/user_address/{user_address}
openapi: 3.0.3
info:
title: Markets API
version: 1.0.0
description: REST API specification for public endpoints used by the Markets service.
servers:
- url: https://gamma-api.polymarket.com
description: Polymarket Gamma API Production Server
security: []
tags:
- name: Gamma Status
description: Gamma API status and health check
- name: Sports
description: Sports-related endpoints including teams and game data
- name: Tags
description: Tag management and related tag operations
- name: Events
description: Event management and event-related operations
- name: Markets
description: Market data and market-related operations
- name: Comments
description: Comment system and user interactions
- name: Series
description: Series management and related operations
- name: Profiles
description: User profile management
- name: Search
description: Search functionality across different entity types
paths:
/comments/user_address/{user_address}:
get:
tags:
- Comments
- Profiles
summary: Get comments by user address
operationId: getCommentsByUserAddress
parameters:
- name: user_address
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/order'
- $ref: '#/components/parameters/ascending'
responses:
'200':
description: Comments
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Comment'
components:
parameters:
limit:
name: limit
in: query
schema:
type: integer
minimum: 0
offset:
name: offset
in: query
schema:
type: integer
minimum: 0
order:
name: order
in: query
schema:
type: string
description: Comma-separated list of fields to order by
ascending:
name: ascending
in: query
schema:
type: boolean
schemas:
Comment:
type: object
properties:
id:
type: string
body:
type: string
nullable: true
parentEntityType:
type: string
nullable: true
parentEntityID:
type: integer
nullable: true
parentCommentID:
type: string
nullable: true
userAddress:
type: string
nullable: true
replyAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
updatedAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
reactions:
type: array
items:
$ref: '#/components/schemas/Reaction'
reportCount:
type: integer
nullable: true
reactionCount:
type: integer
nullable: true
CommentProfile:
type: object
properties:
name:
type: string
nullable: true
pseudonym:
type: string
nullable: true
displayUsernamePublic:
type: boolean
nullable: true
bio:
type: string
nullable: true
isMod:
type: boolean
nullable: true
isCreator:
type: boolean
nullable: true
proxyWallet:
type: string
nullable: true
baseAddress:
type: string
nullable: true
profileImage:
type: string
nullable: true
profileImageOptimized:
$ref: '#/components/schemas/ImageOptimization'
positions:
type: array
items:
$ref: '#/components/schemas/CommentPosition'
Reaction:
type: object
properties:
id:
type: string
commentID:
type: integer
nullable: true
reactionType:
type: string
nullable: true
icon:
type: string
nullable: true
userAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
ImageOptimization:
type: object
properties:
id:
type: string
imageUrlSource:
type: string
nullable: true
imageUrlOptimized:
type: string
nullable: true
imageSizeKbSource:
type: number
nullable: true
imageSizeKbOptimized:
type: number
nullable: true
imageOptimizedComplete:
type: boolean
nullable: true
imageOptimizedLastUpdated:
type: string
nullable: true
relID:
type: integer
nullable: true
field:
type: string
nullable: true
relname:
type: string
nullable: true
CommentPosition:
type: object
properties:
tokenId:
type: string
nullable: true
positionSize:
type: string
nullable: true
````
@@ -0,0 +1,251 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# List comments
## OpenAPI
````yaml /api-spec/gamma-openapi.yaml get /comments
openapi: 3.0.3
info:
title: Markets API
version: 1.0.0
description: REST API specification for public endpoints used by the Markets service.
servers:
- url: https://gamma-api.polymarket.com
description: Polymarket Gamma API Production Server
security: []
tags:
- name: Gamma Status
description: Gamma API status and health check
- name: Sports
description: Sports-related endpoints including teams and game data
- name: Tags
description: Tag management and related tag operations
- name: Events
description: Event management and event-related operations
- name: Markets
description: Market data and market-related operations
- name: Comments
description: Comment system and user interactions
- name: Series
description: Series management and related operations
- name: Profiles
description: User profile management
- name: Search
description: Search functionality across different entity types
paths:
/comments:
get:
tags:
- Comments
summary: List comments
operationId: listComments
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/offset'
- $ref: '#/components/parameters/order'
- $ref: '#/components/parameters/ascending'
- name: parent_entity_type
in: query
schema:
type: string
enum:
- Event
- Series
- market
- name: parent_entity_id
in: query
schema:
type: integer
- name: get_positions
in: query
schema:
type: boolean
- name: holders_only
in: query
schema:
type: boolean
responses:
'200':
description: List of comments
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Comment'
components:
parameters:
limit:
name: limit
in: query
schema:
type: integer
minimum: 0
offset:
name: offset
in: query
schema:
type: integer
minimum: 0
order:
name: order
in: query
schema:
type: string
description: Comma-separated list of fields to order by
ascending:
name: ascending
in: query
schema:
type: boolean
schemas:
Comment:
type: object
properties:
id:
type: string
body:
type: string
nullable: true
parentEntityType:
type: string
nullable: true
parentEntityID:
type: integer
nullable: true
parentCommentID:
type: string
nullable: true
userAddress:
type: string
nullable: true
replyAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
updatedAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
reactions:
type: array
items:
$ref: '#/components/schemas/Reaction'
reportCount:
type: integer
nullable: true
reactionCount:
type: integer
nullable: true
CommentProfile:
type: object
properties:
name:
type: string
nullable: true
pseudonym:
type: string
nullable: true
displayUsernamePublic:
type: boolean
nullable: true
bio:
type: string
nullable: true
isMod:
type: boolean
nullable: true
isCreator:
type: boolean
nullable: true
proxyWallet:
type: string
nullable: true
baseAddress:
type: string
nullable: true
profileImage:
type: string
nullable: true
profileImageOptimized:
$ref: '#/components/schemas/ImageOptimization'
positions:
type: array
items:
$ref: '#/components/schemas/CommentPosition'
Reaction:
type: object
properties:
id:
type: string
commentID:
type: integer
nullable: true
reactionType:
type: string
nullable: true
icon:
type: string
nullable: true
userAddress:
type: string
nullable: true
createdAt:
type: string
format: date-time
nullable: true
profile:
$ref: '#/components/schemas/CommentProfile'
ImageOptimization:
type: object
properties:
id:
type: string
imageUrlSource:
type: string
nullable: true
imageUrlOptimized:
type: string
nullable: true
imageSizeKbSource:
type: number
nullable: true
imageSizeKbOptimized:
type: number
nullable: true
imageOptimizedComplete:
type: boolean
nullable: true
imageOptimizedLastUpdated:
type: string
nullable: true
relID:
type: integer
nullable: true
field:
type: string
nullable: true
relname:
type: string
nullable: true
CommentPosition:
type: object
properties:
tokenId:
type: string
nullable: true
positionSize:
type: string
nullable: true
````
@@ -0,0 +1,194 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get closed positions for a user
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /closed-positions
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/closed-positions:
get:
tags:
- Core
summary: Get closed positions for a user
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
description: The address of the user in question
- in: query
name: market
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
description: >-
The conditionId of the market in question. Supports multiple csv
separated values. Cannot be used with the eventId param.
- in: query
name: title
schema:
type: string
maxLength: 100
description: Filter by market title
- in: query
name: eventId
style: form
explode: false
schema:
type: array
items:
type: integer
minimum: 1
description: >-
The event id of the event in question. Supports multiple csv
separated values. Returns positions for all markets for those event
ids. Cannot be used with the market param.
- in: query
name: limit
schema:
type: integer
default: 10
minimum: 0
maximum: 50
description: The max number of positions to return
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 100000
description: The starting index for pagination
- in: query
name: sortBy
schema:
type: string
enum:
- REALIZEDPNL
- TITLE
- PRICE
- AVGPRICE
- TIMESTAMP
default: REALIZEDPNL
description: The sort criteria
- in: query
name: sortDirection
schema:
type: string
enum:
- ASC
- DESC
default: DESC
description: The sort direction
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ClosedPosition'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
ClosedPosition:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
asset:
type: string
conditionId:
$ref: '#/components/schemas/Hash64'
avgPrice:
type: number
totalBought:
type: number
realizedPnl:
type: number
curPrice:
type: number
timestamp:
type: integer
format: int64
title:
type: string
slug:
type: string
icon:
type: string
eventSlug:
type: string
outcome:
type: string
outcomeIndex:
type: integer
oppositeOutcome:
type: string
oppositeAsset:
type: string
endDate:
type: string
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,221 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get current positions for a user
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /positions
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/positions:
get:
tags:
- Core
summary: Get current positions for a user
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
description: User address (required)
- in: query
name: market
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
description: >-
Comma-separated list of condition IDs. Mutually exclusive with
eventId.
- in: query
name: eventId
style: form
explode: false
schema:
type: array
items:
type: integer
minimum: 1
description: Comma-separated list of event IDs. Mutually exclusive with market.
- in: query
name: sizeThreshold
schema:
type: number
default: 1
minimum: 0
- in: query
name: redeemable
schema:
type: boolean
default: false
- in: query
name: mergeable
schema:
type: boolean
default: false
- in: query
name: limit
schema:
type: integer
default: 100
minimum: 0
maximum: 500
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
- in: query
name: sortBy
schema:
type: string
enum:
- CURRENT
- INITIAL
- TOKENS
- CASHPNL
- PERCENTPNL
- TITLE
- RESOLVING
- PRICE
- AVGPRICE
default: TOKENS
- in: query
name: sortDirection
schema:
type: string
enum:
- ASC
- DESC
default: DESC
- in: query
name: title
schema:
type: string
maxLength: 100
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Position'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
Position:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
asset:
type: string
conditionId:
$ref: '#/components/schemas/Hash64'
size:
type: number
avgPrice:
type: number
initialValue:
type: number
currentValue:
type: number
cashPnl:
type: number
percentPnl:
type: number
totalBought:
type: number
realizedPnl:
type: number
percentRealizedPnl:
type: number
curPrice:
type: number
redeemable:
type: boolean
mergeable:
type: boolean
title:
type: string
slug:
type: string
icon:
type: string
eventSlug:
type: string
outcome:
type: string
outcomeIndex:
type: integer
oppositeOutcome:
type: string
oppositeAsset:
type: string
endDate:
type: string
negativeRisk:
type: boolean
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,193 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get positions for a market
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/market-positions
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/market-positions:
get:
tags:
- Core
summary: Get positions for a market
parameters:
- in: query
name: market
required: true
schema:
$ref: '#/components/schemas/Hash64'
description: The condition ID of the market to query positions for
- in: query
name: user
schema:
$ref: '#/components/schemas/Address'
description: Filter to a single user by proxy wallet address
- in: query
name: status
schema:
type: string
enum:
- OPEN
- CLOSED
- ALL
default: ALL
description: |
Filter positions by status.
- `OPEN` — Only positions with size > 0.01
- `CLOSED` — Only positions with size <= 0.01
- `ALL` — All positions regardless of size
- in: query
name: sortBy
schema:
type: string
enum:
- TOKENS
- CASH_PNL
- REALIZED_PNL
- TOTAL_PNL
default: TOTAL_PNL
description: |
Sort positions by:
- `TOKENS` — Position size (number of tokens)
- `CASH_PNL` — Unrealized cash PnL
- `REALIZED_PNL` — Realized PnL
- `TOTAL_PNL` — Total PnL (cash_pnl + realized_pnl)
- in: query
name: sortDirection
schema:
type: string
enum:
- ASC
- DESC
default: DESC
- in: query
name: limit
schema:
type: integer
default: 50
minimum: 0
maximum: 500
description: Max number of positions to return per outcome token
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
description: Pagination offset per outcome token
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/MetaMarketPositionV1'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
MetaMarketPositionV1:
type: object
properties:
token:
type: string
description: The outcome token asset ID
positions:
type: array
items:
$ref: '#/components/schemas/MarketPositionV1'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
MarketPositionV1:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
name:
type: string
profileImage:
type: string
verified:
type: boolean
asset:
type: string
conditionId:
$ref: '#/components/schemas/Hash64'
avgPrice:
type: number
size:
type: number
currPrice:
type: number
currentValue:
type: number
cashPnl:
type: number
totalBought:
type: number
realizedPnl:
type: number
totalPnl:
type: number
outcome:
type: string
outcomeIndex:
type: integer
````
@@ -0,0 +1,140 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get top holders for markets
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /holders
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/holders:
get:
tags:
- Core
summary: Get top holders for markets
parameters:
- in: query
name: limit
schema:
type: integer
default: 20
minimum: 0
maximum: 20
description: Maximum number of holders to return per token. Capped at 20.
- in: query
name: market
required: true
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
description: Comma-separated list of condition IDs.
- in: query
name: minBalance
schema:
type: integer
default: 1
minimum: 0
maximum: 999999
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/MetaHolder'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
MetaHolder:
type: object
properties:
token:
type: string
holders:
type: array
items:
$ref: '#/components/schemas/Holder'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
Holder:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
bio:
type: string
asset:
type: string
pseudonym:
type: string
amount:
type: number
displayUsernamePublic:
type: boolean
outcomeIndex:
type: integer
name:
type: string
profileImage:
type: string
profileImageOptimized:
type: string
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
````
@@ -0,0 +1,97 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get total value of a user's positions
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /value
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/value:
get:
tags:
- Core
summary: Get total value of a user's positions
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: market
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Value'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
Value:
type: object
properties:
user:
$ref: '#/components/schemas/Address'
value:
type: number
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,162 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get trader leaderboard rankings
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/leaderboard
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/leaderboard:
get:
tags:
- Core
summary: Get trader leaderboard rankings
parameters:
- in: query
name: category
schema:
type: string
enum:
- OVERALL
- POLITICS
- SPORTS
- ESPORTS
- CRYPTO
- CULTURE
- MENTIONS
- WEATHER
- ECONOMICS
- TECH
- FINANCE
default: OVERALL
description: Market category for the leaderboard
- in: query
name: timePeriod
schema:
type: string
enum:
- DAY
- WEEK
- MONTH
- ALL
default: DAY
description: Time period for leaderboard results
- in: query
name: orderBy
schema:
type: string
enum:
- PNL
- VOL
default: PNL
description: Leaderboard ordering criteria
- in: query
name: limit
schema:
type: integer
default: 25
minimum: 1
maximum: 50
description: Max number of leaderboard traders to return
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 1000
description: Starting index for pagination
- in: query
name: user
schema:
$ref: '#/components/schemas/Address'
description: Limit leaderboard to a single user by address
- in: query
name: userName
schema:
type: string
description: Limit leaderboard to a single username
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/TraderLeaderboardEntry'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
TraderLeaderboardEntry:
type: object
properties:
rank:
type: string
description: The rank position of the trader
proxyWallet:
$ref: '#/components/schemas/Address'
userName:
type: string
description: The trader's username
vol:
type: number
description: Trading volume for this trader
pnl:
type: number
description: Profit and loss for this trader
profileImage:
type: string
description: URL to the trader's profile image
xUsername:
type: string
description: The trader's X (Twitter) username
verifiedBadge:
type: boolean
description: Whether the trader has a verified badge
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,210 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get trades for a user or markets
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /trades
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/trades:
get:
tags:
- Core
summary: Get trades for a user or markets
parameters:
- in: query
name: limit
schema:
type: integer
default: 100
minimum: 0
maximum: 10000
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
- in: query
name: takerOnly
schema:
type: boolean
default: true
- in: query
name: filterType
schema:
type: string
enum:
- CASH
- TOKENS
description: Must be provided together with filterAmount.
- in: query
name: filterAmount
schema:
type: number
minimum: 0
description: Must be provided together with filterType.
- in: query
name: market
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
description: >-
Comma-separated list of condition IDs. Mutually exclusive with
eventId.
- in: query
name: eventId
style: form
explode: false
schema:
type: array
items:
type: integer
minimum: 1
description: Comma-separated list of event IDs. Mutually exclusive with market.
- in: query
name: user
schema:
$ref: '#/components/schemas/Address'
- in: query
name: side
schema:
type: string
enum:
- BUY
- SELL
- in: query
name: start
schema:
type: integer
minimum: 0
description: >-
Lower-bound timestamp (epoch seconds) for the trade window. Omit or
pass `0` for the default window (most recent ~3 years); pass a
positive epoch (e.g. `1`) to retrieve full history.
- in: query
name: end
schema:
type: integer
minimum: 0
description: >-
Upper-bound timestamp (epoch seconds) for the trade window. Omit for
the default (current time); rows newer than `end` are excluded.
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Trade'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
Trade:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
side:
type: string
enum:
- BUY
- SELL
asset:
type: string
conditionId:
$ref: '#/components/schemas/Hash64'
size:
type: number
price:
type: number
timestamp:
type: integer
format: int64
title:
type: string
slug:
type: string
icon:
type: string
eventSlug:
type: string
outcome:
type: string
outcomeIndex:
type: integer
name:
type: string
pseudonym:
type: string
bio:
type: string
profileImage:
type: string
profileImageOptimized:
type: string
transactionHash:
type: string
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,255 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get user activity
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /activity
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/activity:
get:
tags:
- Core
summary: Get user activity
parameters:
- in: query
name: limit
schema:
type: integer
default: 100
minimum: 0
maximum: 500
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: market
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/Hash64'
description: >-
Comma-separated list of condition IDs. Mutually exclusive with
eventId.
- in: query
name: eventId
style: form
explode: false
schema:
type: array
items:
type: integer
minimum: 1
description: Comma-separated list of event IDs. Mutually exclusive with market.
- in: query
name: type
style: form
explode: false
schema:
type: array
items:
type: string
enum:
- TRADE
- SPLIT
- MERGE
- REDEEM
- REWARD
- CONVERSION
- DEPOSIT
- WITHDRAWAL
- YIELD
- MAKER_REBATE
- TAKER_REBATE
- REFERRAL_REWARD
- in: query
name: start
schema:
type: integer
minimum: 0
description: >-
Lower-bound timestamp (epoch seconds) for the activity window. Omit
or pass `0` for the default window (most recent ~3 years); pass a
positive epoch (e.g. `1`) to retrieve full history.
- in: query
name: end
schema:
type: integer
minimum: 0
description: >-
Upper-bound timestamp (epoch seconds) for the activity window. Omit
for the default (current time); rows newer than `end` are excluded.
- in: query
name: sortBy
schema:
type: string
enum:
- TIMESTAMP
- TOKENS
- CASH
default: TIMESTAMP
- in: query
name: sortDirection
schema:
type: string
enum:
- ASC
- DESC
default: DESC
- in: query
name: side
schema:
type: string
enum:
- BUY
- SELL
responses:
'200':
description: Success
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Activity'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
Hash64:
type: string
description: 0x-prefixed 64-hex string
pattern: ^0x[a-fA-F0-9]{64}$
example: '0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917'
Activity:
type: object
properties:
proxyWallet:
$ref: '#/components/schemas/Address'
timestamp:
type: integer
format: int64
conditionId:
$ref: '#/components/schemas/Hash64'
type:
type: string
enum:
- TRADE
- SPLIT
- MERGE
- REDEEM
- REWARD
- CONVERSION
- DEPOSIT
- WITHDRAWAL
- YIELD
- MAKER_REBATE
- TAKER_REBATE
- REFERRAL_REWARD
size:
type: number
usdcSize:
type: number
transactionHash:
type: string
price:
type: number
asset:
type: string
side:
type: string
enum:
- BUY
- SELL
outcomeIndex:
type: integer
title:
type: string
slug:
type: string
icon:
type: string
eventSlug:
type: string
outcome:
type: string
name:
type: string
pseudonym:
type: string
bio:
type: string
profileImage:
type: string
profileImageOptimized:
type: string
isCombo:
type: boolean
description: >-
True when this row is part of a combinatorial (multi-market)
position. Flag only — combo detail is not embedded here. The row's
conditionId equals the combo's combo_condition_id; pass it to
/v1/activity/combos or /v1/positions/combos via market_id to fetch
legs and detail. Omitted on non-combo rows.
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
````
@@ -0,0 +1,280 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get user combo activity
> Combo lifecycle and redeem events (split / merge / convert / compress / wrap / unwrap / redeem) for a user, with per-leg breakdown. The combo counterpart to /activity trade rows. Also available at /v1/data/user/{address}/activity/combos (address from the path).
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/activity/combos
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/activity/combos:
get:
tags:
- Core
summary: Get user combo activity
description: >-
Combo lifecycle and redeem events (split / merge / convert / compress /
wrap / unwrap / redeem) for a user, with per-leg breakdown. The combo
counterpart to /activity trade rows. Also available at
/v1/data/user/{address}/activity/combos (address from the path).
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: market_id
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/ComboConditionId'
description: >-
Comma-separated combo_condition_id values to filter to specific
combos. These equal the market_id of isCombo rows on /activity. Omit
for all of the user's combo activity.
- in: query
name: limit
schema:
type: integer
default: 50
minimum: 0
maximum: 500
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
- in: query
name: cursor
schema:
type: string
description: >-
Opaque continuation token from a previous response's
pagination.next_cursor. When present it supersedes offset (which is
ignored). Invalid, tampered, or cross-endpoint tokens return 400.
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/CombosActivityResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
ComboConditionId:
type: string
description: >-
Combo condition ID (0x-prefixed, 62 hex chars / bytes31). Equals the
market_id (unified) / conditionId (legacy) of isCombo rows on /activity.
pattern: ^0x[a-fA-F0-9]{62}$
example: '0x0391ab0ebea17b65ba87e071b0566e816b0000000000000000000000000000'
CombosActivityResponse:
type: object
properties:
activity:
type: array
items:
$ref: '#/components/schemas/ComboActivity'
pagination:
$ref: '#/components/schemas/Pagination'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
ComboActivity:
type: object
properties:
id:
type: string
event_kind:
type: string
description: >-
Raw on-chain event, e.g. PositionsSplit, PositionsMerged,
PositionRedeemed.
side:
type: string
description: Normalized label for rendering.
enum:
- Split
- Merge
- Convert
- Compress
- Wrap
- Unwrap
- Redeem
module_kind:
type: string
description: Always Combinatorial.
user_address:
$ref: '#/components/schemas/Address'
combo_condition_id:
$ref: '#/components/schemas/ComboConditionId'
combo_position_id:
type: string
module_id:
type: integer
amount_usdc:
type: number
nullable: true
description: Lifecycle amount; null on redeems.
payout_usdc:
type: number
nullable: true
description: Redeem payout; null on lifecycle events.
timestamp:
type: integer
format: int64
tx_dttm:
type: string
description: RFC3339 UTC
tx_hash:
type: string
log_index:
type: integer
block_number:
type: integer
format: int64
legs:
type: array
items:
$ref: '#/components/schemas/ComboLeg'
Pagination:
type: object
description: >-
Standard pagination metadata. No total count; has_more is derived from
page fullness. next_cursor is opaque.
properties:
limit:
type: integer
offset:
type: integer
has_more:
type: boolean
next_cursor:
type: string
nullable: true
description: >-
Opaque signed cursor for the next page; null when has_more is false.
Pass it back verbatim as ?cursor= on the next request (keep the same
sort where the endpoint has one). Never parse or construct it. On
cursor-enabled endpoints this makes deep pagination O(page) and
stable against concurrent inserts.
ComboLeg:
type: object
properties:
leg_index:
type: integer
leg_position_id:
type: string
leg_condition_id:
type: string
description: The leg market's condition ID (distinct from the combo's).
leg_outcome_index:
type: integer
leg_outcome_label:
type: string
leg_status:
type: string
description: Placeholder (OPEN) until leg-resolution integration ships.
leg_resolved_at:
type: string
nullable: true
leg_current_price:
type: string
description: Placeholder ("0") until live-price integration ships.
market:
$ref: '#/components/schemas/ComboMarket'
ComboMarket:
type: object
properties:
market_id:
type: string
slug:
type: string
title:
type: string
outcome:
type: string
image_url:
type: string
icon_url:
type: string
category:
type: string
subcategory:
type: string
tags:
type: array
items:
type: string
end_date:
type: string
description: RFC3339 UTC
event:
$ref: '#/components/schemas/ComboEvent'
ComboEvent:
type: object
properties:
event_id:
type: string
event_slug:
type: string
event_title:
type: string
event_image:
type: string
````
@@ -0,0 +1,329 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get user combo positions
> Combinatorial (multi-market) positions held by a user, with per-leg breakdown. Also available at /v1/data/user/{address}/positions/combos (address from the path).
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/positions/combos
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/positions/combos:
get:
tags:
- Core
summary: Get user combo positions
description: >-
Combinatorial (multi-market) positions held by a user, with per-leg
breakdown. Also available at /v1/data/user/{address}/positions/combos
(address from the path).
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: status
schema:
type: string
enum:
- OPEN
- PARTIAL
- RESOLVED_WIN
- RESOLVED_LOSS
- in: query
name: sort
schema:
type: string
enum:
- current_value_desc
- first_entry_desc
- entry_cost_desc
- resolved_at_desc
- updated_asc
default: current_value_desc
- in: query
name: market_id
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/ComboConditionId'
description: >-
Comma-separated combo_condition_id values to filter to specific
combos. These equal the market_id of isCombo rows on /activity. Omit
for all of the user's combos.
- in: query
name: limit
schema:
type: integer
default: 20
minimum: 0
maximum: 1000
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 100000
- in: query
name: updatedAfter
schema:
type: integer
description: >-
Incremental-sync watermark (epoch seconds, inclusive): only rows
whose updated_at is at or after this time. Positions mutate on
resolution and redemption, so this catches changes a creation-time
filter cannot. In sync mode
(updatedAfter/updatedBefore/sort=updated_asc) every live row is
returned regardless of balance, and the effective upper bound is
clamped ~90s behind now (commit-visibility safety lag) — very recent
rows appear on the next poll. Rows at the boundary may re-deliver:
upsert by (combo_condition_id, combo_position_id).
- in: query
name: updatedBefore
schema:
type: integer
description: >-
Optional upper bound (epoch seconds, inclusive) for updated_at;
clamped to the safety lag. Must be >= updatedAfter.
- in: query
name: cursor
schema:
type: string
description: >-
Opaque continuation token from a previous response's
pagination.next_cursor. When present it supersedes offset (which is
ignored). Invalid, tampered, or cross-endpoint tokens return 400.
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/CombosResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
ComboConditionId:
type: string
description: >-
Combo condition ID (0x-prefixed, 62 hex chars / bytes31). Equals the
market_id (unified) / conditionId (legacy) of isCombo rows on /activity.
pattern: ^0x[a-fA-F0-9]{62}$
example: '0x0391ab0ebea17b65ba87e071b0566e816b0000000000000000000000000000'
CombosResponse:
type: object
properties:
combos:
type: array
items:
$ref: '#/components/schemas/ComboPosition'
pagination:
$ref: '#/components/schemas/Pagination'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
ComboPosition:
type: object
properties:
combo_condition_id:
$ref: '#/components/schemas/ComboConditionId'
combo_position_id:
type: string
module_id:
type: integer
description: 3 = Combinatorial
user_address:
$ref: '#/components/schemas/Address'
shares_balance:
type: string
description: Decimal string (precision-preserving).
entry_avg_price_usdc:
type: string
entry_cost_usdc:
type: string
description: >-
REMAINING cost basis (entry_avg_price × shares_balance). Reads ~0
after a winning combo is redeemed — use total_cost_usdc to display
what was paid on closed positions.
realized_payout_usdc:
type: string
description: >-
Gross redemption proceeds (winning combo shares redeem 1:1 at $1).
"0.00" while OPEN / unredeemed / RESOLVED_LOSS; accumulates under
PARTIAL. Gross payout, not net PnL — net = realized_payout_usdc
total_cost_usdc.
total_cost_usdc:
type: string
description: >-
Original cost basis = entry_avg_price × (shares_balance +
realized_payout). Survives redemption burning the shares; equals
entry_cost_usdc while OPEN.
status:
type: string
enum:
- OPEN
- PARTIAL
- RESOLVED_WIN
- RESOLVED_LOSS
first_entry_at:
type: string
description: RFC3339 UTC
resolved_at:
type: string
nullable: true
updated_at:
type: string
description: >-
Last-modified time (UTC, ISO 8601). Bumps on any recompute of the
row (trade, redemption, resolution classification) — the
incremental-sync watermark field. Omitted on responses served by the
legacy backend.
legs_total:
type: integer
legs_resolved:
type: integer
legs_pending:
type: integer
legs:
type: array
items:
$ref: '#/components/schemas/ComboLeg'
Pagination:
type: object
description: >-
Standard pagination metadata. No total count; has_more is derived from
page fullness. next_cursor is opaque.
properties:
limit:
type: integer
offset:
type: integer
has_more:
type: boolean
next_cursor:
type: string
nullable: true
description: >-
Opaque signed cursor for the next page; null when has_more is false.
Pass it back verbatim as ?cursor= on the next request (keep the same
sort where the endpoint has one). Never parse or construct it. On
cursor-enabled endpoints this makes deep pagination O(page) and
stable against concurrent inserts.
ComboLeg:
type: object
properties:
leg_index:
type: integer
leg_position_id:
type: string
leg_condition_id:
type: string
description: The leg market's condition ID (distinct from the combo's).
leg_outcome_index:
type: integer
leg_outcome_label:
type: string
leg_status:
type: string
description: Placeholder (OPEN) until leg-resolution integration ships.
leg_resolved_at:
type: string
nullable: true
leg_current_price:
type: string
description: Placeholder ("0") until live-price integration ships.
market:
$ref: '#/components/schemas/ComboMarket'
ComboMarket:
type: object
properties:
market_id:
type: string
slug:
type: string
title:
type: string
outcome:
type: string
image_url:
type: string
icon_url:
type: string
category:
type: string
subcategory:
type: string
tags:
type: array
items:
type: string
end_date:
type: string
description: RFC3339 UTC
event:
$ref: '#/components/schemas/ComboEvent'
ComboEvent:
type: object
properties:
event_id:
type: string
event_slug:
type: string
event_title:
type: string
event_image:
type: string
````
@@ -0,0 +1,236 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create Account Invite
> Create or return the authenticated account's primary invite code. The call
is idempotent for accounts that already have a primary invite code.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json post /v1/account/invite
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/invite:
post:
summary: Create Account Invite
description: >
Create or return the authenticated account's primary invite code. The
call
is idempotent for accounts that already have a primary invite code.
operationId: createAccountInvite
requestBody:
description: Empty invite creation request.
content:
application/json:
schema:
$ref: '#/components/schemas/CreateInviteRequest'
examples:
createAccountInvite:
summary: Create or get the authenticated account invite code
value: {}
responses:
'200':
description: Account invite response.
content:
application/json:
schema:
$ref: '#/components/schemas/CreateInviteResponse'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
CreateInviteRequest:
type: object
additionalProperties: false
CreateInviteResponse:
type: object
required:
- status
- code
- referrals_available
- cooldown_ms
properties:
status:
type: string
enum:
- ok
code:
$ref: '#/components/schemas/code'
referrals_available:
type: integer
minimum: 0
description: Remaining lifetime referrals for this invite code.
cooldown_ms:
type: integer
nullable: true
minimum: 0
description: >-
Milliseconds until referrals become available again. Null for
lifetime caps because no windowed cooldown applies.
code:
type: string
description: Referral or invite code
example: ABC123
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,362 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create Orders
> Create new orders.
Requires proxy signature, see [proxy signing](/http/signing#2-proxy-signing).
<Badge color="gray" size="md">Request Weight: **1 + floor(n / 20)**</Badge> <Badge color="gray" size="md">Action Weight: **1 / order**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json post /v1/trade/orders
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/trade/orders:
post:
summary: Create Orders
description: >
Create new orders.
Requires proxy signature, see [proxy
signing](/http/signing#2-proxy-signing).
operationId: createOrders
requestBody:
description: Order request.
content:
application/json:
schema:
$ref: '#/components/schemas/OrderRequest'
responses:
'200':
description: >-
Order ACK response. Order result should be fetched using the get
orders endpoint.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/OrderResponse'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
OrderRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpCreateOrders'
- $ref: '#/components/schemas/BaseOp'
- type: object
properties:
exp:
$ref: '#/components/schemas/exp'
OrderResponse:
oneOf:
- $ref: '#/components/schemas/OrderAccepted'
- $ref: '#/components/schemas/OrderRejected'
OpCreateOrders:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- createOrders
args:
type: array
items:
$ref: '#/components/schemas/CreateOrder'
grp:
$ref: '#/components/schemas/grp'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
exp:
type: integer
description: >-
Command expiry timestamp in Unix milliseconds. If provided, it must be
in the future and within the gateway's default command timeout. It can
shorten request validity but cannot extend it. This is not an order
auto-cancel time.
example: 1767225600000
OrderAccepted:
type: object
required:
- status
- oid
properties:
status:
type: string
enum:
- ok
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
description: Echoed only when the request carried a client_order_id.
OrderRejected:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
oid:
$ref: '#/components/schemas/oid'
coid:
$ref: '#/components/schemas/coid'
error:
$ref: '#/components/schemas/error'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
CreateOrder:
type: object
required:
- iid
- buy
- qty
properties:
iid:
$ref: '#/components/schemas/iid'
buy:
$ref: '#/components/schemas/buy'
p:
$ref: '#/components/schemas/p'
qty:
$ref: '#/components/schemas/qty'
tif:
$ref: '#/components/schemas/tif'
po:
$ref: '#/components/schemas/po'
ro:
$ref: '#/components/schemas/ro'
c:
$ref: '#/components/schemas/coid'
tr:
type: object
description: Optional trigger attached to this order.
properties:
market:
$ref: '#/components/schemas/market'
trp:
$ref: '#/components/schemas/trp'
tpsl:
$ref: '#/components/schemas/tpsl'
grp:
type: string
description: TPSL grouping
enum:
- order
- position
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
oid:
type: integer
description: Order ID
example: 1234567890
coid:
type: string
description: Client order ID
minLength: 32
maxLength: 32
pattern: ^[0-9a-f]{32}$
example: 550e8400e29b41d4a716446655440000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
iid:
type: integer
description: Instrument ID
example: 1
buy:
type: boolean
description: Is buy
example: true
p:
type: string
description: Price
example: '100.00'
qty:
type: string
description: Quantity in no. of contracts
example: '10.00'
tif:
type: string
description: Time in force
enum:
- gtc
- ioc
- fok
po:
type: boolean
description: Post only
default: false
example: false
ro:
type: boolean
description: Reduce only
example: false
default: false
market:
type: boolean
description: Whether the trigger executes as a market order
trp:
type: string
description: Trigger price
example: '110.00'
tpsl:
type: string
description: Trigger type
enum:
- tp
- sl
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,302 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create Proxy
> Create a new proxy to sign orders. Returns an API secret for private account access.
Requires EOA signature, see [EOA signing](/http/signing#1-eoa-signing).
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json post /v1/account/proxy
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/proxy:
post:
summary: Create Proxy
description: >
Create a new proxy to sign orders. Returns an API secret for private
account access.
Requires EOA signature, see [EOA signing](/http/signing#1-eoa-signing).
operationId: createProxy
requestBody:
description: Proxy creation request.
content:
application/json:
schema:
$ref: '#/components/schemas/ProxyRequest'
examples:
createProxy:
summary: Create a proxy
value:
op:
type: createProxy
args:
owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
proxy: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
expiry: 1767225600000
sig: >-
0x4d11d89f6d8e2f0fd22fb5dd9e6e88a35f3a2c0f3a9e4ff9f8f0da5e6c5f241d2ed7d173f7fcb15726b8a7e7f1f1277ec54c060f5b3ab4d72dbf4d0e40ee6e9a1c
salt: 123456789
ts: 1767000000000
responses:
'200':
description: Proxy creation response.
content:
application/json:
schema:
$ref: '#/components/schemas/ProxyResponse'
'400':
$ref: '#/components/responses/Error400Response'
'422':
$ref: '#/components/responses/Error422Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
ProxyRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpCreateProxy'
- $ref: '#/components/schemas/BaseOp'
- type: object
properties:
label:
$ref: '#/components/schemas/label'
code:
$ref: '#/components/schemas/code'
ProxyResponse:
type: object
required:
- status
- secret
properties:
status:
type: string
enum:
- ok
secret:
$ref: '#/components/schemas/secret'
OpCreateProxy:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- createProxy
args:
type: object
required:
- owner
- proxy
- expiry
properties:
owner:
$ref: '#/components/schemas/owner'
proxy:
$ref: '#/components/schemas/proxy'
expiry:
$ref: '#/components/schemas/expiry'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
label:
type: string
description: Human-readable label for a proxy key or internal transfer
example: trading-bot
code:
type: string
description: Referral or invite code
example: ABC123
secret:
type: string
description: API secret
example: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
GenericRejected:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
owner:
type: string
description: Owner address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
proxy:
type: string
description: Proxy address in hex format
example: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
expiry:
type: integer
description: Expiry timestamp in milliseconds
example: 1767225600000
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error422Response:
description: |
Unprocessable Entity — the request was well-formed but a domain rule
rejected it on its merits (insufficient balance, invalid leverage,
proxy already exists, …). The body is the discriminated rejection
(`status: err`) with the engine error identifier in `error`.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericRejected'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,111 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get midpoint price
> Retrieves the midpoint price for a specific token ID.
The midpoint is calculated as the average of the best bid and best ask prices.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /midpoint
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/midpoint:
get:
tags:
- Data
summary: Get midpoint price
description: >
Retrieves the midpoint price for a specific token ID.
The midpoint is calculated as the average of the best bid and best ask
prices.
operationId: getMidpoint
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved midpoint price
content:
application/json:
schema:
type: object
required:
- mid_price
properties:
mid_price:
type: string
description: Midpoint price as a string
example: '0.45'
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,87 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get server time
> Returns the current Unix timestamp of the server.
This can be used to synchronize client time with server time.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /time
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/time:
get:
tags:
- Data
summary: Get server time
description: |
Returns the current Unix timestamp of the server.
This can be used to synchronize client time with server time.
operationId: getTime
responses:
'200':
description: Successfully retrieved server time
content:
application/json:
schema:
type: integer
format: int64
description: Unix timestamp (seconds since epoch)
example: 1234567890
'400':
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,263 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Delete Proxy
> Delete a proxy by address.
Requires EOA signature, see [EOA signing](/http/signing#1-eoa-signing).
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json delete /v1/account/proxy
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/proxy:
delete:
summary: Delete Proxy
description: |
Delete a proxy by address.
Requires EOA signature, see [EOA signing](/http/signing#1-eoa-signing).
operationId: deleteProxy
requestBody:
description: Delete proxy request.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteProxyRequest'
examples:
deleteProxy:
summary: Delete a proxy
value:
op:
type: deleteProxy
args:
proxy: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
sig: >-
0x9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a1c
salt: 888888888
ts: 1767000020000
responses:
'200':
description: Delete proxy response.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericAccepted'
'400':
$ref: '#/components/responses/Error400Response'
'422':
$ref: '#/components/responses/Error422Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
DeleteProxyRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpDeleteProxy'
- $ref: '#/components/schemas/BaseOp'
GenericAccepted:
type: object
required:
- status
properties:
status:
type: string
enum:
- ok
OpDeleteProxy:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- deleteProxy
args:
type: object
required:
- proxy
properties:
proxy:
$ref: '#/components/schemas/proxy'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
GenericRejected:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
proxy:
type: string
description: Proxy address in hex format
example: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error422Response:
description: |
Unprocessable Entity — the request was well-formed but a domain rule
rejected it on its merits (insufficient balance, invalid leverage,
proxy already exists, …). The body is the discriminated rejection
(`status: err`) with the engine error identifier in `error`.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericRejected'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,108 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get event tags
## OpenAPI
````yaml /api-spec/gamma-openapi.yaml get /events/{id}/tags
openapi: 3.0.3
info:
title: Markets API
version: 1.0.0
description: REST API specification for public endpoints used by the Markets service.
servers:
- url: https://gamma-api.polymarket.com
description: Polymarket Gamma API Production Server
security: []
tags:
- name: Gamma Status
description: Gamma API status and health check
- name: Sports
description: Sports-related endpoints including teams and game data
- name: Tags
description: Tag management and related tag operations
- name: Events
description: Event management and event-related operations
- name: Markets
description: Market data and market-related operations
- name: Comments
description: Comment system and user interactions
- name: Series
description: Series management and related operations
- name: Profiles
description: User profile management
- name: Search
description: Search functionality across different entity types
paths:
/events/{id}/tags:
get:
tags:
- Events
- Tags
summary: Get event tags
operationId: getEventTags
parameters:
- $ref: '#/components/parameters/pathId'
responses:
'200':
description: Tags attached to the event
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Tag'
'404':
description: Not found
components:
parameters:
pathId:
name: id
in: path
required: true
schema:
type: integer
schemas:
Tag:
type: object
properties:
id:
type: string
label:
type: string
nullable: true
slug:
type: string
nullable: true
forceShow:
type: boolean
nullable: true
publishedAt:
type: string
nullable: true
createdBy:
type: integer
nullable: true
updatedBy:
type: integer
nullable: true
createdAt:
type: string
format: date-time
nullable: true
updatedAt:
type: string
format: date-time
nullable: true
forceHide:
type: boolean
nullable: true
isCarousel:
type: boolean
nullable: true
````
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,233 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Geographic Restrictions
> Check geographic restrictions before placing orders on the Polymarket API
Polymarket restricts order placement from certain geographic locations due to regulatory requirements and compliance with international sanctions. Before placing orders, builders should verify the location.
<Warning>
Orders submitted from blocked regions will be rejected. Implement geoblock
checks in your application to provide users with appropriate feedback before
they attempt to trade.
</Warning>
***
## Geoblock Endpoint
Check the geographic eligibility of the requesting IP address:
```bash theme={null}
GET https://polymarket.com/api/geoblock
```
<Note>This endpoint is on `polymarket.com`, not the API servers.</Note>
### Response
```json theme={null}
{
"blocked": true,
"ip": "203.0.113.42",
"country": "US",
"region": "NY"
}
```
| Field | Type | Description |
| --------- | ------- | ----------------------------------------------- |
| `blocked` | boolean | Whether the user is blocked from placing orders |
| `ip` | string | Detected IP address |
| `country` | string | ISO 3166-1 alpha-2 country code |
| `region` | string | Region/state code |
***
## Restricted Jurisdictions
Restrictions fall into three groups. **Block completely** means no new orders and no closing of existing positions. **Close-only** means users can close existing positions but cannot open new ones. Each group notes whether it applies on the frontend, the API, or both. Codes are ISO 3166-1 alpha-2 for countries and ISO 3166-2 for sub-national regions.
### OFAC-Sanctioned Jurisdictions (Block Completely)
Blocked on both the frontend and the API. No new orders, and existing positions cannot be closed.
| Jurisdiction | Code |
| ----------------- | ----- |
| Iran | IR |
| Syria | SY |
| Cuba | CU |
| North Korea | KP |
| Ukraine — Crimea | UA-43 |
| Ukraine — Donetsk | UA-14 |
| Ukraine — Luhansk | UA-09 |
### Regulatory-Restricted Jurisdictions (Close-Only on Frontend and API)
Users can close existing positions but cannot open new ones, on both the frontend and the API.
| Jurisdiction | Code |
| ------------------------------------ | ----- |
| Australia | AU |
| Belarus | BY |
| Belgium | BE |
| Burundi | BI |
| Brazil | BR |
| Canada — British Columbia | CA-BC |
| Canada — Ontario | CA-ON |
| Canada — Alberta | CA-AB |
| Canada — Quebec | CA-QC |
| Central African Republic | CF |
| Congo (Kinshasa) | CD |
| Ethiopia | ET |
| France | FR |
| Germany | DE |
| Iraq | IQ |
| Italy | IT |
| Lebanon | LB |
| Libya | LY |
| Myanmar | MM |
| Nicaragua | NI |
| North Korea | KP |
| Poland | PL |
| Russia | RU |
| Singapore | SG |
| Somalia | SO |
| Slovakia | SK |
| South Sudan | SS |
| Sudan | SD |
| Taiwan | TW |
| Thailand | TH |
| United Kingdom | GB |
| United States | US |
| United States Minor Outlying Islands | UM |
| Venezuela | VE |
| Yemen | YE |
| Zimbabwe | ZW |
### Regulatory-Restricted Jurisdictions (Close-Only on Frontend)
Close-only on the Polymarket frontend; the API itself is not restricted.
| Jurisdiction | Code |
| ------------------- | ---- |
| Japan | JP |
| Netherlands | NL |
| Malta (Sports Only) | MT |
***
## Blocking Logic
The geoblocking system includes:
1. **OFAC-Sanctioned Countries**: Countries sanctioned by the U.S. Office of Foreign Assets Control (OFAC)
2. **Additional Regulatory Restrictions**: Countries added for specific regulatory compliance reasons
***
## Server Infrastructure
* **Primary Servers**: eu-west-2
* **Closest Non-Georestricted Region**: eu-west-1
<Tip>
**Direct co-location available.** Users who complete the [KYC/KYB
form](https://docs.google.com/forms/d/e/1FAIpQLSfY-3Dl3yxq8HKFjFad8YzKZmm0k3Gdg29HD6gL-K-AmI6KXw/viewform) can get access to co-locate
directly in `eu-west-2` for the lowest possible latency to Polymarket's
primary servers.
</Tip>
***
## Usage Examples
<Tabs>
<Tab title="TypeScript">
```typescript theme={null}
interface GeoblockResponse {
blocked: boolean;
ip: string;
country: string;
region: string;
}
async function checkGeoblock(): Promise<GeoblockResponse> {
const response = await fetch("https://polymarket.com/api/geoblock");
return response.json();
}
// Usage
const geo = await checkGeoblock();
if (geo.blocked) {
console.log(`Trading not available in ${geo.country}`);
} else {
console.log("Trading available");
}
```
</Tab>
<Tab title="Python">
```python theme={null}
import requests
def check_geoblock() -> dict:
response = requests.get("https://polymarket.com/api/geoblock")
return response.json()
# Usage
geo = check_geoblock()
if geo["blocked"]:
print(f"Trading not available in {geo['country']}")
else:
print("Trading available")
```
</Tab>
<Tab title="Rust">
```rust theme={null}
use polymarket_client_sdk_v2::clob::{Client, Config};
let client = Client::new("https://clob.polymarket.com", Config::default())?;
let geo = client.check_geoblock().await?;
if geo.blocked {
println!("Trading not available in {}", geo.country);
} else {
println!("Trading available");
}
```
</Tab>
</Tabs>
***
## Why These Restrictions
Geographic restrictions are implemented to ensure compliance with:
* International sanctions and embargoes
* Local financial regulations
* Gambling and prediction market laws
* Anti-money laundering (AML) requirements
* Know Your Customer (KYC) regulations
If you believe you are incorrectly restricted or have questions about geographic availability, please contact [Polymarket Support](https://polymarket.com/support).
***
## Next Steps
<CardGroup cols={2}>
<Card title="Authentication" icon="key" href="/api-reference/authentication">
Learn how to authenticate trading requests.
</Card>
<Card title="Place Orders" icon="plus" href="/trading/quickstart">
Start placing orders (from eligible regions).
</Card>
</CardGroup>
@@ -0,0 +1,242 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Account Limits
> Get the authenticated account's effective rate-limit allowances for its current
volume-based tier: order-action rate, open-order cap, and the display-only
messages-per-minute figure. `open_orders` reflects the account's current live
open-order count; the rate-usage counters (`actions_per_minute`,
`actions_burst`, and `reset`) are not tracked here and are reported as 0.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/limits
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/limits:
get:
summary: Get Account Limits
description: >
Get the authenticated account's effective rate-limit allowances for its
current
volume-based tier: order-action rate, open-order cap, and the
display-only
messages-per-minute figure. `open_orders` reflects the account's current
live
open-order count; the rate-usage counters (`actions_per_minute`,
`actions_burst`, and `reset`) are not tracked here and are reported as
0.
operationId: getAccountLimits
responses:
'200':
description: Account limits response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountLimits'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
AccountLimits:
type: object
required:
- actions_per_minute
- actions_per_minute_limit
- actions_burst
- actions_burst_limit
- open_orders
- open_orders_limit
- reset
- messages_per_minute
properties:
actions_per_minute:
$ref: '#/components/schemas/actions_per_minute'
actions_per_minute_limit:
$ref: '#/components/schemas/actions_per_minute_limit'
actions_burst:
$ref: '#/components/schemas/actions_burst'
actions_burst_limit:
$ref: '#/components/schemas/actions_burst_limit'
open_orders:
$ref: '#/components/schemas/open_orders'
open_orders_limit:
$ref: '#/components/schemas/open_orders_limit'
reset:
$ref: '#/components/schemas/rate_reset'
messages_per_minute:
$ref: '#/components/schemas/messages_per_minute'
actions_per_minute:
type: integer
description: Order action tokens used by the account in the current minute
example: 23
actions_per_minute_limit:
type: integer
description: Maximum order action tokens per account per minute
example: 300
actions_burst:
type: integer
description: Additional account action allowance remaining
actions_burst_limit:
type: integer
description: Additional account action allowance limit
open_orders:
type: integer
description: Current number of open orders
example: 42
open_orders_limit:
type: integer
description: Maximum number of open orders per account
example: 1000
rate_reset:
type: integer
description: Timestamp in milliseconds when the current interval resets
example: 1767225660000
messages_per_minute:
type: integer
description: >-
Display-only per-minute action/message allowance, equal to
actions_per_minute_limit. Not separately configured or enforced.
example: 300
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,207 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Account Referral
> Get the authenticated account's invite code, parent referral code, direct
referral count, and fee share rate.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/referral
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/referral:
get:
summary: Get Account Referral
description: >
Get the authenticated account's invite code, parent referral code,
direct
referral count, and fee share rate.
operationId: getAccountReferral
responses:
'200':
description: Account referral response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountReferral'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
AccountReferral:
type: object
required:
- code
- children_count
- referrals_left
- fee_share_rate
properties:
code:
$ref: '#/components/schemas/code'
parent:
$ref: '#/components/schemas/code'
description: >-
Parent referral code, omitted when the account has no parent
referral.
children_count:
$ref: '#/components/schemas/children_count'
referrals_left:
$ref: '#/components/schemas/referrals_left'
fee_share_rate:
$ref: '#/components/schemas/fee_share_rate'
code:
type: string
description: Referral or invite code
example: ABC123
children_count:
type: integer
description: Number of directly referred child accounts
example: 12
referrals_left:
type: integer
description: Number of additional referrals remaining for this account's invite code
example: 11
fee_share_rate:
type: string
description: Referral fee share rate. Defaults to 0.2.
example: '0.2'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,333 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Account Rewards
> Get per-instrument daily liquidity reward shares for the authenticated account.
Reward periods run from 12:00 UTC to 12:00 UTC and are labeled by their UTC end date.
OI rewards pay 6% APR on the account's full daily average gross OI across all
instruments when the combined daily average gross OI of its rewards entity is
at least $1M. Accounts without an entity mapping qualify independently.
The first reward period starts at 2026-05-08 12:00 UTC. If no date range is provided,
the latest computed reward period is returned.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/rewards
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/rewards:
get:
summary: Get Account Rewards
description: >
Get per-instrument daily liquidity reward shares for the authenticated
account.
Reward periods run from 12:00 UTC to 12:00 UTC and are labeled by their
UTC end date.
OI rewards pay 6% APR on the account's full daily average gross OI
across all
instruments when the combined daily average gross OI of its rewards
entity is
at least $1M. Accounts without an entity mapping qualify independently.
The first reward period starts at 2026-05-08 12:00 UTC. If no date range
is provided,
the latest computed reward period is returned.
operationId: getAccountRewards
parameters:
- name: date
in: query
required: false
schema:
$ref: '#/components/schemas/date'
- name: start_date
in: query
required: false
schema:
$ref: '#/components/schemas/start_date'
- name: end_date
in: query
required: false
schema:
$ref: '#/components/schemas/end_date'
- name: limit
in: query
required: false
schema:
$ref: '#/components/schemas/limit'
responses:
'200':
description: Account rewards response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountRewards'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
date:
type: string
description: UTC reward period end date in YYYY-MM-DD format
example: '2026-05-10'
start_date:
type: string
description: Inclusive UTC start date in YYYY-MM-DD format
example: '2026-05-01'
end_date:
type: string
description: Inclusive UTC end date in YYYY-MM-DD format
example: '2026-05-10'
limit:
type: integer
description: Maximum number of entries to return
example: 100
AccountRewards:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/AccountReward'
more:
$ref: '#/components/schemas/more'
AccountReward:
type: object
required:
- date
- maker_share_7d
- reward_distributed
- breakdown
properties:
date:
$ref: '#/components/schemas/date'
maker_share_7d:
$ref: '#/components/schemas/maker_share_7d'
reward_distributed:
$ref: '#/components/schemas/reward_distributed'
breakdown:
type: array
items:
$ref: '#/components/schemas/AccountRewardInstrument'
oi_rewards:
$ref: '#/components/schemas/AccountRewardOi'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
maker_share_7d:
type: string
description: Rolling 7-day account maker volume divided by total exchange volume
example: '0.35'
reward_distributed:
type: boolean
description: Whether rewards for this period have been marked as distributed
example: true
AccountRewardInstrument:
type: object
required:
- instrument_id
- reward_pool
- reward_amount
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
reward_pool:
$ref: '#/components/schemas/reward_pool'
reward_amount:
$ref: '#/components/schemas/reward_amount'
AccountRewardOi:
type: object
required:
- account_oi
- reward_amount
properties:
account_oi:
$ref: '#/components/schemas/account_oi'
reward_amount:
$ref: '#/components/schemas/reward_amount'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
instrument_id:
type: integer
description: Instrument ID
reward_pool:
type: string
description: Configured reward pool for the instrument
example: '1000'
reward_amount:
type: string
description: Reward amount attributed to this reward row
example: '127.50344'
account_oi:
type: string
description: >-
Daily average gross open-interest notional for this account across all
instruments
example: '3200000'
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,223 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Account Stats
> Get the authenticated account's 7-day trading stats (taker volume, maker volume,
account maker share, and entity maker share when applicable).
Stats are cached by UTC day and may be stale by up to 24 hours.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/stats
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/stats:
get:
summary: Get Account Stats
description: >
Get the authenticated account's 7-day trading stats (taker volume, maker
volume,
account maker share, and entity maker share when applicable).
Stats are cached by UTC day and may be stale by up to 24 hours.
operationId: getAccountStats
responses:
'200':
description: Account stats response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountStats'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
AccountStats:
type: object
required:
- volume_7d
- taker_volume_7d
- maker_volume_7d
- account_maker_share_7d
properties:
volume_7d:
$ref: '#/components/schemas/volume_7d'
taker_volume_7d:
$ref: '#/components/schemas/taker_volume_7d'
maker_volume_7d:
$ref: '#/components/schemas/maker_volume_7d'
account_maker_share_7d:
$ref: '#/components/schemas/account_maker_share_7d'
entity_maker_share_7d:
$ref: '#/components/schemas/entity_maker_share_7d'
entity_id:
$ref: '#/components/schemas/entity_id'
entity_name:
$ref: '#/components/schemas/entity_name'
volume_7d:
type: string
description: Rolling 7-day perpetual trading volume in USD
example: '5000000'
taker_volume_7d:
type: string
description: Rolling 7-day perpetual taker volume in USD
example: '3500000'
maker_volume_7d:
type: string
description: Rolling 7-day perpetual maker volume in USD
example: '1500000'
account_maker_share_7d:
type: string
description: Rolling 7-day account maker volume divided by total exchange volume
example: '0.35'
entity_maker_share_7d:
type: string
description: Rolling 7-day entity maker volume divided by total exchange volume
example: '0.35'
entity_id:
type: integer
description: Liquidity rewards entity ID
example: 42
entity_name:
type: string
description: Liquidity rewards entity name
example: desk
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,210 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Auto-Cancel Status
> Get the current auto-cancel dead-man-switch status for the authenticated
account, including the armed deadline, today's trigger count, and when
the daily counter resets.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/auto-cancel
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/auto-cancel:
get:
summary: Get Auto-Cancel Status
description: |
Get the current auto-cancel dead-man-switch status for the authenticated
account, including the armed deadline, today's trigger count, and when
the daily counter resets.
operationId: getAutoCancel
responses:
'200':
description: Auto-cancel status response.
content:
application/json:
schema:
$ref: '#/components/schemas/AutoCancelStatus'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
AutoCancelStatus:
type: object
required:
- deadline
- triggered
- daily_limit
- next_reset
properties:
deadline:
$ref: '#/components/schemas/auto_cancel_deadline'
triggered:
$ref: '#/components/schemas/auto_cancel_triggered'
daily_limit:
$ref: '#/components/schemas/auto_cancel_daily_limit'
next_reset:
$ref: '#/components/schemas/auto_cancel_next_reset'
auto_cancel_deadline:
type: integer
description: |
Unix-ms deadline for the per-account auto-cancel dead-man-switch.
Zero means no schedule is armed. When the deadline elapses, every
open order on the account is cancelled and the schedule clears.
example: 1767000045000
auto_cancel_triggered:
type: integer
description: |
Number of times auto-cancel has fired for this account during the
current UTC day. Resets to zero at 00:00 UTC.
example: 0
auto_cancel_daily_limit:
type: integer
description: |
Maximum number of auto-cancel triggers allowed per UTC day.
example: 10
auto_cancel_next_reset:
type: integer
description: |
Unix-ms timestamp of the next UTC midnight when the daily trigger
count resets to zero.
example: 1767052800000
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,191 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Balances
> Get asset balances for the authenticated account.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/balances
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/balances:
get:
summary: Get Balances
description: Get asset balances for the authenticated account.
operationId: getBalances
responses:
'200':
description: Balances response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Balance'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
Balance:
type: object
required:
- asset
- balance
- value
properties:
asset:
$ref: '#/components/schemas/asset'
balance:
$ref: '#/components/schemas/balance'
value:
$ref: '#/components/schemas/value'
asset:
type: string
description: Asset name
example: USDC
balance:
type: string
description: Total balance
example: '10000.00'
value:
type: string
description: USD value
example: '10000.00'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,211 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get BBO
> Get best bid and offer for all instruments.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/bbo
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/bbo:
get:
summary: Get BBO
description: Get best bid and offer for all instruments.
operationId: getBBO
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
responses:
'200':
description: BBO response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BBO'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
BBO:
title: BBO
type: object
required:
- instrument_id
- bid_price
- bid_quantity
- ask_price
- ask_quantity
- timestamp
properties:
instrument_id:
$ref: '#/components/schemas/iid'
bid_price:
$ref: '#/components/schemas/best_bid_price'
bid_quantity:
$ref: '#/components/schemas/best_bid_quantity'
ask_price:
$ref: '#/components/schemas/best_ask_price'
ask_quantity:
$ref: '#/components/schemas/best_ask_quantity'
timestamp:
$ref: '#/components/schemas/ts'
iid:
type: integer
description: Instrument ID
example: 1
best_bid_price:
type: string
description: Best bid price
example: '99.50'
best_bid_quantity:
type: string
description: Best bid quantity
example: '10.00'
best_ask_price:
type: string
description: Best ask price
example: '100.50'
best_ask_quantity:
type: string
description: Best ask quantity
example: '10.00'
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,233 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Book
> Get book for an instrument.
<Badge color="gray" size="md">Request Weight:</Badge>
<br />
<Badge color="gray" size="md">Depth 10: **2**</Badge>
<br />
<Badge color="gray" size="md">Depth 100: **5**</Badge>
<br />
<Badge color="gray" size="md">Depth 500: **10**</Badge>
<br />
<Badge color="gray" size="md">Depth 1000: **20**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/book
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/book:
get:
summary: Get Book
description: Get book for an instrument.
operationId: getBook
parameters:
- name: instrument_id
in: query
required: true
schema:
$ref: '#/components/schemas/instrument_id'
- name: depth
in: query
required: false
schema:
$ref: '#/components/schemas/depth'
responses:
'200':
description: Book response.
content:
application/json:
schema:
$ref: '#/components/schemas/Book'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
depth:
type: integer
description: Number of book levels to return
enum:
- 10
- 100
- 500
- 1000
default: 100
Book:
type: object
required:
- instrument_id
- bids
- asks
- timestamp
- sequence
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
bids:
type: array
items:
$ref: '#/components/schemas/level'
description: Bid levels
asks:
type: array
items:
$ref: '#/components/schemas/level'
description: Ask levels
timestamp:
$ref: '#/components/schemas/timestamp'
sequence:
$ref: '#/components/schemas/sequence'
level:
type: array
items:
type: string
maxItems: 2
description: |
- `"100.00"` - Price
- `"10.00"` - Quantity
example:
- '100.00'
- '10.00'
timestamp:
type: integer
description: Timestamp in milliseconds
example: 1767225600000
sequence:
type: integer
description: Sequence number
example: 1234567890
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,169 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Collateral Assets
> Get a list of collateral assets.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/assets
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/assets:
get:
summary: Get Collateral Assets
description: |
Get a list of collateral assets.
operationId: getAssets
responses:
'200':
description: Assets response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Asset'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
Asset:
type: object
required:
- asset
- address
- decimals
- collateral_ratio
- withdrawal_fee
properties:
asset:
$ref: '#/components/schemas/asset'
address:
$ref: '#/components/schemas/address'
decimals:
$ref: '#/components/schemas/decimals'
collateral_ratio:
$ref: '#/components/schemas/collateral_ratio'
withdrawal_fee:
$ref: '#/components/schemas/withdrawal_fee'
asset:
type: string
description: Asset name
example: USDC
address:
type: string
description: Address
example: '0x1234567890abcdef1234567890abcdef12345678'
decimals:
type: integer
description: Asset decimals
example: 6
collateral_ratio:
type: string
description: Collateral ratio
example: '1.00'
withdrawal_fee:
type: string
description: Withdrawal transaction fee in decimalized asset units
example: '5.00'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,230 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Credentials
> Get the account ID, address, and proxy keys for the authenticated account.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/credentials
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/credentials:
get:
summary: Get Credentials
description: >-
Get the account ID, address, and proxy keys for the authenticated
account.
operationId: getCredentials
responses:
'200':
description: Credentials response.
content:
application/json:
schema:
$ref: '#/components/schemas/Credentials'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
Credentials:
type: object
required:
- address
- keys
properties:
address:
$ref: '#/components/schemas/address'
keys:
type: array
items:
$ref: '#/components/schemas/Key'
address:
type: string
description: Address
example: '0x1234567890abcdef1234567890abcdef12345678'
Key:
type: object
required:
- proxy
- expiry
properties:
proxy:
$ref: '#/components/schemas/proxy'
label:
$ref: '#/components/schemas/label'
expiry:
$ref: '#/components/schemas/expiry'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
proxy:
type: string
description: Proxy address in hex format
example: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
label:
type: string
description: Human-readable label for a proxy key or internal transfer
example: trading-bot
expiry:
type: integer
description: Expiry timestamp in milliseconds
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,318 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Deposits
> Get deposit history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/deposits
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/deposits:
get:
summary: Get Deposits
description: |
Get deposit history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
operationId: getDeposits
parameters:
- name: deposit_status
in: query
required: false
schema:
$ref: '#/components/schemas/deposit_status'
- name: hash
in: query
required: false
schema:
$ref: '#/components/schemas/hash'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Deposit history response.
content:
application/json:
schema:
$ref: '#/components/schemas/Deposits'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
deposit_status:
type: string
description: Deposit status
enum:
- pending
- confirmed
- removed
hash:
type: string
description: On-chain transaction hash, "0x" if not yet mined
default: 0x
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
Deposits:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/Deposit'
more:
$ref: '#/components/schemas/more'
Deposit:
type: object
required:
- hash
- asset
- amount
- status
- from
- to
- confirmations
- required_confirmations
- created_timestamp
properties:
hash:
$ref: '#/components/schemas/hash'
asset:
$ref: '#/components/schemas/asset'
amount:
$ref: '#/components/schemas/amount'
from:
$ref: '#/components/schemas/from'
to:
$ref: '#/components/schemas/to'
status:
$ref: '#/components/schemas/deposit_status'
confirmations:
$ref: '#/components/schemas/confirmations'
required_confirmations:
$ref: '#/components/schemas/required_confirmations'
created_timestamp:
$ref: '#/components/schemas/created_timestamp'
confirmed_timestamp:
$ref: '#/components/schemas/confirmed_timestamp'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
asset:
type: string
description: Asset name
example: USDC
amount:
type: string
description: >-
Raw token amount including decimals. For withdrawals this matches the
uint256 amount in the EIP-712 signature (e.g. "100000000" for 100 USDC
with 6 decimals).
example: '100000000'
from:
type: string
description: Sender address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
to:
type: string
description: Destination address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
confirmations:
type: integer
description: Number of block confirmations
example: 12
required_confirmations:
type: integer
description: Required number of block confirmations
example: 12
created_timestamp:
type: integer
description: Creation timestamp in milliseconds
example: 1767225600000
confirmed_timestamp:
type: integer
description: Confirmation timestamp in milliseconds
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,255 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Equity
> Get equity history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/equity
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/equity:
get:
summary: Get Equity
description: |
Get equity history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
operationId: getEquityHistory
parameters:
- name: interval
in: query
required: true
schema:
$ref: '#/components/schemas/interval'
- name: start_timestamp
in: query
required: true
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Equity history response.
content:
application/json:
schema:
$ref: '#/components/schemas/EquityHistory'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
interval:
type: string
description: Kline interval
enum:
- 1s
- 1m
- 5m
- 15m
- 30m
- 1h
- 4h
- 6h
- 12h
- 1d
- 1w
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
EquityHistory:
type: object
required:
- data
- more
properties:
data:
type: array
description: |
- `1767225600000` - Timestamp
- `"10000.00"` - Equity
items:
type: array
example:
- 1767225600000
- '10000.00'
maxItems: 1000
more:
$ref: '#/components/schemas/more'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,161 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Exchange Info
> Get exchange information.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/exchange
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/exchange:
get:
summary: Get Exchange Info
description: |
Get exchange information.
operationId: getExchange
responses:
'200':
description: Successful exchange information response.
content:
application/json:
schema:
$ref: '#/components/schemas/Exchange'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
Exchange:
type: object
required:
- name
- version
- chain_id
- contract
properties:
name:
$ref: '#/components/schemas/name'
version:
$ref: '#/components/schemas/version'
chain_id:
$ref: '#/components/schemas/chain_id'
contract:
$ref: '#/components/schemas/contract'
name:
type: string
description: Exchange name used in the EIP-712 domain.
example: Polymarket
version:
type: string
description: Exchange version used in the EIP-712 domain.
example: '1'
chain_id:
type: integer
format: uint32
description: Chain ID of the network the exchange is deployed on.
example: 137
contract:
type: string
description: Verifying contract address or the EIP-712 domain.
example: '0x1234567890abcdef1234567890abcdef12345678'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,179 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Fees
> Get the default fee schedule for each instrument type and category. Rates returned are the $0-tier defaults; the account's actual rate on each fill depends on its trailing 30-day volume tier.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/fees
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/fees:
get:
summary: Get Fees
description: >-
Get the default fee schedule for each instrument type and category.
Rates returned are the $0-tier defaults; the account's actual rate on
each fill depends on its trailing 30-day volume tier.
operationId: getInfoFees
responses:
'200':
description: Fee schedule response.
content:
application/json:
schema:
$ref: '#/components/schemas/FeesInfo'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
FeesInfo:
type: object
required:
- fee_schedule
properties:
fee_schedule:
type: array
items:
$ref: '#/components/schemas/FeeScheduleEntry'
FeeScheduleEntry:
type: object
required:
- instrument_type
- category
- taker_fee_rate
- maker_fee_rate
properties:
instrument_type:
$ref: '#/components/schemas/instrument_type'
category:
$ref: '#/components/schemas/category'
taker_fee_rate:
$ref: '#/components/schemas/taker_fee_rate'
maker_fee_rate:
$ref: '#/components/schemas/maker_fee_rate'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
instrument_type:
type: string
description: Instrument type
enum:
- perpetual
category:
type: string
description: Instrument category
enum:
- equity
- commodity
- index
- crypto
taker_fee_rate:
type: string
description: >-
Default taker fee rate for the $0 volume tier. Actual rate scales down
with the account's trailing 30-day volume tier.
example: '0.0004'
maker_fee_rate:
type: string
description: >-
Default maker fee rate for the $0 volume tier. Positive at lower tiers,
zero at the $500M tier, and a rebate (negative) at the top tier.
example: '0.000125'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,342 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Fills
> Get fill history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/fills
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/fills:
get:
summary: Get Fills
description: |
Get fill history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
operationId: getFills
parameters:
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Fills response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountTrades'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
AccountTrades:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/AccountTradeData'
description: Account's trade history
more:
$ref: '#/components/schemas/more'
AccountTradeData:
type: object
required:
- trade_id
- order_id
- instrument_id
- side
- price
- quantity
- taker
- fee
- fee_asset
- previous_size
- previous_entry_price
- pnl
- timestamp
- liquidation
- hash
properties:
trade_id:
$ref: '#/components/schemas/tid'
order_id:
$ref: '#/components/schemas/oid'
instrument_id:
$ref: '#/components/schemas/iid'
side:
$ref: '#/components/schemas/side'
price:
$ref: '#/components/schemas/p'
quantity:
$ref: '#/components/schemas/qty'
taker:
$ref: '#/components/schemas/taker'
fee:
$ref: '#/components/schemas/fee'
fee_asset:
$ref: '#/components/schemas/fea'
previous_size:
$ref: '#/components/schemas/psz'
previous_entry_price:
$ref: '#/components/schemas/pep'
pnl:
$ref: '#/components/schemas/pnl'
liquidation:
$ref: '#/components/schemas/liq'
timestamp:
$ref: '#/components/schemas/ts'
hash:
$ref: '#/components/schemas/hash'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
tid:
type: integer
description: Trade ID
example: 1
oid:
type: integer
description: Order ID
example: 1234567890
iid:
type: integer
description: Instrument ID
example: 1
side:
type: string
description: Side
enum:
- long
- short
p:
type: string
description: Price
example: '100.00'
qty:
type: string
description: Quantity in no. of contracts
example: '10.00'
taker:
type: boolean
description: Whether this side was the taker
fee:
type: string
description: Fee amount for this trade side
example: '1.25'
fea:
type: string
description: Fee asset name
example: USDC
psz:
type: string
description: Position size before the fill
example: '26.86'
pep:
type: string
description: Position entry price before the fill
example: '100.00'
pnl:
type: string
description: PnL in USD
example: '100.00'
liq:
type: boolean
description: Whether the fill was a liquidation
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
hash:
type: string
description: On-chain transaction hash, "0x" if not yet mined
default: 0x
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,287 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Funding Charges
> Get funding payment history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/funding
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/funding:
get:
summary: Get Funding Charges
description: |
Get funding payment history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
operationId: getAccountFunding
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Account funding history response.
content:
application/json:
schema:
$ref: '#/components/schemas/AccountFundingHistory'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
AccountFundingHistory:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/AccountFundingData'
more:
$ref: '#/components/schemas/more'
AccountFundingData:
type: object
required:
- instrument_id
- size
- funding_rate
- funding_asset
- funding
- timestamp
properties:
instrument_id:
$ref: '#/components/schemas/iid'
size:
$ref: '#/components/schemas/sz'
funding_rate:
$ref: '#/components/schemas/fr'
funding_asset:
$ref: '#/components/schemas/fua'
funding:
$ref: '#/components/schemas/fund'
timestamp:
$ref: '#/components/schemas/ts'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
iid:
type: integer
description: Instrument ID
example: 1
sz:
type: string
description: >-
Signed position size in no. of contracts (positive = long, negative =
short)
example: '10.00'
fr:
type: string
description: Funding rate
example: '0.0001'
fua:
type: string
description: Funding asset name
example: USDC
fund:
type: string
description: Funding paid in USD
example: '1.00'
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,217 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Historical Funding
> Get public funding rate history for an instrument.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/funding
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/funding:
get:
summary: Get Historical Funding
description: |
Get public funding rate history for an instrument.
Maximum of 100 entries returned per request.
operationId: getFundingHistory
parameters:
- name: instrument_id
in: query
required: true
schema:
$ref: '#/components/schemas/instrument_id'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Funding rate history response.
content:
application/json:
schema:
$ref: '#/components/schemas/FundingHistory'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
FundingHistory:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/FundingRate'
more:
$ref: '#/components/schemas/more'
FundingRate:
type: object
required:
- funding_rate
- timestamp
properties:
funding_rate:
$ref: '#/components/schemas/fr'
timestamp:
$ref: '#/components/schemas/ts'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
fr:
type: string
description: Funding rate
example: '0.0001'
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,233 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Index
> Get index price and the list of constituents for an asset.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/index
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/index:
get:
summary: Get Index
description: Get index price and the list of constituents for an asset.
operationId: getIndex
parameters:
- name: asset
in: query
required: true
schema:
$ref: '#/components/schemas/asset'
responses:
'200':
description: Index constituents response.
content:
application/json:
schema:
$ref: '#/components/schemas/Index'
examples:
index:
summary: Index constituents
value:
asset: NVDA
index_price: '160.00'
constituents:
- source: chainlink
symbol: NVDA/USD
weight: '1.0'
price: '160.00'
ts: 1767225600000
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
asset:
type: string
description: Asset name
example: USDC
Index:
type: object
required:
- asset
- index_price
- constituents
- ts
properties:
asset:
$ref: '#/components/schemas/asset'
index_price:
$ref: '#/components/schemas/index_price'
constituents:
type: array
items:
$ref: '#/components/schemas/IndexConstituent'
ts:
$ref: '#/components/schemas/ts'
index_price:
type: string
description: Index price
example: '100.00'
IndexConstituent:
type: object
required:
- source
- symbol
- weight
- price
properties:
source:
$ref: '#/components/schemas/source'
symbol:
$ref: '#/components/schemas/symbol'
weight:
$ref: '#/components/schemas/weight'
price:
$ref: '#/components/schemas/price'
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
source:
type: string
description: Source name
example: chainlink
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
weight:
type: string
description: Index constituent weight
example: '0.25'
price:
type: string
description: Price
example: '100.00'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,226 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Instrument Config
> Get per-instrument configuration (leverage and margin mode) for the authenticated account.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/config
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/config:
get:
summary: Get Instrument Config
description: >-
Get per-instrument configuration (leverage and margin mode) for the
authenticated account.
operationId: getConfig
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
responses:
'200':
description: Instrument config response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/AccountConfig'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
AccountConfig:
description: Account configuration.
type: object
required:
- instrument_id
- leverage
- cross
properties:
instrument_id:
$ref: '#/components/schemas/iid'
leverage:
$ref: '#/components/schemas/lev'
cross:
$ref: '#/components/schemas/cross'
iid:
type: integer
description: Instrument ID
example: 1
lev:
type: integer
description: Leverage
example: 10
cross:
type: boolean
description: Whether to use cross margin mode
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,310 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Instruments
> Get all instruments.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/instruments
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/instruments:
get:
summary: Get Instruments
description: Get all instruments.
operationId: getInstruments
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
- name: instrument_type
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_type'
- name: category
in: query
required: false
schema:
$ref: '#/components/schemas/category'
responses:
'200':
description: Instruments response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Instrument'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
instrument_type:
type: string
description: Instrument type
enum:
- perpetual
category:
type: string
description: Instrument category
enum:
- equity
- commodity
- index
- crypto
Instrument:
type: object
required:
- instrument_id
- instrument_type
- category
- symbol
- base_asset
- quote_asset
- funding_interval
- quantity_decimals
- price_decimals
- price_bounds
- liquidation_fee
- max_order_count
- min_notional
- max_market_notional
- max_limit_notional
- max_leverage
- risk_tiers
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
instrument_type:
$ref: '#/components/schemas/instrument_type'
category:
$ref: '#/components/schemas/category'
symbol:
$ref: '#/components/schemas/symbol'
base_asset:
$ref: '#/components/schemas/base_asset'
quote_asset:
$ref: '#/components/schemas/quote_asset'
funding_interval:
$ref: '#/components/schemas/funding_interval'
quantity_decimals:
$ref: '#/components/schemas/quantity_decimals'
price_decimals:
$ref: '#/components/schemas/price_decimals'
price_bounds:
$ref: '#/components/schemas/price_bounds'
liquidation_fee:
$ref: '#/components/schemas/liquidation_fee'
max_order_count:
$ref: '#/components/schemas/max_order_count'
min_notional:
$ref: '#/components/schemas/min_notional'
max_market_notional:
$ref: '#/components/schemas/max_market_notional'
max_limit_notional:
$ref: '#/components/schemas/max_limit_notional'
max_leverage:
$ref: '#/components/schemas/max_leverage'
risk_tiers:
type: array
items:
$ref: '#/components/schemas/RiskTier'
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
base_asset:
type: string
description: Base asset name
example: NVDA
quote_asset:
type: string
description: Quote asset name
example: USDC
funding_interval:
type: string
description: Funding interval
example: 1h
quantity_decimals:
type: integer
description: Number of decimal places for quantity.
example: 2
price_decimals:
type: integer
description: >-
Number of decimal places for price. Non-integer prices have a maximum of
5 significant figures; integer prices are allowed regardless of
significant figures.
example: 2
price_bounds:
type: string
description: Price bounds percentage
example: '0.05'
liquidation_fee:
type: string
description: Liquidation fee rate
example: '0.025'
max_order_count:
type: integer
description: Maximum open order count
example: 200
min_notional:
type: string
description: Minimum notional value in USD
example: '1.00'
max_market_notional:
type: string
description: Maximum market order notional value in USD
example: '1000000.00'
max_limit_notional:
type: string
description: Maximum limit order notional value in USD
example: '10000000.00'
max_leverage:
type: integer
description: Maximum leverage
example: 20
RiskTier:
type: object
required:
- lower_bound
- max_leverage
properties:
lower_bound:
$ref: '#/components/schemas/lower_bound'
max_leverage:
$ref: '#/components/schemas/max_leverage'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
lower_bound:
type: string
description: Position size lower bound
example: '0'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,282 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Internal Transfers
> Get settled internal transfer history for the authenticated account.
Returns both inbound and outbound transfers.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/internal-transfers
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/internal-transfers:
get:
summary: Get Internal Transfers
description: |
Get settled internal transfer history for the authenticated account.
Returns both inbound and outbound transfers.
operationId: getInternalTransfers
parameters:
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Internal transfer history response.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalTransfers'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
InternalTransfers:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/InternalTransfer'
more:
$ref: '#/components/schemas/more'
InternalTransfer:
type: object
required:
- transfer_id
- asset
- amount
- direction
- counterparty
- created_timestamp
properties:
transfer_id:
$ref: '#/components/schemas/transfer_id'
asset:
$ref: '#/components/schemas/asset'
amount:
$ref: '#/components/schemas/amount'
direction:
$ref: '#/components/schemas/direction'
counterparty:
$ref: '#/components/schemas/counterparty'
label:
$ref: '#/components/schemas/label'
created_timestamp:
$ref: '#/components/schemas/created_timestamp'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
transfer_id:
type: integer
description: Internal transfer ID
asset:
type: string
description: Asset name
example: USDC
amount:
type: string
description: >-
Raw token amount including decimals. For withdrawals this matches the
uint256 amount in the EIP-712 signature (e.g. "100000000" for 100 USDC
with 6 decimals).
example: '100000000'
direction:
type: string
description: Transfer direction relative to the authenticated account
enum:
- in
- out
counterparty:
type: string
description: Counterparty account address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
label:
type: string
description: Human-readable label for a proxy key or internal transfer
example: trading-bot
created_timestamp:
type: integer
description: Creation timestamp in milliseconds
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,237 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Klines
> Get klines for an instrument.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
<Badge color="gray" size="md">Request Weight: **5**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/klines
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/klines:
get:
summary: Get Klines
description: |
Get klines for an instrument.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
operationId: getKlines
parameters:
- name: instrument_id
in: query
required: true
schema:
$ref: '#/components/schemas/instrument_id'
- name: interval
in: query
required: true
schema:
$ref: '#/components/schemas/interval'
- name: start_timestamp
in: query
required: true
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Klines response.
content:
application/json:
schema:
$ref: '#/components/schemas/KlinesResponse'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
interval:
type: string
description: Kline interval
enum:
- 1s
- 1m
- 5m
- 15m
- 30m
- 1h
- 4h
- 6h
- 12h
- 1d
- 1w
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
KlinesResponse:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/kline'
maxItems: 1000
more:
$ref: '#/components/schemas/more'
kline:
type: array
description: |
- `1767225600000` - Open time
- `"100.00"` - Open price
- `"105.00"` - High price
- `"99.00"` - Low price
- `"102.00"` - Close price
- `"500.00"` - Volume (base unit)
- `42` - Number of trades
example:
- 1767225600000
- '100.00'
- '105.00'
- '99.00'
- '102.00'
- '500.00'
- 42
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,188 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Limit Tiers
> Get the list of account limit tiers. Action and open-order fields are enforced per account; legacy request-rate fields are not used for gateway request enforcement.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/limit-tiers
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/limit-tiers:
get:
summary: Get Limit Tiers
description: >-
Get the list of account limit tiers. Action and open-order fields are
enforced per account; legacy request-rate fields are not used for
gateway request enforcement.
operationId: getLimitTiers
responses:
'200':
description: Limit tiers response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/LimitTier'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
LimitTier:
type: object
required:
- min_volume_14d
- rate_per_minute_limit
- rate_burst_limit
- actions_per_minute_limit
- actions_burst_limit
- open_orders_limit
- messages_per_minute
properties:
min_volume_14d:
$ref: '#/components/schemas/min_volume'
rate_per_minute_limit:
$ref: '#/components/schemas/rate_per_minute_limit'
rate_burst_limit:
$ref: '#/components/schemas/rate_burst_limit'
actions_per_minute_limit:
$ref: '#/components/schemas/actions_per_minute_limit'
actions_burst_limit:
$ref: '#/components/schemas/actions_burst_limit'
open_orders_limit:
$ref: '#/components/schemas/open_orders_limit'
messages_per_minute:
$ref: '#/components/schemas/messages_per_minute'
min_volume:
type: string
description: Minimum volume threshold for this tier
example: '0'
rate_per_minute_limit:
type: integer
description: >-
Maximum IP request weight per minute. In limit tiers, this is a legacy
field and is not used for gateway enforcement.
example: 1200
rate_burst_limit:
type: integer
description: >-
Legacy limit-tier request-rate field. It is not used for gateway
enforcement.
actions_per_minute_limit:
type: integer
description: Maximum order action tokens per account per minute
example: 300
actions_burst_limit:
type: integer
description: Additional account action allowance limit
open_orders_limit:
type: integer
description: Maximum number of open orders per account
example: 1000
messages_per_minute:
type: integer
description: >-
Display-only per-minute action/message allowance, equal to
actions_per_minute_limit. Not separately configured or enforced.
example: 300
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,382 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Open Orders
> Get open orders for the authenticated account.
<Badge color="gray" size="md">Request Weight:</Badge>
<br />
<Badge color="gray" size="md">With instrument ID: **1**</Badge>
<br />
<Badge color="gray" size="md">Without instrument ID: **20**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/open-orders
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/open-orders:
get:
summary: Get Open Orders
description: Get open orders for the authenticated account.
operationId: getOpenOrders
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/iid'
responses:
'200':
description: Orders response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/OrderData'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
iid:
type: integer
description: Instrument ID
example: 1
OrderData:
type: object
required:
- order_id
- instrument_id
- buy
- price
- quantity
- tif
- post_only
- ro
- status
- resting_quantity
- filled_quantity
- created_timestamp
- updated_timestamp
properties:
order_id:
$ref: '#/components/schemas/oid'
instrument_id:
$ref: '#/components/schemas/iid'
buy:
$ref: '#/components/schemas/buy'
price:
$ref: '#/components/schemas/p'
quantity:
$ref: '#/components/schemas/qty'
tif:
$ref: '#/components/schemas/tif'
post_only:
$ref: '#/components/schemas/po'
ro:
$ref: '#/components/schemas/ro'
resting_quantity:
$ref: '#/components/schemas/rest'
filled_quantity:
$ref: '#/components/schemas/fill'
status:
$ref: '#/components/schemas/st'
created_timestamp:
$ref: '#/components/schemas/cts'
updated_timestamp:
$ref: '#/components/schemas/uts'
client_order_id:
$ref: '#/components/schemas/coid'
tpsl:
$ref: '#/components/schemas/TpSlOrderFields'
description: >-
Conditional-order fields. Present only when the order is a TP/SL
conditional order — `null`/omitted for regular orders.
oid:
type: integer
description: Order ID
example: 1234567890
buy:
type: boolean
description: Is buy
example: true
p:
type: string
description: Price
example: '100.00'
qty:
type: string
description: Quantity in no. of contracts
example: '10.00'
tif:
type: string
description: Time in force
enum:
- gtc
- ioc
- fok
po:
type: boolean
description: Post only
default: false
example: false
ro:
type: boolean
description: Reduce only
example: false
default: false
rest:
type: string
description: Resting quantity
example: '9.00'
fill:
type: string
description: Filled quantity
example: '1.00'
st:
type: string
description: Order status
example: open
cts:
type: integer
description: Create timestamp in milliseconds
example: 1767225600000
uts:
type: integer
description: Update timestamp in milliseconds
example: 1767225600000
coid:
type: string
description: Client order ID
minLength: 32
maxLength: 32
pattern: ^[0-9a-f]{32}$
example: 550e8400e29b41d4a716446655440000
TpSlOrderFields:
type: object
description: TP/SL-specific fields surfaced alongside the regular order shape.
required:
- kind
- scope
- trp
properties:
kind:
$ref: '#/components/schemas/kind'
scope:
$ref: '#/components/schemas/tr_scope'
trp:
$ref: '#/components/schemas/trp'
parent_oid:
$ref: '#/components/schemas/parent_oid'
armed_qty:
$ref: '#/components/schemas/qty'
description: >-
Quantity armed at attach time (OCO) or `"0"` for position-based
(sized at trigger time).
slip_bps:
$ref: '#/components/schemas/slip_bps'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
kind:
type: string
description: Conditional order type (TakeProfit / StopLoss)
enum:
- tp
- sl
tr_scope:
type: string
description: >
How the conditional order sizes itself.
- `order` - child of a parent entry (bracket / OCO ladder). Quantity is
required.
- `position` - attached to an open position. v1 always closes the full
position (`qty` must be `"0"`).
enum:
- order
- position
trp:
type: string
description: Trigger price
example: '110.00'
parent_oid:
type: integer
description: >-
Parent entry order id. Optional — omit it (do not send `0`) when the
parent is created in the same request (inline `CreateOrder.tpsl` or
`CreateTpSlArgs.parent`); the gateway auto-wires the child to it. Set it
only to attach an order-scoped leg to an existing resting order. Inline
`CreateOrder.tpsl` rejects a non-zero value; position-scoped legs carry
no parent.
example: 1234567890
slip_bps:
type: integer
minimum: 0
maximum: 10000
description: >-
Per-order market-trigger slippage cap in basis points. 0 = use the
per-instrument default. Clamped to the instrument cap.
example: 1000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,427 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Orders
> Get historical order snapshots for the authenticated account from the order history database.
Returns the latest known state for each matching order, including accepted, open, partial,
filled, and cancelled orders. For currently resting orders only, use Get Open Orders.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight:</Badge>
<br />
<Badge color="gray" size="md">With order ID: **1**</Badge>
<br />
<Badge color="gray" size="md">Without order ID: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/orders
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/orders:
get:
summary: Get Orders
description: >
Get historical order snapshots for the authenticated account from the
order history database.
Returns the latest known state for each matching order, including
accepted, open, partial,
filled, and cancelled orders. For currently resting orders only, use Get
Open Orders.
Maximum of 100 entries returned per request.
operationId: getOrders
parameters:
- name: order_id
in: query
required: false
schema:
$ref: '#/components/schemas/order_id'
- name: client_order_id
in: query
required: false
schema:
$ref: '#/components/schemas/coid'
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/iid'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Orders response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/OrderData'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
order_id:
type: integer
description: Order ID
coid:
type: string
description: Client order ID
minLength: 32
maxLength: 32
pattern: ^[0-9a-f]{32}$
example: 550e8400e29b41d4a716446655440000
iid:
type: integer
description: Instrument ID
example: 1
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
OrderData:
type: object
required:
- order_id
- instrument_id
- buy
- price
- quantity
- tif
- post_only
- ro
- status
- resting_quantity
- filled_quantity
- created_timestamp
- updated_timestamp
properties:
order_id:
$ref: '#/components/schemas/oid'
instrument_id:
$ref: '#/components/schemas/iid'
buy:
$ref: '#/components/schemas/buy'
price:
$ref: '#/components/schemas/p'
quantity:
$ref: '#/components/schemas/qty'
tif:
$ref: '#/components/schemas/tif'
post_only:
$ref: '#/components/schemas/po'
ro:
$ref: '#/components/schemas/ro'
resting_quantity:
$ref: '#/components/schemas/rest'
filled_quantity:
$ref: '#/components/schemas/fill'
status:
$ref: '#/components/schemas/st'
created_timestamp:
$ref: '#/components/schemas/cts'
updated_timestamp:
$ref: '#/components/schemas/uts'
client_order_id:
$ref: '#/components/schemas/coid'
tpsl:
$ref: '#/components/schemas/TpSlOrderFields'
description: >-
Conditional-order fields. Present only when the order is a TP/SL
conditional order — `null`/omitted for regular orders.
oid:
type: integer
description: Order ID
example: 1234567890
buy:
type: boolean
description: Is buy
example: true
p:
type: string
description: Price
example: '100.00'
qty:
type: string
description: Quantity in no. of contracts
example: '10.00'
tif:
type: string
description: Time in force
enum:
- gtc
- ioc
- fok
po:
type: boolean
description: Post only
default: false
example: false
ro:
type: boolean
description: Reduce only
example: false
default: false
rest:
type: string
description: Resting quantity
example: '9.00'
fill:
type: string
description: Filled quantity
example: '1.00'
st:
type: string
description: Order status
example: open
cts:
type: integer
description: Create timestamp in milliseconds
example: 1767225600000
uts:
type: integer
description: Update timestamp in milliseconds
example: 1767225600000
TpSlOrderFields:
type: object
description: TP/SL-specific fields surfaced alongside the regular order shape.
required:
- kind
- scope
- trp
properties:
kind:
$ref: '#/components/schemas/kind'
scope:
$ref: '#/components/schemas/tr_scope'
trp:
$ref: '#/components/schemas/trp'
parent_oid:
$ref: '#/components/schemas/parent_oid'
armed_qty:
$ref: '#/components/schemas/qty'
description: >-
Quantity armed at attach time (OCO) or `"0"` for position-based
(sized at trigger time).
slip_bps:
$ref: '#/components/schemas/slip_bps'
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
kind:
type: string
description: Conditional order type (TakeProfit / StopLoss)
enum:
- tp
- sl
tr_scope:
type: string
description: >
How the conditional order sizes itself.
- `order` - child of a parent entry (bracket / OCO ladder). Quantity is
required.
- `position` - attached to an open position. v1 always closes the full
position (`qty` must be `"0"`).
enum:
- order
- position
trp:
type: string
description: Trigger price
example: '110.00'
parent_oid:
type: integer
description: >-
Parent entry order id. Optional — omit it (do not send `0`) when the
parent is created in the same request (inline `CreateOrder.tpsl` or
`CreateTpSlArgs.parent`); the gateway auto-wires the child to it. Set it
only to attach an order-scoped leg to an existing resting order. Inline
`CreateOrder.tpsl` rejects a non-zero value; position-scoped legs carry
no parent.
example: 1234567890
slip_bps:
type: integer
minimum: 0
maximum: 10000
description: >-
Per-order market-trigger slippage cap in basis points. 0 = use the
per-instrument default. Clamped to the instrument cap.
example: 1000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,248 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get PnL
> Get PnL history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/pnl
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/pnl:
get:
summary: Get PnL
description: |
Get PnL history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 1000 entries returned per request.
operationId: getPnlHistory
parameters:
- name: interval
in: query
required: true
schema:
$ref: '#/components/schemas/pnl_interval'
- name: start_timestamp
in: query
required: true
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: PnL history response.
content:
application/json:
schema:
$ref: '#/components/schemas/PnlHistory'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
pnl_interval:
type: string
description: PnL interval
enum:
- 1h
- 4h
- 1d
- 1w
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
PnlHistory:
type: object
required:
- data
- more
properties:
data:
type: array
description: |
- `1767225600000` - Timestamp
- `"100.50"` - PnL
items:
type: array
example:
- 1767225600000
- '100.50'
maxItems: 1000
more:
$ref: '#/components/schemas/more'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,350 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Portfolio
> Get current portfolio snapshot including open positions, margin summary, and withdrawable balance.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/portfolio
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/portfolio:
get:
summary: Get Portfolio
description: >
Get current portfolio snapshot including open positions, margin summary,
and withdrawable balance.
operationId: getPortfolio
responses:
'200':
description: Portfolio response.
content:
application/json:
schema:
$ref: '#/components/schemas/Portfolio'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
Portfolio:
type: object
required:
- positions
- margin
- withdrawable
- in_liquidation
- timestamp
properties:
positions:
type: array
items:
$ref: '#/components/schemas/PortfolioPosition'
margin:
$ref: '#/components/schemas/MarginSummary'
withdrawable:
$ref: '#/components/schemas/withdrawable'
in_liquidation:
$ref: '#/components/schemas/in_liquidation'
timestamp:
$ref: '#/components/schemas/update_timestamp'
PortfolioPosition:
type: object
required:
- instrument_id
- symbol
- size
- entry_price
- leverage
- cross
- initial_margin
- maintenance_margin
- position_value
- liquidation_price
- unrealized_pnl
- return_on_equity
- cumulative_funding
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
symbol:
$ref: '#/components/schemas/symbol'
size:
$ref: '#/components/schemas/size'
entry_price:
$ref: '#/components/schemas/entry_price'
leverage:
$ref: '#/components/schemas/leverage'
cross:
$ref: '#/components/schemas/cross'
initial_margin:
$ref: '#/components/schemas/initial_margin'
maintenance_margin:
$ref: '#/components/schemas/maintenance_margin_amount'
position_value:
$ref: '#/components/schemas/position_value'
liquidation_price:
$ref: '#/components/schemas/liquidation_price'
unrealized_pnl:
$ref: '#/components/schemas/unrealized_pnl'
return_on_equity:
$ref: '#/components/schemas/return_on_equity'
cumulative_funding:
$ref: '#/components/schemas/cumulative_funding'
MarginSummary:
type: object
required:
- total_account_value
- total_initial_margin
- total_maintenance_margin
- total_position_value
properties:
total_account_value:
$ref: '#/components/schemas/total_account_value'
total_initial_margin:
$ref: '#/components/schemas/total_initial_margin'
total_maintenance_margin:
$ref: '#/components/schemas/total_maintenance_margin'
total_position_value:
$ref: '#/components/schemas/total_position_value'
withdrawable:
type: string
description: Withdrawable balance in USD
example: '13104.51'
in_liquidation:
type: boolean
description: Whether the account is currently under liquidation
update_timestamp:
type: integer
description: Update timestamp in milliseconds
example: 1767225600000
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
instrument_id:
type: integer
description: Instrument ID
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
size:
type: string
description: >-
Signed position size in no. of contracts (positive = long, negative =
short)
example: '10.00'
entry_price:
type: string
description: Average entry price
example: '2986.30'
leverage:
type: integer
description: Leverage
example: 10
cross:
type: boolean
description: Whether to use cross margin mode
initial_margin:
type: string
description: Initial margin in USD
example: '10.00'
maintenance_margin_amount:
type: string
description: Maintenance margin amount
example: '100.00'
position_value:
type: string
description: Notional position value in USD
example: '100.03'
liquidation_price:
type: string
description: Liquidation price
example: '2866.27'
unrealized_pnl:
type: string
description: Unrealized PnL in USD
example: '-0.01'
return_on_equity:
type: string
description: Return on equity as a decimal
example: '-0.0027'
cumulative_funding:
type: string
description: Cumulative funding paid/received in USD
example: '514.09'
total_account_value:
type: string
description: Total account value in USD (equity + unrealized PnL)
example: '13109.48'
total_initial_margin:
type: string
description: Total initial margin in use across all positions
example: '4.97'
total_maintenance_margin:
type: string
description: Total maintenance margin across all positions
example: '2.49'
total_position_value:
type: string
description: Total notional position value in USD
example: '100.03'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,232 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Public Portfolio
> Get public portfolio for an address including equity and open positions.
<Badge color="gray" size="md">Request Weight: **5**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/portfolio
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/portfolio:
get:
summary: Get Public Portfolio
description: |
Get public portfolio for an address including equity and open positions.
operationId: getPublicPortfolio
parameters:
- name: address
in: query
required: true
schema:
$ref: '#/components/schemas/address'
responses:
'200':
description: Public portfolio response.
content:
application/json:
schema:
$ref: '#/components/schemas/PublicPortfolio'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
address:
type: string
description: Address
example: '0x1234567890abcdef1234567890abcdef12345678'
PublicPortfolio:
type: object
required:
- positions
- equity
- timestamp
properties:
positions:
type: array
items:
$ref: '#/components/schemas/PublicPortfolioPosition'
equity:
$ref: '#/components/schemas/equity'
timestamp:
$ref: '#/components/schemas/update_timestamp'
PublicPortfolioPosition:
type: object
required:
- instrument_id
- symbol
- size
- entry_price
- unrealized_pnl
- return_on_equity
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
symbol:
$ref: '#/components/schemas/symbol'
size:
$ref: '#/components/schemas/size'
entry_price:
$ref: '#/components/schemas/entry_price'
unrealized_pnl:
$ref: '#/components/schemas/unrealized_pnl'
return_on_equity:
$ref: '#/components/schemas/return_on_equity'
equity:
type: string
description: Equity in USD
example: '10000.00'
update_timestamp:
type: integer
description: Update timestamp in milliseconds
example: 1767225600000
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
instrument_id:
type: integer
description: Instrument ID
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
size:
type: string
description: >-
Signed position size in no. of contracts (positive = long, negative =
short)
example: '10.00'
entry_price:
type: string
description: Average entry price
example: '2986.30'
unrealized_pnl:
type: string
description: Unrealized PnL in USD
example: '-0.01'
return_on_equity:
type: string
description: Return on equity as a decimal
example: '-0.0027'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,256 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Recent Trades
> Get public trades for an instrument.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/trades
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/trades:
get:
summary: Get Recent Trades
description: |
Get public trades for an instrument.
Maximum of 100 entries returned per request.
operationId: getTrades
parameters:
- name: instrument_id
in: query
required: true
schema:
$ref: '#/components/schemas/instrument_id'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Trades response.
content:
application/json:
schema:
$ref: '#/components/schemas/Trades'
'400':
$ref: '#/components/responses/Error400Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
Trades:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/TradeData'
description: Public trades for the instrument
more:
$ref: '#/components/schemas/more'
TradeData:
type: object
required:
- trade_id
- instrument_id
- side
- price
- quantity
- timestamp
- hash
properties:
trade_id:
$ref: '#/components/schemas/tid'
instrument_id:
$ref: '#/components/schemas/iid'
side:
$ref: '#/components/schemas/side'
price:
$ref: '#/components/schemas/p'
quantity:
$ref: '#/components/schemas/qty'
timestamp:
$ref: '#/components/schemas/ts'
hash:
$ref: '#/components/schemas/hash'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
tid:
type: integer
description: Trade ID
example: 1
iid:
type: integer
description: Instrument ID
example: 1
side:
type: string
description: Side
enum:
- long
- short
p:
type: string
description: Price
example: '100.00'
qty:
type: string
description: Quantity in no. of contracts
example: '10.00'
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
hash:
type: string
description: On-chain transaction hash, "0x" if not yet mined
default: 0x
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,139 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Server Time
> Get server time.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/time
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/time:
get:
summary: Get Server Time
description: |
Get server time.
operationId: getTime
responses:
'200':
description: Successful time response.
content:
application/json:
schema:
$ref: '#/components/schemas/Time'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
Time:
type: object
required:
- time
properties:
time:
$ref: '#/components/schemas/time'
time:
type: integer
description: Timestamp in milliseconds
example: 1767225600000
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,195 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Statistics
> Get last 24-hour statistics for all instruments.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/statistics
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/statistics:
get:
summary: Get Statistics
description: Get last 24-hour statistics for all instruments.
operationId: getStatistics
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
responses:
'200':
description: Statistics response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Statistic'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
Statistic:
type: object
required:
- instrument_id
- symbol
- volume
- open_price
- klines
properties:
instrument_id:
$ref: '#/components/schemas/iid'
symbol:
$ref: '#/components/schemas/symbol'
volume:
$ref: '#/components/schemas/volume'
open_price:
$ref: '#/components/schemas/open_price'
klines:
$ref: '#/components/schemas/klines'
iid:
type: integer
description: Instrument ID
example: 1
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
volume:
type: string
description: 24-hour trading volume in contracts
example: '1000.00'
open_price:
type: string
description: Opening price from 24 hours ago
example: '100.50'
klines:
type: array
items:
$ref: '#/components/schemas/kline'
description: Last 24-hour kline data
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
kline:
type: array
description: |
- `1767225600000` - Open time
- `"100.00"` - Open price
- `"105.00"` - High price
- `"99.00"` - Low price
- `"102.00"` - Close price
- `"500.00"` - Volume (base unit)
- `42` - Number of trades
example:
- 1767225600000
- '100.00'
- '105.00'
- '99.00'
- '102.00'
- '500.00'
- 42
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,213 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Tickers
> Get all instrument tickers with live market data.
<Badge color="gray" size="md">Request Weight: **2**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/info/tickers
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/info/tickers:
get:
summary: Get Tickers
description: Get all instrument tickers with live market data.
operationId: getTickers
parameters:
- name: instrument_id
in: query
required: false
schema:
$ref: '#/components/schemas/instrument_id'
responses:
'200':
description: Tickers response.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Ticker'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
instrument_id:
type: integer
description: Instrument ID
Ticker:
allOf:
- $ref: '#/components/schemas/TickerData'
- type: object
required:
- timestamp
properties:
timestamp:
$ref: '#/components/schemas/timestamp'
TickerData:
type: object
required:
- instrument_id
- symbol
- index_price
- mark_price
- last_price
- mid_price
- open_interest
- funding_rate
- next_funding
properties:
instrument_id:
$ref: '#/components/schemas/instrument_id'
symbol:
$ref: '#/components/schemas/symbol'
index_price:
$ref: '#/components/schemas/index_price'
mark_price:
$ref: '#/components/schemas/mark_price'
last_price:
$ref: '#/components/schemas/last_price'
mid_price:
$ref: '#/components/schemas/mid_price'
open_interest:
$ref: '#/components/schemas/open_interest'
funding_rate:
$ref: '#/components/schemas/funding_rate'
next_funding:
$ref: '#/components/schemas/next_funding'
timestamp:
type: integer
description: Timestamp in milliseconds
example: 1767225600000
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
symbol:
type: string
description: Instrument symbol
example: NVDA-USDC
index_price:
type: string
description: Index price
example: '100.00'
mark_price:
type: string
description: Mark price
example: '100.00'
last_price:
type: string
description: Last traded price
example: '100.00'
mid_price:
type: string
description: Mid price
example: '100.00'
open_interest:
type: string
description: Open interest in number of contracts
example: '10.00'
funding_rate:
type: string
description: Funding rate
example: '0.0001'
next_funding:
type: integer
description: Next funding timestamp in milliseconds
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,325 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get Withdrawals
> Get withdrawal history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
<Badge color="gray" size="md">Request Weight: **10**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json get /v1/account/withdrawals
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/withdrawals:
get:
summary: Get Withdrawals
description: |
Get withdrawal history for the authenticated account.
If no end time is provided, the current time will be used.
Maximum of 100 entries returned per request.
operationId: getWithdrawals
parameters:
- name: withdrawal_status
in: query
required: false
schema:
$ref: '#/components/schemas/withdrawal_status'
- name: hash
in: query
required: false
schema:
$ref: '#/components/schemas/hash'
- name: start_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/start_timestamp'
- name: end_timestamp
in: query
required: false
schema:
$ref: '#/components/schemas/end_timestamp'
responses:
'200':
description: Withdrawal history response.
content:
application/json:
schema:
$ref: '#/components/schemas/Withdrawals'
'400':
$ref: '#/components/responses/Error400Response'
'401':
$ref: '#/components/responses/Error401Response'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security:
- polymarket_proxy: []
polymarket_secret: []
components:
schemas:
withdrawal_status:
type: string
description: Withdrawal status
enum:
- pending
- confirmed
- removed
- failed
hash:
type: string
description: On-chain transaction hash, "0x" if not yet mined
default: 0x
example: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
start_timestamp:
type: integer
description: Start timestamp in milliseconds
example: 1767225600000
end_timestamp:
type: integer
description: End timestamp in milliseconds
example: 1767229200000
Withdrawals:
type: object
required:
- data
- more
properties:
data:
type: array
items:
$ref: '#/components/schemas/Withdrawal'
more:
$ref: '#/components/schemas/more'
Withdrawal:
type: object
required:
- withdraw_id
- asset
- amount
- fee
- status
- to
- hash
- confirmations
- required_confirmations
- created_timestamp
properties:
withdraw_id:
$ref: '#/components/schemas/withdraw_id'
asset:
$ref: '#/components/schemas/asset'
amount:
$ref: '#/components/schemas/amount'
to:
$ref: '#/components/schemas/to'
fee:
$ref: '#/components/schemas/withdrawal_fee'
status:
$ref: '#/components/schemas/withdrawal_status'
hash:
$ref: '#/components/schemas/hash'
confirmations:
$ref: '#/components/schemas/confirmations'
required_confirmations:
$ref: '#/components/schemas/required_confirmations'
created_timestamp:
$ref: '#/components/schemas/created_timestamp'
confirmed_timestamp:
$ref: '#/components/schemas/confirmed_timestamp'
more:
type: boolean
description: More data available
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error401:
title: Error401
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
withdraw_id:
type: integer
description: Withdraw ID
asset:
type: string
description: Asset name
example: USDC
amount:
type: string
description: >-
Raw token amount including decimals. For withdrawals this matches the
uint256 amount in the EIP-712 signature (e.g. "100000000" for 100 USDC
with 6 decimals).
example: '100000000'
to:
type: string
description: Destination address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
withdrawal_fee:
type: string
description: Withdrawal transaction fee in decimalized asset units
example: '5.00'
confirmations:
type: integer
description: Number of block confirmations
example: 12
required_confirmations:
type: integer
description: Required number of block confirmations
example: 12
created_timestamp:
type: integer
description: Creation timestamp in milliseconds
example: 1767225600000
confirmed_timestamp:
type: integer
description: Confirmation timestamp in milliseconds
example: 1767225600000
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error401Response:
description: >
Unauthorized — missing or invalid `POLYMARKET-PROXY` /
`POLYMARKET-SECRET`
credentials. `error` is `unauthorized`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error401'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
securitySchemes:
polymarket_proxy:
type: apiKey
name: POLYMARKET-PROXY
in: header
description: Proxy address
polymarket_secret:
type: apiKey
name: POLYMARKET-SECRET
in: header
description: Correponding proxy secret
````
@@ -0,0 +1,304 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Internal Transfer
> Submit a signed internal ledger transfer between two exchange accounts.
Requires proxy signature using the standard signed-op flow.
<Badge color="gray" size="md">Request Weight: **1**</Badge>
## OpenAPI
````yaml /api-spec/perps-openapi.json post /v1/account/internal-transfer
openapi: 3.0.3
info:
title: Polymarket Perps HTTP API
version: 1.0.0
description: HTTP API for Polymarket perpetual trading system.
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.perpetuals.polymarket.com
description: Production Perps HTTP API
security: []
paths:
/v1/account/internal-transfer:
post:
summary: Internal Transfer
description: |
Submit a signed internal ledger transfer between two exchange accounts.
Requires proxy signature using the standard signed-op flow.
operationId: internalTransfer
requestBody:
description: Internal transfer request.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalTransferRequest'
examples:
transfer:
summary: Transfer USDC to another account
value:
op:
type: internalTransfer
args:
account: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
token: '0xaf88d065e77c8cc2239327c5edb3a432268e5831'
amount: '100.00'
to: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
sig: >-
0x5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a1c
salt: 555555555
ts: 1767000014000
label: ops-rebalance
responses:
'200':
description: The accepted transfer, carrying its `transfer_id`.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalTransferAccepted'
'400':
$ref: '#/components/responses/Error400Response'
'422':
description: |
The transfer was rejected on its merits (e.g. insufficient balance,
transfer to self). The body carries `transfer_id` and `error`.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalTransferRejected'
'429':
$ref: '#/components/responses/Error429Response'
'500':
$ref: '#/components/responses/Error500Response'
security: []
components:
schemas:
InternalTransferRequest:
allOf:
- type: object
required:
- op
properties:
op:
$ref: '#/components/schemas/OpInternalTransfer'
- $ref: '#/components/schemas/BaseOp'
- type: object
properties:
label:
$ref: '#/components/schemas/label'
InternalTransferAccepted:
type: object
required:
- status
- transfer_id
properties:
status:
type: string
enum:
- ok
transfer_id:
$ref: '#/components/schemas/transfer_id'
InternalTransferRejected:
type: object
required:
- status
- transfer_id
- error
properties:
status:
type: string
enum:
- err
transfer_id:
$ref: '#/components/schemas/transfer_id'
error:
$ref: '#/components/schemas/error'
OpInternalTransfer:
type: object
required:
- type
- args
properties:
type:
type: string
enum:
- internalTransfer
args:
type: object
required:
- account
- token
- amount
- to
properties:
account:
$ref: '#/components/schemas/account'
token:
$ref: '#/components/schemas/token'
amount:
$ref: '#/components/schemas/amount'
to:
$ref: '#/components/schemas/to'
BaseOp:
type: object
required:
- sig
- salt
- ts
properties:
sig:
$ref: '#/components/schemas/sig'
salt:
$ref: '#/components/schemas/salt'
ts:
$ref: '#/components/schemas/ts'
label:
type: string
description: Human-readable label for a proxy key or internal transfer
example: trading-bot
transfer_id:
type: integer
description: Internal transfer ID
Error400:
title: Error400
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
error:
type: string
description: >-
Error identifier. For domain rejections and transport errors
(`401`/`404`/`429`/`500`) this is a stable, machine-readable snake_case
identifier that is part of the API contract and safe to branch on, e.g.
`insufficient_margin`, `insufficient_balance`, `order_not_found`,
`reduce_only_invalid`, `unauthorized`, `not_found`. For `400` it is a
human-readable validation detail whose wording may change. See the Error
handling guide for the domain identifiers. (Post-only / Fill-or-Kill
outcomes are order statuses such as `post_only_rejected`, not
rejections.)
example: insufficient_margin
Error429:
title: Error429
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
Error500:
title: Error500
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- err
error:
$ref: '#/components/schemas/error'
account:
type: string
description: Account address in hex format
example: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
token:
type: string
description: Token contract address in hex format
example: '0xaf88d065e77c8cc2239327c5edb3a432268e5831'
amount:
type: string
description: >-
Raw token amount including decimals. For withdrawals this matches the
uint256 amount in the EIP-712 signature (e.g. "100000000" for 100 USDC
with 6 decimals).
example: '100000000'
to:
type: string
description: Destination address in hex format
example: '0x1234567890abcdef1234567890abcdef12345678'
sig:
type: string
description: Signature in hex format
example: 0x1234567890...
salt:
type: integer
description: Salt
example: 1234567890
ts:
type: integer
description: >-
Request timestamp. Unix milliseconds for most operations; Unix seconds
for withdrawals (must match the on-chain EIP-712 struct verified against
block.timestamp).
example: 1767225600000
responses:
Error400Response:
description: |
Bad request — the request was malformed or failed validation (bad query
parameters, unparseable body, invalid signature, or a domain pre-check).
The `error` field is a human-readable validation detail.
content:
application/json:
schema:
$ref: '#/components/schemas/Error400'
Error429Response:
description: >
Too Many Requests. `error` distinguishes the limit that was hit:
`ip_rate_limited` (per-IP token bucket), `action_rate_limited`
(per-account
action rate), or `open_orders_limit` (resting open-order cap).
headers:
Retry-After:
description: >
Whole seconds to wait before retrying. Present only on token-bucket
rate-limit rejections (`ip_rate_limited` and `action_rate_limited`);
a
conservative estimate of when enough capacity will have refilled to
admit the request. Absent on `open_orders_limit`, which is a
capacity
limit, not a rate limit — waiting does not free order slots; cancel
resting orders or wait for fills instead.
schema:
type: integer
example: 2
content:
application/json:
schema:
$ref: '#/components/schemas/Error429'
Error500Response:
description: |
Internal server error. `error` is `internal_error`.
content:
application/json:
schema:
$ref: '#/components/schemas/Error500'
````
@@ -0,0 +1,59 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Introduction
> Overview of the Polymarket APIs
The Polymarket API provides programmatic access to the world's largest prediction market. The platform is served by three separate APIs, each handling a different domain.
***
## APIs
<CardGroup cols={1}>
<Card title="Gamma API" icon="database">
**`https://gamma-api.polymarket.com`**
Markets, events, tags, series, comments, sports, search, and public profiles. This is the primary API for discovering and browsing market data.
</Card>
<Card title="Data API" icon="chart-line">
**`https://data-api.polymarket.com`**
User positions, trades, activity, holder data, open interest, leaderboards, and builder analytics.
</Card>
<Card title="CLOB API" icon="arrows-rotate">
**`https://clob.polymarket.com`**
Orderbook data, pricing, midpoints, spreads, and price history. Also handles order placement, cancellation, and other trading operations. Trading endpoints require [authentication](/api-reference/authentication).
</Card>
</CardGroup>
<Info>
A separate **Bridge API** (`https://bridge.polymarket.com`) handles deposits and withdrawals. Bridges are not handled by Polymarket, it is a proxy of fun.xyz service.
</Info>
***
## Authentication
The Gamma API and Data API are fully public — no authentication required.
The CLOB API has both public endpoints (orderbook, prices) and authenticated endpoints (order management). See [Authentication](/api-reference/authentication) for details.
***
## Next Steps
<CardGroup cols={2}>
<Card title="Authentication" icon="key" href="/api-reference/authentication">
Learn how to authenticate requests for trading endpoints.
</Card>
<Card title="Clients & SDKs" icon="cube" href="/api-reference/clients-sdks">
Official TypeScript, Python, and Rust libraries.
</Card>
</CardGroup>
@@ -0,0 +1,435 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Cancel a quote
> Cancel an active maker quote before it is selected. Requires CLOB L2
authentication for the maker role. `signer_address` and `maker_address`
must match the authenticated identity.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/quotes/cancel
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/quotes/cancel:
post:
tags:
- Maker
summary: Cancel a quote
description: |
Cancel an active maker quote before it is selected. Requires CLOB L2
authentication for the maker role. `signer_address` and `maker_address`
must match the authenticated identity.
operationId: cancelMakerQuote
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CancelQuoteRequest'
example:
rfq_id: rfq_<id>
quote_id: quote_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
responses:
'200':
description: Current RFQ snapshot after the cancellation was applied
content:
application/json:
schema:
$ref: '#/components/schemas/RFQSnapshot'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
CancelQuoteRequest:
type: object
properties:
rfq_id:
type: string
example: rfq_<id>
quote_id:
type: string
example: quote_<id>
signer_address:
type: string
description: Must match the authenticated `signer_address`.
example: 0xYourSigner
maker_address:
type: string
description: Must match the authenticated `maker_address`.
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
required:
- rfq_id
- quote_id
- signer_address
- maker_address
- signature_type
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a string.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````
@@ -0,0 +1,669 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Confirm or decline last look
> Respond to a last-look confirmation request for a selected quote. Requires
CLOB L2 authentication for the maker role. `decision` must be `CONFIRM` or
`DECLINE`.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/confirmations
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/confirmations:
post:
tags:
- Maker
summary: Confirm or decline last look
description: >
Respond to a last-look confirmation request for a selected quote.
Requires
CLOB L2 authentication for the maker role. `decision` must be `CONFIRM`
or
`DECLINE`.
operationId: submitMakerConfirmation
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MakerConfirmationRequest'
example:
rfq_id: rfq_<id>
quote_id: quote_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
decision: CONFIRM
responses:
'200':
description: Result of the confirmation — a snapshot and/or an execution handoff
content:
application/json:
schema:
$ref: '#/components/schemas/MakerConfirmationResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
MakerConfirmationRequest:
type: object
description: Maker last-look confirmation response.
properties:
rfq_id:
type: string
example: rfq_<id>
quote_id:
type: string
example: quote_<id>
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
decision:
type: string
description: Confirmation decision.
enum:
- CONFIRM
- DECLINE
required:
- rfq_id
- quote_id
- signer_address
- maker_address
- signature_type
- decision
MakerConfirmationResult:
type: object
description: >
Result of a maker confirmation. Includes a snapshot, an execution
handoff,
or both, depending on whether the confirmation completed the bundle.
properties:
snapshot:
$ref: '#/components/schemas/RFQSnapshot'
execution:
$ref: '#/components/schemas/ExecutionHandoff'
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
ExecutionHandoff:
type: object
description: Handoff produced when a confirmed RFQ is ready for onchain execution.
properties:
execution_id:
type: string
request:
$ref: '#/components/schemas/RFQRequest'
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
requester_acceptance:
$ref: '#/components/schemas/RequesterAcceptance'
maker_quotes:
type: array
items:
$ref: '#/components/schemas/Quote'
reservations:
type: array
items:
$ref: '#/components/schemas/WalletReservation'
ready_at:
type: integer
format: int64
description: Unix milliseconds.
required:
- execution_id
- request
- quote_id
- bundle
- requester_acceptance
- maker_quotes
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
RequesterAcceptance:
type: object
properties:
rfq_id:
type: string
quote_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
accepted_at:
type: integer
format: int64
description: Unix milliseconds.
required:
- rfq_id
- quote_id
- signed_order
Quote:
type: object
description: A signed maker quote.
properties:
quote_id:
type: string
description: Maker-generated quote ID (required for REST submissions).
example: quote_<id>
rfq_id:
type: string
description: RFQ ID from the `RFQ_REQUEST`.
example: rfq_<id>
auth_address:
type: string
description: Derived from the authenticated session; ignored if provided.
readOnly: true
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
price_e6:
type: string
description: Quote price in six-decimal fixed-point units (must be positive).
example: '450000'
size_e6:
type: string
description: >
Fillable share count in six-decimal fixed-point units (must be
positive).
Note this differs from the request's size field, which may be
notional or shares.
example: '1000000'
valid_until:
type: integer
format: int64
description: Optional quote expiry in Unix milliseconds.
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
received_at:
type: integer
format: int64
description: Server-assigned receipt time in Unix milliseconds.
readOnly: true
required:
- quote_id
- rfq_id
- signer_address
- maker_address
- signature_type
- price_e6
- size_e6
- signed_order
WalletReservation:
type: object
properties:
action_id:
type: string
user:
type: string
wallet_nonce:
type: integer
format: int64
deltas:
type: array
items:
$ref: '#/components/schemas/WalletAssetDelta'
required:
- action_id
- user
- wallet_nonce
- deltas
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a string.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
ExchangeV3Order:
type: object
description: >-
Signed Exchange v3 order. Combinatorial RFQ trades settle through
Exchange v3.
properties:
salt:
type: string
description: Order salt (uint256 as a decimal string)
maker:
type: string
description: Wallet that funds the order
example: 0xYourQuoterWallet
signer:
type: string
description: Address that signs the order
example: 0xYourSigner
tokenId:
type: string
description: YES or NO combo position ID (uint256 as a decimal string)
makerAmount:
type: string
description: >-
Amount the maker pays, in six-decimal base units (uint256 as a
string)
takerAmount:
type: string
description: >-
Amount the maker receives, in six-decimal base units (uint256 as a
string)
side:
type: integer
description: Order side — `0` BUY, `1` SELL
enum:
- 0
- 1
signatureType:
$ref: '#/components/schemas/SignatureType'
timestamp:
type: string
description: Order timestamp in Unix seconds (as a string)
metadata:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
builder:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
signature:
type: string
description: EIP-712 signature over the order
example: 0x...
required:
- salt
- maker
- signer
- tokenId
- makerAmount
- takerAmount
- side
- signatureType
- timestamp
- signature
WalletAssetDelta:
type: object
properties:
asset:
type: string
asset_id:
type: string
amount:
type: string
required:
- asset
- asset_id
- amount
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````
@@ -0,0 +1,550 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Submit a quote
> Submit a signed maker quote for an active RFQ. Requires CLOB L2
authentication for the maker role.
REST does not assign a quote ID — generate `quote_id` client-side.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/quotes
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/quotes:
post:
tags:
- Maker
summary: Submit a quote
description: |
Submit a signed maker quote for an active RFQ. Requires CLOB L2
authentication for the maker role.
REST does not assign a quote ID — generate `quote_id` client-side.
operationId: submitMakerQuote
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Quote'
example:
quote_id: quote_<id>
rfq_id: rfq_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
price_e6: '450000'
size_e6: '1000000'
signed_order:
salt: <order_salt>
maker: 0xYourQuoterWallet
signer: 0xYourSigner
tokenId: <yes_or_no_position_id>
makerAmount: <amount_to_pay>
takerAmount: <taker_amount>
side: 0
signatureType: 0
timestamp: <unix_seconds>
metadata: >-
0x0000000000000000000000000000000000000000000000000000000000000000
builder: >-
0x0000000000000000000000000000000000000000000000000000000000000000
signature: 0x...
responses:
'200':
description: Current RFQ snapshot after the quote was accepted
content:
application/json:
schema:
$ref: '#/components/schemas/RFQSnapshot'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
Quote:
type: object
description: A signed maker quote.
properties:
quote_id:
type: string
description: Maker-generated quote ID (required for REST submissions).
example: quote_<id>
rfq_id:
type: string
description: RFQ ID from the `RFQ_REQUEST`.
example: rfq_<id>
auth_address:
type: string
description: Derived from the authenticated session; ignored if provided.
readOnly: true
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
price_e6:
type: string
description: Quote price in six-decimal fixed-point units (must be positive).
example: '450000'
size_e6:
type: string
description: >
Fillable share count in six-decimal fixed-point units (must be
positive).
Note this differs from the request's size field, which may be
notional or shares.
example: '1000000'
valid_until:
type: integer
format: int64
description: Optional quote expiry in Unix milliseconds.
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
received_at:
type: integer
format: int64
description: Server-assigned receipt time in Unix milliseconds.
readOnly: true
required:
- quote_id
- rfq_id
- signer_address
- maker_address
- signature_type
- price_e6
- size_e6
- signed_order
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
ExchangeV3Order:
type: object
description: >-
Signed Exchange v3 order. Combinatorial RFQ trades settle through
Exchange v3.
properties:
salt:
type: string
description: Order salt (uint256 as a decimal string)
maker:
type: string
description: Wallet that funds the order
example: 0xYourQuoterWallet
signer:
type: string
description: Address that signs the order
example: 0xYourSigner
tokenId:
type: string
description: YES or NO combo position ID (uint256 as a decimal string)
makerAmount:
type: string
description: >-
Amount the maker pays, in six-decimal base units (uint256 as a
string)
takerAmount:
type: string
description: >-
Amount the maker receives, in six-decimal base units (uint256 as a
string)
side:
type: integer
description: Order side — `0` BUY, `1` SELL
enum:
- 0
- 1
signatureType:
$ref: '#/components/schemas/SignatureType'
timestamp:
type: string
description: Order timestamp in Unix seconds (as a string)
metadata:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
builder:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
signature:
type: string
description: EIP-712 signature over the order
example: 0x...
required:
- salt
- maker
- signer
- tokenId
- makerAmount
- takerAmount
- side
- signatureType
- timestamp
- signature
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a string.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````
@@ -0,0 +1,121 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get fee rate by path parameter
> Retrieves the base fee rate for a specific token ID using the token ID as a path parameter.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /fee-rate/{token_id}
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/fee-rate/{token_id}:
get:
tags:
- Market Data
summary: Get fee rate by path parameter
description: >
Retrieves the base fee rate for a specific token ID using the token ID
as a path parameter.
operationId: getFeeRateByPath
parameters:
- name: token_id
in: path
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved fee rate
content:
application/json:
schema:
$ref: '#/components/schemas/FeeRate'
example:
base_fee: 30
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - Fee rate not found for market
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: fee rate not found for market
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
FeeRate:
type: object
required:
- base_fee
properties:
base_fee:
type: integer
format: int64
description: Base fee in basis points
example: 30
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,124 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get fee rate
> Retrieves the base fee rate for a specific token ID.
The fee rate can be provided either as a query parameter or as a path parameter.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /fee-rate
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/fee-rate:
get:
tags:
- Market Data
summary: Get fee rate
description: >
Retrieves the base fee rate for a specific token ID.
The fee rate can be provided either as a query parameter or as a path
parameter.
operationId: getFeeRate
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: false
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved fee rate
content:
application/json:
schema:
$ref: '#/components/schemas/FeeRate'
example:
base_fee: 30
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - Fee rate not found for market
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: fee rate not found for market
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
FeeRate:
type: object
required:
- base_fee
properties:
base_fee:
type: integer
format: int64
description: Base fee in basis points
example: 30
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,120 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get last trade price
> Retrieves the last trade price and side for a specific token ID.
Returns default values of "0.5" for price and empty string for side if no trades found.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /last-trade-price
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/last-trade-price:
get:
tags:
- Market Data
summary: Get last trade price
description: >
Retrieves the last trade price and side for a specific token ID.
Returns default values of "0.5" for price and empty string for side if
no trades found.
operationId: getLastTradePrice
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved last trade price
content:
application/json:
schema:
type: object
required:
- price
- side
properties:
price:
type: string
description: Last trade price
example: '0.45'
side:
type: string
description: Last trade side (BUY or SELL)
enum:
- BUY
- SELL
- ''
example: BUY
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,140 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get last trade prices (query parameters)
> Retrieves last trade prices for multiple token IDs using query parameters.
Maximum 500 token IDs can be requested per call.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /last-trades-prices
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/last-trades-prices:
get:
tags:
- Market Data
summary: Get last trade prices (query parameters)
description: >
Retrieves last trade prices for multiple token IDs using query
parameters.
Maximum 500 token IDs can be requested per call.
operationId: getLastTradesPricesGet
parameters:
- name: token_ids
in: query
description: Comma-separated list of token IDs (max 500)
required: true
schema:
type: string
example: 0xabc123...,0xdef456...
responses:
'200':
description: Successfully retrieved last trade prices
content:
application/json:
schema:
type: array
items:
type: object
required:
- token_id
- price
- side
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
price:
type: string
description: Last trade price
example: '0.45'
side:
type: string
description: Last trade side (BUY or SELL)
enum:
- BUY
- SELL
example: BUY
example:
- token_id: 0xabc123def456...
price: '0.45'
side: BUY
- token_id: 0xdef456abc123...
price: '0.52'
side: SELL
'400':
description: Bad request - Invalid payload or exceeds limit
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalid_payload:
summary: Invalid payload
value:
error: Invalid payload
exceeds_limit:
summary: Payload exceeds limit
value:
error: Payload exceeds the limit
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,157 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get last trade prices (request body)
> Retrieves last trade prices for multiple token IDs using a request body.
Maximum 500 token IDs can be requested per call.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml post /last-trades-prices
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/last-trades-prices:
post:
tags:
- Market Data
summary: Get last trade prices (request body)
description: |
Retrieves last trade prices for multiple token IDs using a request body.
Maximum 500 token IDs can be requested per call.
operationId: getLastTradesPricesPost
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BookRequest'
example:
- token_id: 0xabc123def456...
- token_id: 0xdef456abc123...
responses:
'200':
description: Successfully retrieved last trade prices
content:
application/json:
schema:
type: array
items:
type: object
required:
- token_id
- price
- side
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
price:
type: string
description: Last trade price
example: '0.45'
side:
type: string
description: Last trade side (BUY or SELL)
enum:
- BUY
- SELL
example: BUY
example:
- token_id: 0xabc123def456...
price: '0.45'
side: BUY
- token_id: 0xdef456abc123...
price: '0.52'
side: SELL
'400':
description: Bad request - Invalid payload or exceeds limit
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalid_payload:
summary: Invalid payload
value:
error: Invalid payload
exceeds_limit:
summary: Payload exceeds limit
value:
error: Payload exceeds the limit
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
BookRequest:
type: object
required:
- token_id
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
side:
type: string
description: Order side (optional, not used for midpoint calculation)
enum:
- BUY
- SELL
example: BUY
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,139 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get market price
> Retrieves the best market price for a specific token ID and side (bid or ask).
Returns the best bid price for BUY side or best ask price for SELL side.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /price
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/price:
get:
tags:
- Market Data
summary: Get market price
description: >
Retrieves the best market price for a specific token ID and side (bid or
ask).
Returns the best bid price for BUY side or best ask price for SELL side.
operationId: getPrice
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
- name: side
in: query
description: Order side
required: true
schema:
type: string
enum:
- BUY
- SELL
example: BUY
responses:
'200':
description: Successfully retrieved market price
content:
application/json:
schema:
type: object
required:
- price
properties:
price:
type: number
format: double
description: Market price as a decimal number
example: 0.45
example:
price: 0.45
'400':
description: Bad request - Invalid token id or side
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalid_token_id:
summary: Invalid token id
value:
error: Invalid token id
invalid_side:
summary: Invalid side
value:
error: Invalid side
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,136 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get market prices (query parameters)
> Retrieves market prices for multiple token IDs and sides using query parameters.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /prices
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/prices:
get:
tags:
- Market Data
summary: Get market prices (query parameters)
description: >
Retrieves market prices for multiple token IDs and sides using query
parameters.
operationId: getPricesGet
parameters:
- name: token_ids
in: query
description: Comma-separated list of token IDs
required: true
schema:
type: string
example: 0xabc123...,0xdef456...
- name: sides
in: query
description: >-
Comma-separated list of sides (BUY or SELL) corresponding to token
IDs
required: true
schema:
type: string
example: BUY,SELL
responses:
'200':
description: Successfully retrieved market prices
content:
application/json:
schema:
type: object
additionalProperties:
type: object
additionalProperties:
type: number
format: double
description: Map of token ID to map of side to price
example:
0xabc123def456...:
BUY: 0.45
0xdef456abc123...:
SELL: 0.52
'400':
description: Bad request - Invalid payload or side
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalid_payload:
summary: Invalid payload
value:
error: Invalid payload
invalid_side:
summary: Invalid side
value:
error: Invalid side
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,151 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get market prices (request body)
> Retrieves market prices for multiple token IDs and sides using a request body.
Each request must include both token_id and side.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml post /prices
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/prices:
post:
tags:
- Market Data
summary: Get market prices (request body)
description: >
Retrieves market prices for multiple token IDs and sides using a request
body.
Each request must include both token_id and side.
operationId: getPricesPost
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BookRequest'
example:
- token_id: 0xabc123def456...
side: BUY
- token_id: 0xdef456abc123...
side: SELL
responses:
'200':
description: Successfully retrieved market prices
content:
application/json:
schema:
type: object
additionalProperties:
type: object
additionalProperties:
type: number
format: double
description: Map of token ID to map of side to price
example:
0xabc123def456...:
BUY: 0.45
0xdef456abc123...:
SELL: 0.52
'400':
description: Bad request - Invalid payload or side
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalid_payload:
summary: Invalid payload
value:
error: Invalid payload
invalid_side:
summary: Invalid side
value:
error: Invalid side
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
BookRequest:
type: object
required:
- token_id
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
side:
type: string
description: Order side (optional, not used for midpoint calculation)
enum:
- BUY
- SELL
example: BUY
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,110 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get midpoint prices (query parameters)
> Retrieves midpoint prices for multiple token IDs using query parameters.
The midpoint is calculated as the average of the best bid and best ask prices.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /midpoints
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/midpoints:
get:
tags:
- Market Data
summary: Get midpoint prices (query parameters)
description: >
Retrieves midpoint prices for multiple token IDs using query parameters.
The midpoint is calculated as the average of the best bid and best ask
prices.
operationId: getMidpointsGet
parameters:
- name: token_ids
in: query
description: Comma-separated list of token IDs
required: true
schema:
type: string
example: 0xabc123...,0xdef456...
responses:
'200':
description: Successfully retrieved midpoint prices
content:
application/json:
schema:
type: object
additionalProperties:
type: string
description: Map of token ID to midpoint price
example:
0xabc123def456...: '0.45'
0xdef456abc123...: '0.52'
'400':
description: Bad request - Invalid payload
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid payload
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: error getting the mid price
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,129 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get midpoint prices (request body)
> Retrieves midpoint prices for multiple token IDs using a request body.
The midpoint is calculated as the average of the best bid and best ask prices.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml post /midpoints
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/midpoints:
post:
tags:
- Market Data
summary: Get midpoint prices (request body)
description: >
Retrieves midpoint prices for multiple token IDs using a request body.
The midpoint is calculated as the average of the best bid and best ask
prices.
operationId: getMidpointsPost
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BookRequest'
example:
- token_id: 0xabc123def456...
- token_id: 0xdef456abc123...
responses:
'200':
description: Successfully retrieved midpoint prices
content:
application/json:
schema:
type: object
additionalProperties:
type: string
description: Map of token ID to midpoint price
example:
0xabc123def456...: '0.45'
0xdef456abc123...: '0.52'
'400':
description: Bad request - Invalid payload
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid payload
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: error getting the mid price
security: []
components:
schemas:
BookRequest:
type: object
required:
- token_id
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
side:
type: string
description: Order side (optional, not used for midpoint calculation)
enum:
- BUY
- SELL
example: BUY
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,199 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get order book
> Retrieves the order book summary for a specific token ID.
Includes bids, asks, market details, and last trade price.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /book
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/book:
get:
tags:
- Market Data
summary: Get order book
description: |
Retrieves the order book summary for a specific token ID.
Includes bids, asks, market details, and last trade price.
operationId: getBook
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved order book
content:
application/json:
schema:
$ref: '#/components/schemas/OrderBookSummary'
example:
market: '0x1234567890123456789012345678901234567890'
asset_id: 0xabc123def456...
timestamp: '1234567890'
hash: a1b2c3d4e5f6...
bids:
- price: '0.45'
size: '100'
- price: '0.44'
size: '200'
asks:
- price: '0.46'
size: '150'
- price: '0.47'
size: '250'
min_order_size: '1'
tick_size: '0.01'
neg_risk: false
last_trade_price: '0.45'
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: error getting the orderbook
security: []
components:
schemas:
OrderBookSummary:
type: object
required:
- market
- asset_id
- timestamp
- hash
- bids
- asks
- min_order_size
- tick_size
- neg_risk
- last_trade_price
properties:
market:
type: string
description: Market condition ID
example: '0x1234567890123456789012345678901234567890'
asset_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
timestamp:
type: string
description: Timestamp of the order book snapshot
example: '1234567890'
hash:
type: string
description: Hash of the order book summary
example: a1b2c3d4e5f6...
bids:
type: array
description: List of bid orders (sorted by price descending)
items:
$ref: '#/components/schemas/OrderSummary'
asks:
type: array
description: List of ask orders (sorted by price ascending)
items:
$ref: '#/components/schemas/OrderSummary'
min_order_size:
type: string
description: Minimum order size
example: '1'
tick_size:
type: string
description: Minimum price increment (tick size)
example: '0.01'
neg_risk:
type: boolean
description: Whether negative risk is enabled for this market
example: false
last_trade_price:
type: string
description: Last trade price
example: '0.45'
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
OrderSummary:
type: object
required:
- price
- size
properties:
price:
type: string
description: Order price
example: '0.45'
size:
type: string
description: Order size
example: '100'
````
@@ -0,0 +1,199 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get order books (request body)
> Retrieves order book summaries for multiple token IDs using a request body.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml post /books
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/books:
post:
tags:
- Market Data
summary: Get order books (request body)
description: >
Retrieves order book summaries for multiple token IDs using a request
body.
operationId: getBooksPost
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BookRequest'
example:
- token_id: 0xabc123def456...
- token_id: 0xdef456abc123...
responses:
'200':
description: Successfully retrieved order books
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/OrderBookSummary'
example:
- market: '0x1234567890123456789012345678901234567890'
asset_id: 0xabc123def456...
timestamp: '1234567890'
hash: a1b2c3d4e5f6...
bids:
- price: '0.45'
size: '100'
asks:
- price: '0.46'
size: '150'
min_order_size: '1'
tick_size: '0.01'
neg_risk: false
last_trade_price: '0.45'
'400':
description: Bad request - Invalid payload
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid payload
security: []
components:
schemas:
BookRequest:
type: object
required:
- token_id
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
side:
type: string
description: Order side (optional, not used for midpoint calculation)
enum:
- BUY
- SELL
example: BUY
OrderBookSummary:
type: object
required:
- market
- asset_id
- timestamp
- hash
- bids
- asks
- min_order_size
- tick_size
- neg_risk
- last_trade_price
properties:
market:
type: string
description: Market condition ID
example: '0x1234567890123456789012345678901234567890'
asset_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
timestamp:
type: string
description: Timestamp of the order book snapshot
example: '1234567890'
hash:
type: string
description: Hash of the order book summary
example: a1b2c3d4e5f6...
bids:
type: array
description: List of bid orders (sorted by price descending)
items:
$ref: '#/components/schemas/OrderSummary'
asks:
type: array
description: List of ask orders (sorted by price ascending)
items:
$ref: '#/components/schemas/OrderSummary'
min_order_size:
type: string
description: Minimum order size
example: '1'
tick_size:
type: string
description: Minimum price increment (tick size)
example: '0.01'
neg_risk:
type: boolean
description: Whether negative risk is enabled for this market
example: false
last_trade_price:
type: string
description: Last trade price
example: '0.45'
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
OrderSummary:
type: object
required:
- price
- size
properties:
price:
type: string
description: Order price
example: '0.45'
size:
type: string
description: Order size
example: '100'
````
@@ -0,0 +1,109 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get spread
> Retrieves the spread for a specific token ID.
The spread is the difference between the best ask and best bid prices.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /spread
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/spread:
get:
tags:
- Market Data
summary: Get spread
description: |
Retrieves the spread for a specific token ID.
The spread is the difference between the best ask and best bid prices.
operationId: getSpread
parameters:
- name: token_id
in: query
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved spread
content:
application/json:
schema:
type: object
required:
- spread
properties:
spread:
type: string
description: Spread as a string
example: '0.02'
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - No orderbook exists for the requested token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: No orderbook exists for the requested token id
security: []
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,127 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get spreads
> Retrieves spreads for multiple token IDs.
The spread is the difference between the best ask and best bid prices.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml post /spreads
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/spreads:
post:
tags:
- Market Data
summary: Get spreads
description: |
Retrieves spreads for multiple token IDs.
The spread is the difference between the best ask and best bid prices.
operationId: getSpreads
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BookRequest'
example:
- token_id: 0xabc123def456...
- token_id: 0xdef456abc123...
responses:
'200':
description: Successfully retrieved spreads
content:
application/json:
schema:
type: object
additionalProperties:
type: string
description: Map of token ID to spread
example:
0xabc123def456...: '0.02'
0xdef456abc123...: '0.015'
'400':
description: Bad request - Invalid payload
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid payload
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: error getting the spread
security: []
components:
schemas:
BookRequest:
type: object
required:
- token_id
properties:
token_id:
type: string
description: Token ID (asset ID)
example: 0xabc123def456...
side:
type: string
description: Order side (optional, not used for midpoint calculation)
enum:
- BUY
- SELL
example: BUY
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````
@@ -0,0 +1,121 @@
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Get tick size by path parameter
> Retrieves the minimum tick size (price increment) for a specific token ID using the token ID as a path parameter.
## OpenAPI
````yaml /api-spec/clob-openapi.yaml get /tick-size/{token_id}
openapi: 3.1.0
info:
title: Polymarket CLOB API
description: Polymarket CLOB API Reference
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://clob.polymarket.com
description: Production CLOB API
- url: https://clob-staging.polymarket.com
description: Staging CLOB API
security: []
tags:
- name: Trade
description: Trade endpoints
- name: Markets
description: Market data endpoints
- name: Account
description: Account and authentication endpoints
- name: Notifications
description: User notification endpoints
- name: Rewards
description: Rewards and earnings endpoints
- name: Rebates
description: Maker rebate endpoints
paths:
/tick-size/{token_id}:
get:
tags:
- Market Data
summary: Get tick size by path parameter
description: >
Retrieves the minimum tick size (price increment) for a specific token
ID using the token ID as a path parameter.
operationId: getTickSizeByPath
parameters:
- name: token_id
in: path
description: Token ID (asset ID)
required: true
schema:
type: string
example: 0xabc123def456...
responses:
'200':
description: Successfully retrieved tick size
content:
application/json:
schema:
$ref: '#/components/schemas/TickSize'
example:
minimum_tick_size: 0.01
'400':
description: Bad request - Invalid token id
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Invalid token id
'404':
description: Not found - Market not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: market not found
'500':
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
security: []
components:
schemas:
TickSize:
type: object
required:
- minimum_tick_size
properties:
minimum_tick_size:
type: number
format: double
description: Minimum tick size (price increment)
example: 0.01
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code, when provided
retry_after_seconds:
type: integer
description: Number of seconds to wait before retrying, when provided
````

Some files were not shown because too many files have changed in this diff Show More