All articles
Developers

Polymarket Gamma API endDate Is Not the Resolution Deadline

On 23 Polymarket markets, the Gamma API endDate was kickoff, start plus 6 hours or plus 7 days. Where the real deadline lives, with Python to parse it.

September 24, 202615 min readOrcaLayer Research

Checked against the Polymarket Gamma API on 24 September 2026.

Short answer. OrcaLayer compared the endDate field with the written rules on 23 Polymarket markets. Polymarket's documentation describes a market's end date as the point when it becomes eligible for resolution. The field did not behave that way on sports markets: on NFL and soccer matches it was the kickoff, on esports the start plus 6 hours, on tennis the original start plus 7 days. The deadline that governs a market is in its description, and whether it still trades is in closed and acceptingOrders.

If you build on Polymarket data, this changes what your code should read. A bot that stops trading at endDate, a dashboard that counts down to it, and a model that treats it as the resolution time are all reading a field that means different things on different market types.

What is endDate in the Polymarket Gamma API?

endDate is a UTC timestamp on every market in the Polymarket Gamma API. The API does not document what it represents, and it is not the resolution deadline. In OrcaLayer's sample it was kickoff on NFL and soccer matches, start plus 6 hours on esports, and original start plus 7 days on tennis. The binding deadline is in description.

Every market returned by https://gamma-api.polymarket.com/markets/{id} carries endDate at the top level. If you are new to these endpoints, start with our Polymarket REST API guide for developers.

The response usually tells you what kind of market you are looking at. Sports matches carry gameStartTime, eventStartTime, gameId and sportsMarketType (for example "moneyline"). Markets that belong to a group carry groupItemTitle, which can be a label such as "Match Winner" or a date such as "September 30". Closed markets add closedTime and umaEndDate. The rules are in plain English in description.

Polymarket's own resolution documentation puts it plainly: "Always read the resolution rules before trading." The rest of this article shows what happens when code reads endDate instead.

Polymarket endDate by market type

Market typeMarketsWhat endDate wasWhat the rules sayClosed before or after endDate
Esports (CS2, LoL, Dota 2)4Scheduled start + exactly 6 hours, 4 of 4A postponed match must be rescheduled to start within 14 days, or the market resolves 50-50All 4 before, by 19 minutes to 3 h 18 min
Tennis (ATP, ITF)4Original scheduled start + exactly 7 days, 4 of 4A winner must be determined within 14 days, or the market resolves 50-50All 4 before, by 6.3 to 6.8 days
NFL, college football, soccer matches4Kickoff, 4 of 4No fixed deadline: open until the game is completedAll 4 after, by 2 h 17 min to 4 h 57 min
MLB match1Start + 7 daysNo fixed deadlineBefore, by about 7 days
Sports futures3VariesA "postponed after" backstopStill open
Deadline and price markets7Matched the rules in 4 of 7"By" a date, or a date in the titleMixed

The sample is 23 hand-picked markets covering each type, so read each row as an observed pattern, not a platform-wide rate.

Esports: endDate is the start plus six hours

All four esports matches had an endDate exactly six hours after gameStartTime. 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.

Six hours is a fair guess for when a best-of-three finishes, but the rules for the same market allow far longer:

If the match is postponed, it must be rescheduled to a start time on or before October 7, 2026 at 11:59 PM ET (14 calendar days after the originally scheduled start of September 23, 2026 at 4:00 AM ET). If, by that deadline, the most recently announced rescheduled start time is on or before the deadline, this market resolves based on the result of the match as played. Otherwise, this market resolves 50-50, regardless of whether the match is subsequently played.

The 14 days apply to the rescheduled start, not to the result. A match rescheduled to start on 7 October can resolve later still, long after endDate has passed. You can see current esports markets on OrcaLayer's esports page.

Tennis: seven days after the original schedule, and it does not move

