{"record":{"id":"acf8ba4e436faffb","repo":"nautechsystems/nautilus_trader","slug":"limit-must-be-greater-than-zero","errorCode":null,"errorMessage":"limit must be greater than zero","messagePattern":"limit must be greater than zero","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/http/data_api.rs","lineNumber":411,"sourceCode":"        condition_id: &str,\n        token_id: &str,\n        price_precision: u8,\n        size_precision: u8,\n        start: Option<UnixNanos>,\n        end: Option<UnixNanos>,\n        limit: Option<u32>,\n    ) -> anyhow::Result<Vec<TradeTick>> {\n        const PAGE_SIZE: u32 = 500;\n        const MAX_OFFSET: u32 = 10_000;\n\n        if let (Some(start), Some(end)) = (start, end)\n            && start > end\n        {\n            anyhow::bail!(\"start must not be later than end\");\n        }\n\n        if limit == Some(0) {\n            anyhow::bail!(\"limit must be greater than zero\");\n        }\n\n        let start_secs = start.map(|value| (value.as_u64() / 1_000_000_000) as i64);\n        let end_secs = end.map(|value| (value.as_u64() / 1_000_000_000) as i64);\n        let protocol = OffsetProtocol::new(\n            \"/trades\",\n            PAGE_SIZE as usize,\n            trade_page_fingerprint,\n            Some((\n                MAX_OFFSET,\n                TradeTickStop::VenueOffsetCeiling(OffsetCeilingSource::Local),\n            )),\n        );\n        let reducer = TradeTickReducer {\n            rows: Vec::new(),\n            instrument_id,\n            condition_id: condition_id.to_string(),\n            token_id: token_id.to_string(),","sourceCodeStart":393,"sourceCodeEnd":429,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/http/data_api.rs#L393-L429","documentation":"Input validation in the Polymarket data API request_trade_ticks: an explicit limit of 0 was passed. A zero limit would request no trades and produce a meaningless response, so it is rejected before pagination begins.","triggerScenarios":"Calling request_trade_ticks with limit == Some(0).","commonSituations":"Computing a remaining quota or page budget that underflows to 0; passing an unconfigured/default numeric value of 0 instead of leaving limit as None; config parsing turning an unset limit into Some(0).","solutions":["Pass None for limit when you want the API default (page-size driven) behavior.","Clamp or reject non-positive limits at the call site before invoking the API.","Fix the upstream calculation that produced a zero remaining-budget value."],"exampleFix":"// before\nlet limit = remaining_budget(); // may be Some(0)\napi.request_trade_ticks(Some(cid), start, end, limit).await?;\n// after\nlet limit = remaining_budget().filter(|&l| l > 0);\napi.request_trade_ticks(Some(cid), start, end, limit).await?;","handlingStrategy":"validation","validationCode":"// Rust: normalize limit before calling\nfn effective_limit(limit: Option<u32>) -> Option<u32> {\n    limit.filter(|&l| l > 0)\n}","typeGuard":"fn positive_limit(limit: Option<u32>) -> Option<NonZeroU32> {\n    limit.and_then(NonZeroU32::new)\n}","tryCatchPattern":null,"preventionTips":["Pass None instead of 0 when the limit is not configured.","Use NonZeroU32 for limit values in caller code so zero cannot be constructed.","Fix budget/remaining calculations so they never yield zero without signalling completion."],"tags":["polymarket","data-api","argument-validation","rust"],"backgroundTag":"invalid-argument-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}