Order management operations (CreateOrder, CancelOrder, etc.) are rate-limited at 250 requests per second per firm, averaged over a 1-minute window. This means short bursts above 250 req/sec are permitted as long as the average stays within budget.
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.