Every tennis match in the sample had an endDate exactly seven days after its originally scheduled start. Here the 14-day rule applies to the result:

If the match is canceled (not played at all), ends in a tie, or a winner has not been determined by October 6, 2026, 11:59 PM ET (14 days after the scheduled start), this market will resolve to 50-50.

Rescheduling is where it goes wrong. In two ATP matches, gameStartTime was later than the start printed in the rules. The US Open match between Ben Shelton and Carlos Alcaraz was scheduled for 8 September at 15:30 UTC and started on 9 September at 03:00 UTC. Its endDate was 15 September at 15:30 UTC: seven days after the original slot, not the new one.

A countdown built on endDate for a tennis market counts from a schedule that may no longer exist. Take the start from gameStartTime and the deadline from the rules.

NFL and soccer markets: endDate is kickoff, not the end of the game

On the Broncos vs Chiefs NFL game, the SMU vs Louisville college football game, a La Liga match and a Romanian Liga I match, endDate was equal to kickoff to the second. All four markets closed after it, between 2 h 17 min and 4 h 57 min later, which is how long the games took.

The rules on these markets set no deadline at all:

If the game is postponed, this market will remain open until the game has been completed.

A kickoff is the one moment when a match market is certainly not ready to resolve. Code that compares the current time with endDate would have marked all four of these markets as finished at kickoff, while the games were being played and the markets were still trading.

Across the 16 closed markets in the sample, 6 closed after their endDate. Four were these matches. The other two were a Bitcoin price market that closed 14 minutes after its reference time and a Fed rate market, covered below.

Sports futures: sometimes the event, sometimes the backstop

League and tournament winner markets followed no single rule. On Shakhtar Donetsk winning the 2026-27 UEFA Champions League, endDate was 30 May 2027 at 23:59 UTC, while the rules fall back to "Other" only if the season is "postponed after June 19, 2027, 11:59 PM ET", about twenty days later. The New York Yankees World Series market had an endDate of 31 October 2026, and its rules allow postponement until 31 December 2026. The Boston Celtics NBA Finals market matched its rules to the minute.

For futures, the field alone does not tell you whether you are looking at an expected event date or the formal backstop.

Deadline markets: right in 4 of 7, once wrong by 92 days

Markets that ask whether something happens "by" a date came closest to what most people assume endDate means. Two of them, "Will Anthropic or OpenAI IPO first?" and the Clarity Act market, matched the deadline in the rules, one with a one-minute offset (05:00 instead of 04:59 UTC). The two Bitcoin price markets also matched, though their rules point to "the date specified in the title" or "the month specified in the title", so the deadline lives in the market name.

Three did not match:

  • "Will the US confirm that aliens exist by September 30?" The rules say "by September 30, 2026, 11:59 PM ET", which is 1 October at 03:59 UTC. endDate was 1 January 2027 at 04:59 UTC, 92 days later. That is exactly the endDate of the parent event the market belongs to, which runs to the end of 2026, so the market appears to carry its event's date rather than its own. Two other fields in the same response point the right way or the wrong way: groupItemTitle is "September 30", which matches the rules, and hasReviewedDates is true, which shows that a reviewed flag does not guarantee the date matches the rules.
  • The Fed rate market for the September 2026 meeting. endDate was 16 September at 00:00 UTC, which is 8 PM ET on 15 September, the evening of the first day of a two-day meeting. The market closed 20 hours after its endDate.
  • The market on the next Russian parliamentary election. endDate was 30 September 2026 at 00:00 UTC. The rules fall back to "Other" only if results are not known by 30 September 2027. The market closed on 21 September.

On grouped date markets, check groupItemTitle before you trust endDate.

Why endDate changes, and why the Gamma API returns old values

Two markets returned different endDate values depending on which snapshot the API served.

