123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140(** Pre-configured rate limit presets for Polymarket APIs.
Based on official documentation:
https://docs.polymarket.com/#/api-rate-limits *)moduleB=Polymarket_rate_limiter.Builder(* {1 General Rate Limits} *)letgeneral~behavior=[B.global~requests:15000~window_seconds:10.0~behavior](* {1 Data API Rate Limits} *)letdata_api_host="data-api.polymarket.com"letdata_api~behavior=[(* Specific endpoints first *)B.per_endpoint~host:data_api_host~method_:"GET"~path:"/trades"~requests:200~window_seconds:10.0~behavior;B.per_endpoint~host:data_api_host~method_:"GET"~path:"/positions"~requests:150~window_seconds:10.0~behavior;B.per_endpoint~host:data_api_host~method_:"GET"~path:"/closed-positions"~requests:150~window_seconds:10.0~behavior;(* General Data API limit *)B.per_host~host:data_api_host~requests:1000~window_seconds:10.0~behavior;](* {1 Gamma API Rate Limits} *)letgamma_api_host="gamma-api.polymarket.com"letgamma_api~behavior=[(* Specific endpoints first *)B.per_endpoint~host:gamma_api_host~method_:"GET"~path:"/comments"~requests:200~window_seconds:10.0~behavior;B.per_endpoint~host:gamma_api_host~method_:"GET"~path:"/events"~requests:300~window_seconds:10.0~behavior;B.per_endpoint~host:gamma_api_host~method_:"GET"~path:"/markets"~requests:300~window_seconds:10.0~behavior;B.per_endpoint~host:gamma_api_host~method_:"GET"~path:"/tags"~requests:200~window_seconds:10.0~behavior;B.per_endpoint~host:gamma_api_host~method_:"GET"~path:"/search"~requests:300~window_seconds:10.0~behavior;(* General Gamma API limit *)B.per_host~host:gamma_api_host~requests:4000~window_seconds:10.0~behavior;](* {1 CLOB API Rate Limits} *)letclob_api_host="clob.polymarket.com"(* CLOB Trading endpoints with burst (10s) + sustained (10min) limits *)letclob_trading~behavior=letep~meth~p~burst~sustained=B.(route()|>hostclob_api_host|>method_meth|>pathp|>limit~requests:burst~window_seconds:10.0|>limit~requests:sustained~window_seconds:600.0|>on_limitbehavior|>build)in[ep~meth:"POST"~p:"/order"~burst:3500~sustained:36000;ep~meth:"DELETE"~p:"/order"~burst:3000~sustained:30000;ep~meth:"POST"~p:"/orders"~burst:1000~sustained:15000;ep~meth:"DELETE"~p:"/orders"~burst:1000~sustained:15000;ep~meth:"DELETE"~p:"/cancel-all"~burst:250~sustained:6000;ep~meth:"DELETE"~p:"/cancel-market-orders"~burst:1000~sustained:1500;](* CLOB Market Data endpoints *)letclob_market_data~behavior=[B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/book"~requests:1500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/books"~requests:500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/price"~requests:1500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/prices"~requests:500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/midprice"~requests:1500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/midprices"~requests:500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/prices-history"~requests:1000~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/tick-size"~requests:200~window_seconds:10.0~behavior;](* CLOB Ledger endpoints *)letclob_ledger~behavior=[B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/data/orders"~requests:500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/data/trades"~requests:500~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/notifications"~requests:125~window_seconds:10.0~behavior;(* General ledger endpoints: /trades, /orders, /order *)B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/trades"~requests:900~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/orders"~requests:900~window_seconds:10.0~behavior;](* CLOB Balance and Auth endpoints *)letclob_other~behavior=[B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/balance-allowance"~requests:200~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"POST"~path:"/balance-allowance"~requests:50~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"GET"~path:"/api-keys"~requests:100~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"POST"~path:"/api-keys"~requests:100~window_seconds:10.0~behavior;B.per_endpoint~host:clob_api_host~method_:"DELETE"~path:"/api-keys"~requests:100~window_seconds:10.0~behavior;]letclob_api~behavior=(* Trading endpoints first (most specific, with burst+sustained) *)clob_trading~behavior@clob_market_data~behavior@clob_ledger~behavior@clob_other~behavior@[(* General CLOB limit last *)B.per_host~host:clob_api_host~requests:9000~window_seconds:10.0~behavior;](* {1 Combined Presets} *)letall~behavior=data_api~behavior@gamma_api~behavior@clob_api~behavior@general~behavior