Build1 publisher3 min readPublished
Polymarket's endDate equals kickoff on football markets and start plus seven days on tennis
OrcaLayer found Polymarket's endDate at kickoff on football, start plus 6 hours on esports and start plus 7 days on tennis in 23 markets. Code that treats the field as the resolution deadline should read closed, acceptingOrders and the rules in description.
The Engineer · Build desk

What happened
- Polymarket's documentation describes a market's end date as the point when it becomes eligible for resolution.
- OrcaLayer compared the Gamma API's endDate field against the written rules on 23 hand-picked Polymarket markets.
- On four football and soccer markets, including Broncos vs Chiefs and a La Liga match, endDate was set at kickoff.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost A bot that stops trading at endDate on these football markets exits at kickoff, while the sampled markets stayed open for another 2 h 17 min to 4 h 57 min.
- contradiction Because the documented meaning and the stored values disagree, a model trained on endDate as resolution time learns a different wrong offset for each sport.
- constraint The binding deadline is written in plain English in description, so computing it needs a text parser or a hand-kept table per market template, and either breaks when Polymarket rewords its rules.
Every market returned by gamma-api.polymarket.com/markets/{id} carries endDate at the top level as a UTC timestamp [15]. According to OrcaLayer, the API does not document what that timestamp represents [16]. The rest of the response usually tells you the market type. Sports matches carry gameStartTime, eventStartTime, gameId and sportsMarketType, grouped markets carry groupItemTitle, and closed markets add closedTime and umaEndDate [6].
The esports offset looks sensible until you read the rules. The Counter-Strike match between QUAZAR and Misa Esports started at 08:00 UTC on 23 September, carried an endDate of 14:00 UTC and closed at 13:41 UTC [8], 19 minutes before the field [1]. Its rules let a postponed match be rescheduled to a start on or before 7 October, 14 days after the original slot, and resolve 50-50 otherwise [9]. OrcaLayer notes that the 14 days bound the rescheduled start, not the result [9]. A match restarted on 7 October resolves at least two weeks after endDate [4].
Tennis puts endDate at the original start plus seven days, while the rules set the 50-50 cutoff for an undecided match at 14 days after the scheduled start [10]. That leaves endDate a full week ahead of the deadline that governs the market [3]. Rescheduling adds a second error. The Shelton-Alcaraz US Open match was scheduled for 8 September at 15:30 UTC, started on 9 September at 03:00 UTC, and kept an endDate of 15 September at 15:30 UTC [11]. The start slipped 11.5 hours and endDate stayed put, so it sat 6 days 12.5 hours after the real start [2].
On the four football and soccer matches, endDate matched kickoff to the second [12]. It is precise about the wrong event. The rules on those markets set no deadline at all: "If the game is postponed, this market will remain open until the game has been completed." [13]
Polymarket's resolution documentation says, "Always read the resolution rules before trading." [7] In code, that becomes a read order:
1. Classify the market from the fields it carries: gameStartTime and sportsMarketType for sports matches, groupItemTitle for grouped markets [6]. 2. Take the start from gameStartTime, which tracked the rescheduled Shelton-Alcaraz start when endDate did not [11]. 3. Gate order placement on closed and acceptingOrders [4]. 4. Take the deadline from the rules in description [4]. 5. Once the market closes, store closedTime and umaEndDate for reconciliation [6].
OrcaLayer's sample is 23 hand-picked markets, and the write-up asks readers to treat each row as an observed pattern, not a platform-wide rate [5]. Within each type the offsets were exact: all four esports matches at six hours, every tennis match at seven days [8][10]. I think that points to a default set per market type, not an estimate made market by market. The examples cover sports matches, and the check ran against the Gamma API on 24 September 2026 [14].
What to watch
- Polymarket defining endDate per market type in the Gamma API documentation, or changing its values to match the resolution-eligibility meaning in its general docs.
- A larger sample that is not hand-picked, including grouped markets whose groupItemTitle is a date, showing whether the per-type offsets hold outside sports matches.
- Later rescheduled tennis matches, to see whether endDate ever follows gameStartTime instead of the original slot.