For the aliens market, a response with updatedAt of 21 September showed endDate as 1 October 2026 at 03:59 UTC, which matches the rules. A fresh response on 24 September showed 1 January 2027. For the IPO market, a response with updatedAt of 8 August showed 31 December 2027 at 00:00 UTC, 29 hours before the written deadline, and the fresh response showed 1 January 2028 at 04:59 UTC, which matches the rules. Between those snapshots, the IPO market was corrected and the aliens market moved 92 days away from its own rules.

updatedAt will not tell you when that happened. It changes often and in bulk: at one point on 24 September the aliens, IPO, Celtics and Bitcoin markets all carried the same updatedAt to the microsecond. Store your own fetch time instead.

The older values reached us through cached responses. In three cases in the sample, a plain request to /markets/{id} returned an older snapshot, and adding an unused query parameter returned the current one. If your code reads endDate once when a market is listed, it may be holding a value the platform has since changed.

endDate vs gameStartTime vs closedTime vs umaEndDate

FieldWhat it held in the sampleSafe use
endDateKickoff, start + 6 h, start + 7 days, or a deadline, depending on market typeA hint, never a deadline
gameStartTimeStart of the sports event, updated when a match was rescheduledEvent start
closedTimeWhen the market actually closedAfter-the-fact close time
umaEndDateIdentical to closedTime on all 16 closed marketsSame as closedTime
descriptionThe written rules, including any deadline in ETThe real deadline

The formats differ. gameStartTime and closedTime come as "2026-09-23 08:00:00+00", while endDate and eventStartTime use "2026-09-23T08:00:00Z". datetime.fromisoformat rejects both forms before Python 3.11, so normalize first:

from datetime import datetime

def parse_ts(s: str) -> datetime:
    """Parse any Gamma API timestamp into an aware UTC datetime."""
    s = s.replace(" ", "T").replace("Z", "+00:00")
    if s.endswith("+00"):
        s += ":00"
    return datetime.fromisoformat(s)

How to tell if a Polymarket market is still trading

Do not use endDate for this, and do not use active either. The closed CS2 market in the sample returned "active": true together with "closed": true and "acceptingOrders": false. Read closed and acceptingOrders, and for the resolution state read umaResolutionStatus, which was "resolved" on that market.

def is_tradable(m: dict) -> bool:
    return not m.get("closed") and bool(m.get("acceptingOrders"))

Closing and resolving are separate steps. After a market closes, the outcome is proposed to the UMA Optimistic Oracle, and according to Polymarket's documentation an undisputed proposal resolves after a 2-hour challenge period.

How to find the real resolution deadline of a Polymarket market

  1. Read description. That is the contract. Sports matches say "on or before โ€ฆ ET" or "by โ€ฆ ET (14 days after the scheduled start)". US match markets say they "remain open until the game has been completed". Futures say "postponed after โ€ฆ".
  2. Check the title and groupItemTitle on price and date markets. "On September 17" or a groupItemTitle of "September 30" is the deadline.
  3. Take the start from gameStartTime, not from endDate minus a guess.
  4. Use closedTime or umaEndDate to know when a market actually closed. Both are empty until it does.
  5. Re-fetch before you act. Add a cache-busting parameter and store your fetch time next to every value you keep.

Python: parse the resolution deadline from a market description

This parser found the deadline on every market in the sample whose rules state a full date and a clock time in Eastern Time:

import re
from datetime import datetime
from zoneinfo import ZoneInfo

MONTHS = "January|February|March|April|May|June|July|August|September|October|November|December"
DEADLINE = re.compile(
    rf"\b(?:on or before|by|after) ((?:{MONTHS}) \d{{1,2}}, \d{{4}}),? (?:at )?(\d{{1,2}}:\d{{2}} ?[AP]M) E[DS]?T\b"
)

def rule_deadlines_utc(description: str) -> list[datetime]:
    """Return every ET deadline stated in a Polymarket market description, in UTC."""
    found = []
    for day, clock in DEADLINE.findall(description):
        local = datetime.strptime(f"{day} {clock.replace(' ', '')}", "%B %d, %Y %I:%M%p")
        local = local.replace(tzinfo=ZoneInfo("America/New_York"))
        found.append(local.astimezone(ZoneInfo("UTC")))
    return found

