pub struct RateLimiter { /* private fields */ }Expand description
Holds all rate limiters for one API surface.
Created via factory methods like RateLimiter::clob_default() which
configure hardcoded limits matching Polymarket’s documented rate limits.
Implementations§
Source§impl RateLimiter
impl RateLimiter
Sourcepub async fn acquire(&self, path: &str, method: Option<&Method>)
pub async fn acquire(&self, path: &str, method: Option<&Method>)
Await the appropriate limiter(s) for this endpoint.
Always awaits the default (general) limiter, then additionally awaits the first matching endpoint-specific limiter (burst + sustained).
Sourcepub fn clob_default() -> Self
pub fn clob_default() -> Self
CLOB API rate limits.
Transcribed from https://docs.polymarket.com/api-reference/rate-limits
as fetched on 2026-07-25, and pinned by the documented_limits tests.
Two things about the published tables need interpreting:
- The ledger group cap (900/10s across
/trades,/orders,/notificationsand/order) is genuinely shared, so those entries hold clones of one shared bucket rather than four of their own. - That group names
/orderand/orders, which also appear in the trading table at 5,000 and 2,000 per 10s. Both tables can only hold simultaneously if the group cap governs the ledger reads; a 900/10s cap on all methods would make the published trading burst unreachable. The group is therefore scoped toGET.
Ordering matters wherever one pattern is a path-segment prefix of
another: /balance-allowance/update must precede /balance-allowance,
and the specific /data/* routes must precede the /data catch-all.
Sourcepub fn gamma_default() -> Self
pub fn gamma_default() -> Self
Gamma API rate limits.
- General: 4,000/10s
- /events: 500/10s
- /markets: 300/10s
- /public-search: 350/10s
- /comments: 200/10s
- /tags: 200/10s
/status(health): 100/10s
Upstream also lists a 900/10s cap shared by /markets + /events.
It is not modelled because it can never bind: the per-endpoint caps of
300 and 500 sum to 800, which is already below it.
The published table spells the health row /ok, but that path answers
404 on gamma-api.polymarket.com — /status is the route that
answers 200, and the one Gamma::health().ping() requests. /ok is
boilerplate repeated into every surface’s table; only the CLOB host
serves it.
Sourcepub fn data_default() -> Self
pub fn data_default() -> Self
Data API rate limits.
- General: 1,000/10s
- /trades: 200/10s
- /positions and /closed-positions: 150/10s
/(health): 100/10s
The published table spells the health row /ok, but that path answers
404 on data-api.polymarket.com — / answers 200 {"data":"OK"},
and is the route this crate requests. /ok is boilerplate repeated into
every surface’s table; only the CLOB host serves it.
Matching / is safe despite entries being prefix-matched: the
segment-boundary rule means strip_prefix("/") on /positions leaves
positions, which starts with neither / nor ?, so the entry matches
only the bare root and the root with a query string.
This limiter is shared with the two sibling hosts, so it also carries their rules:
/user-pnl: 200/10s, published as the host-wide allowance foruser-pnl-api.polymarket.com. Modelled per-path because it is the only route polyoxide calls there and matching has no host dimension.lb-api.polymarket.com(/volume,/profit) has no published limit, so those fall to the general bucket.
Sourcepub fn relay_default() -> Self
pub fn relay_default() -> Self
Relay API rate limits.
- 25 requests per 1 minute (single limiter, no endpoint-specific limits)
Trait Implementations§
Source§impl Clone for RateLimiter
impl Clone for RateLimiter
Source§fn clone(&self) -> RateLimiter
fn clone(&self) -> RateLimiter
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more