REST API traffic is subject to a firm-wide cap of 100 requests per second per firm, averaged over a 1-minute window. This means short bursts above 100 req/sec are permitted as long as the average stays within budget. Some REST endpoints may also enforce additional lower limits, such as the query/report endpoints listed below.
Ingress message rate (per firm, across all streams)
100 msg/sec
Egress (server to client)
Unlimited
Ingress rate is averaged over a 1-minute window, allowing short bursts. Exceeding the average limit will result in throttled or rejected messages. This limit applies to all participants.
Reference data (instruments, symbols, metadata) changes infrequently - ListInstruments and ListSymbols are limited to just 6 req/min. Cache responses locally:
class InstrumentCache: def __init__(self): self.instruments = {} self.last_refresh = None def get_instrument(self, symbol): # Refresh cache every 5 minutes if self._needs_refresh(): self._refresh_instruments() return self.instruments.get(symbol) def _needs_refresh(self): if not self.last_refresh: return True return (time.time() - self.last_refresh) > 300 def _refresh_instruments(self): response = api.list_instruments() for inst in response.instruments: self.instruments[inst.symbol] = inst self.last_refresh = time.time()
ListPositionValuations is the most restrictive endpoint at ~0.5 req/min. It performs mark-to-market calculations across all positions and is intended for periodic reporting (e.g., end-of-day P&L), not real-time monitoring.
Patterns that may result in temporary or permanent restrictions:
Sustained requests above the rate limit
Polling for data available via streaming
Requesting the same unchanged data repeatedly
Automated retry loops without backoff
Abuse of the API may result in temporary or permanent restrictions on your API credentials. Contact onboarding@polymarket.us if you need higher limits for legitimate use cases.