Use America/New_York rather than a fixed offset: ET is UTC-4 until 1 November 2026 and UTC-5 after, so a hard-coded offset will be an hour wrong for several months of every year. The parser returns nothing on US match markets, because their rules contain no deadline, and nothing on price markets, where the date is in the title. It does not handle "noon", "p.m." or abbreviated months, and it does not tell a start deadline from a result deadline, so read the sentence around each match.

What this sample does not tell you

Twenty-three markets show that endDate means different things on different market types. They do not show how often each case occurs across Polymarket, or that every esports market uses exactly six hours. Valorant is not in the sample, and there is a single MLB game.

We did not establish why the aliens market moved, or whether that change was deliberate. All markets here come from the international Polymarket Gamma API. Polymarket US is a separate exchange with its own contract rules, and nothing in this article applies to it.

Polymarket endDate FAQ

What is endDate in the Polymarket API?

A UTC timestamp whose meaning depends on the market type. Esports matches had the start plus six hours, tennis the original start plus seven days, NFL and soccer the kickoff, and most "by date" markets the deadline itself. The API does not document it, so treat it as a hint, not as the resolution time.

Does trading stop at endDate on Polymarket?

Not on the markets we checked. NFL and soccer markets had endDate set to kickoff and kept trading for 2 to 5 hours after it, until the games finished. Esports and tennis markets closed before their endDate. Check closed and acceptingOrders to know whether a market still trades.

Is endDate the time a Polymarket market resolves?

No. Closing and resolving are separate steps, and endDate matches neither reliably. In the sample, 6 of 16 closed markets closed after their endDate, and on esports and tennis the rules allowed a result up to two weeks after it. The deadline that governs resolution is written in description.

Where do I find the real resolution deadline of a Polymarket market?

In description, which holds the market rules. Sports markets state it as "on or before" or "by" a date in ET. Price and date markets point to the date in the title, and grouped markets often carry it in groupItemTitle. US match markets have no deadline and stay open until the game is completed.

What happens to a Polymarket market if a match is postponed?

It depends on the sport. On the esports markets we checked, the match must be rescheduled to start within 14 calendar days of the original start, or the market resolves 50-50 even if the match is played later. On tennis, a winner must be determined within 14 days of the scheduled start. On NFL and soccer matches, the market stays open until the game is completed.

Why does the Polymarket API return different endDate values for the same market?

Two reasons in the sample. The platform changed endDate on live markets, and the API sometimes served an older cached response. Adding a cache-busting query parameter returned the current value.

What is the difference between endDate, closedTime and umaEndDate?

endDate is set in advance and means different things on different market types. closedTime is when the market actually closed, and umaEndDate matched it exactly on all 16 closed markets in the sample. Both stay empty until the market closes.

What is gameStartTime in the Polymarket API?

The scheduled start of a sports event. On rescheduled tennis matches it moved to the new time while endDate stayed tied to the original schedule, so it is the more reliable field for the start.


Data: 23 markets fetched one by one from gamma-api.polymarket.com/markets/{id} on 24 September 2026, using the top-level endDate of each market. The sample is published as a JSON file, with the cached earlier snapshots recorded for the two markets whose endDate changed. Eastern Time deadlines were converted with daylight saving time applied. How OrcaLayer publishes its own measurements is described in our analytics methodology.

OrcaLayer is an independent analytics provider, not affiliated with or endorsed by Polymarket, with no access to its internal systems.

OrcaLayer's own API is documented at orcalayer.com/developers.

See the data live โ€” free wallet lookup

Every Polymarket trader profile, smart-money flag, lifetime P&L, farmer detection, ISW alignment โ€” searchable in one place.