Skip to main content

Token-based limits

Every authenticated request costs tokens. Your tier defines how many tokens you can spend per second. Most requests cost the default of 10 tokens; each operation’s API reference page lists its cost where it differs (order cancellations, single-order reads, quote create/cancel, and multivariate-collection lookup are currently cheaper than the default). Your effective rate for any given endpoint is budget ÷ cost.

Reads and writes are billed separately

You have two independent token budgets:
BucketWhat it covers
ReadGET endpoints and anything not explicitly routed elsewhere.
WriteOrder placement, amends, cancels, order groups, and the RFQ quote flow.

Perps limits use separate buckets

The Perps API uses the same tiers and per-second token budgets described here, but perps traffic is metered in its own Read and Write buckets. Perps calls don’t draw down your event-contract budgets, and event-contract calls don’t draw down your perps budgets. In effect you have up to four independent buckets: event-contract Read, event-contract Write, perps Read, and perps Write. Check your perps tier and limits with GET /account/limits/perps, the perps counterpart of GET /account/limits. See the Perps API overview for the full perps surface.

Batch endpoints don’t save tokens

A batch request costs the same as making each call individually. Every item in the batch is billed separately:

Tiers and budgets

Per-second token budgets in each bucket:
TierRead budgetWrite budget
Basic200100
Advanced300300
Premier1,0001,000
Paragon2,0002,000
Prime4,0004,000

Tier qualification

Kalshi may, at its discretion, adjust your tier at any time, including downgrading you from higher tiers following prolonged inactivity. Members may request an upgrade by contacting support with a description of their use case.

Earning higher tiers by volume

Once a day, Kalshi reviews your trading volume and grants Premier, Paragon, or Prime if you qualify. Your volume share is your trailing 30-day volume (counting both sides of every trade you’re part of, as maker and as taker) divided by twice the previous calendar month’s total exchange volume: volume share = your trailing 30-day volume ÷ (previous month's exchange volume × 2) Qualifying grants the tier for 30 days, so a slow day never drops you right away. The daily review renews that window for as long as you keep qualifying, and each tier has two thresholds (a higher bar to earn it and a lower keep bar to hold it), so a small dip doesn’t cost you the tier:
TierEarnKeep
Premier0.25%0.20%
Paragon0.50%0.40%
Prime1.00%0.80%
If your volume falls below the Keep bar, the tier doesn’t drop immediately. It lapses only when your current 30-day grant runs out.

Your grants

Your tier is the highest level among your active grants. Each grant raises you to a level on a lane, event_contract (predictions) or margined (margin), until it expires, and records how you got it:
  • volume: earned automatically from your trading volume.
  • manual: assigned by Kalshi.
Fetch your grants from GET /account/limits, returned alongside your current usage_tier:
{
  "usage_tier": "premier",
  "read":  { "refill_rate": 1000, "bucket_capacity": 1000 },
  "write": { "refill_rate": 1000, "bucket_capacity": 2000 },
  "grants": [
    { "exchange_instance": "event_contract", "level": "premier", "expires_ts": 1751558400, "source": "volume" },
    { "exchange_instance": "event_contract", "level": "advanced", "source": "manual" }
  ]
}
A grant with no expires_ts is permanent. You keep your best grant at each level, so a longer-lived manual grant is never shortened by a volume grant. Similarly, if a manual grant is close to expiry but you’re now qualifying for the tier by volume, your grant is extended to a fresh 30 days.

When you hit the limit

A rate-limited request returns 429 Too Many Requests with the body:
{"error": "too many requests"}
429 responses don’t currently include Retry-After or X-RateLimit-* headers. Apply exponential backoff on 429 until your bucket refills.

Bursting above your per-second budget

Your Write bucket holds two seconds of your per-second budget, so idle or below-steady traffic builds up headroom you can spend in a single burst. Useful for event-driven clients reacting quickly to market moves or price prints. Each request drains the bucket by its token cost; the bucket refills continuously at your per-second budget up to its capacity. Over-drawing returns 429 Too Many Requests. There’s no enforced cooldown; your next request is allowed as soon as the bucket has enough tokens to cover it. Basic tier is the exception: its Write bucket holds one second of budget, with no accumulated headroom.