Get started
Rate limits
Each plan gets a number of calls a day, and the day-by-day history of a number of different games a day. Both reset at midnight New York time.
| Plan | Daily calls | Daily game histories | Notes |
|---|---|---|---|
| No key | 50 | 10 | Per IP address |
| Free | 200 | 25 | Free API key |
| Plus | 1,000 | 50 | |
| Pro | 2,000 | 250 | |
| Studio | 5,000 | 1,000 | Per seat |
Compare plans to see what else each one has. If you need more for a product or a business, email us and tell us what you’re building.
What counts
- Each request is one call, including one that finds nothing. A request turned away for a missing or wrong parameter isn’t counted.
- Get live players, Get live players for several games and Retrieve your account don’t count.
- Calls from the CLI, the API and an AI connected to your account all count toward the same day.
The headers
Every response tells you where you stand:
| Header | Description |
|---|---|
X-RateLimit-Limit | Calls you get a day. |
X-RateLimit-Remaining | Calls left today. |
X-RateLimit-Reset | When your calls reset, in Unix seconds. |
Retry-After | On a 429, the seconds to wait before trying again. |
X-Request-Id | This request’s ID. Send it to us if something went wrong. |
Too many requests
There are three limits, and each answers 429:
- Per minute: 30 requests a minute without a key, 120 with one, and 12 a minute to Get live players and for several games together. The code is
rate_limited. Wait the seconds inRetry-After. - Per day: your plan’s calls a day. The code is
daily_limit_reached. They reset at midnight New York time, or a bigger plan gives you more. - History: the different games’ history your plan allows a day. The code is
history_limit_reached. See History.
async function get(url) {
for (let attempt = 0; attempt < 3; attempt++) {
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.ROTERMINAL_API_KEY}` } })
if (res.status !== 429) return res.json()
const wait = Number(res.headers.get('retry-after') ?? 60)
if (wait > 120) throw new Error('Out of calls for today')
await new Promise((r) => setTimeout(r, wait * 1000))
}
}History
List a game’s days returns a game’s history, which RoTerminal has kept since Sep 27, 2026. Each plan can ask for the history of a number of different games a day (the table above). Asking for the same game again that day doesn’t count twice, and every other endpoint works as usual once you reach it. Past it, the API answers 429 with the code history_limit_reached.
Fair use
- One account for each person. Keys are for your own code; don’t share them.
- Don’t resell or redistribute RoTerminal’s data in bulk, or use it to build a copy of RoTerminal.
- When you show RoTerminal’s numbers publicly, link to the page on roterminal.co they come from. Every response has that
link.
The full rules are in the Terms. Keys used against them can be limited or deleted.
Use fewer calls
- Most numbers change every few minutes, and daily numbers once a day. Keep an answer for a few minutes before asking again.
- To follow one game’s players closely, use Get live players. It’s made to be asked every 15 seconds and doesn’t count.
- One Compare games call returns up to five games.
- Build a dashboard follows several games live within these limits.