Rate Limits
Per-tier daily quotas, checking your usage, and how to make the most of them.
/xql/validate and /xql/explain are never metered: they only parse and plan, no data is touched, so any recognized key can call them as often as you like. Only /xql/run counts against a daily quota, and every recognized key gets one, including free tier.
Daily Quotas
| Tier | Requests/day | Continuous cadence |
|---|---|---|
| Free | 30 | ~1 request every 48 minutes |
| Essential | 1,500 | ~1 request/minute, all day |
| Plus | 4,500 | ~3 requests/minute, all day |
The quota resets at UTC midnight. "Continuous cadence" is what that daily number works out to if you spread it evenly across a full 24-hour day. Essential is tuned to comfortably support a strategy that polls roughly once a minute around the clock, and Plus to support a few parallel once-a-minute strategies (or one strategy polling a few times a minute).
Checking Your Usage
GET /usage reports your current quota state without consuming any of it, safe to call as often as you want, and it works even when your daily quota is fully exhausted.
curl https://api.xcreener.com/usage \
-H "Authorization: Bearer <your-api-key>"{
"tier": "essential",
"limit": 1500,
"used": 812,
"remaining": 688,
"resetAt": "2026-07-30T00:00:00.000Z"
}Every /xql/run response also carries X-RateLimit-Remaining and X-RateLimit-Reset headers, so you don't need a separate call to /usage just to track consumption between runs.
Exceeding Your Quota
Once remaining hits 0, /xql/run returns 429 until the next UTC reset:
{ "error": "Daily API rate limit exceeded" }/xql/validate and /xql/explain are unaffected: they keep working regardless of your /xql/run usage.
Making the Most of Your Quota
Prototype for free
/xql/validate and /xql/explain don't touch your quota at all. Iterate on
syntax and check the plan against them, and only spend a /xql/run call once
the query actually does what you want.
- Match your polling interval to your query's timeframe. A query against
timeframe = h1can't produce a different result until the next hourly candle closes: polling it every few seconds just burns quota for identical results. Poll roughly as often as your timeframe advances. - Restrict polling to the hours that matter to your strategy. If you're only interested in signals during a specific session (e.g. the first few hours after a market open) rather than around the clock, spend your daily calls there instead of spreading them thin across 24 hours. On Free's 30/day, concentrating them into a 4-hour window gets you a check every ~8 minutes instead of one every 48.
- Consolidate conditions into one query instead of several.
/xql/runalready evaluates a query against every instrument in its market/timeframe universe in a single call, so a query that filters on multiple conditions (rsi(14) < 30 and close > sma(50)) or requests multiplecolumnscovers what would otherwise be several separate screening calls. - Watch
X-RateLimit-Remaining(or poll/usage) and back off proactively. Slowing down as you approach0remaining is cheaper than discovering the limit via a429in the middle of a run. - If ~1 request/minute continuously isn't enough (you're running multiple strategies in parallel, or need sub-minute polling), Plus's 4,500/day gives roughly 3x the headroom.