XCREENER Docs
XQLHTTP API

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

TierRequests/dayContinuous cadence
Free30~1 request every 48 minutes
Essential1,500~1 request/minute, all day
Plus4,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 = h1 can'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/run already 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 multiple columns covers what would otherwise be several separate screening calls.
  • Watch X-RateLimit-Remaining (or poll /usage) and back off proactively. Slowing down as you approach 0 remaining is cheaper than discovering the limit via a 429 in 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.

On this page