---
title: "Get Event"
method: GET
path: "/api/v1/events/{source}/{event_id}"
tags: ["events"]
---

# Get Event

`GET /api/v1/events/{source}/{event_id}`

## Request

- Base URL: `https://api.pdata.world`
- URL: `https://api.pdata.world/api/v1/events/{source}/{event_id}`
- Auth: none declared

Use when an agent needs the full detail of a single prediction-market event by its composite key (source + event_id). Returns the event with all of its child markets, latest probabilities, and metadata. The canonical URL `https://pdata.world/events/{source}/{event_id}` is stable for the lifetime of the underlying market. Events that closed more than 10 days ago are removed from the live tables; the same URL then returns a `kind: "tombstone"` object holding the title, close date and final outcome of each top market instead of the live `kind: "live"` object. Check `kind` before reading any other field. Large events carry hundreds of markets (a 311-market event is ~520 KB); pass `markets_limit` to take only the first N.

## Path parameters

- `source` string, required: Platform ID: polymarket / kalshi / manifold / myriad / limitless / predict / opinion / gemini.
- `event_id` string, required: Event ID native to the source. URL-encoded if it contains special chars.

## Query parameters

- `markets_limit` integer, nullable: Return only the first N markets, in the order described under `markets`; `markets_total` still counts all of them. Omit to get every market. Ignored for a tombstone.

## Response `200`

Successful Response

- union
  - EventDetailOut: Event detail page: extends EventOut with nested child markets. For leaf events (real, orphan-synth, or unrelated): `markets` is the list of child markets, traded-in-24h first, then probability DESC (routers/events.py::get_event). For group events (`is_group = TRUE`): `markets` is the FLATTENED list of markets across every child event of the group, ordered by each child event's rank then the activity-bucket / probability sort. The grouping shape is reconstructed client-side via the `event_id` on each market row — see routers/events.py::get_event.
    - `source` string, required: Venue the event comes from: polymarket, kalshi, manifold, myriad, limitless, predict, opinion or gemini.
    - `id` string, required: The venue's own event id; unique within `source`. pdata's page for it is https://pdata.world/events/{source}/{id}.
    - `ticker` string, nullable: The venue's event ticker (Kalshi), if any.
    - `slug` string, nullable: The venue's URL slug for the event, if any.
    - `title` string, nullable: Event title as the venue publishes it.
    - `description` string, nullable: Event description or resolution rules as published by the venue.
    - `image` string, nullable: Image URL published by the venue.
    - `icon` string, nullable: Icon URL published by the venue.
    - `active` boolean, required: The venue's own active flag.
    - `closed` boolean, required: True once the venue has closed the event; its markets carry the result.
    - `start_date` string, date-time, nullable: When the event opened, as the venue reports it (UTC).
    - `end_date` string, date-time, nullable: Scheduled close or expiry, as the venue reports it (UTC).
    - `closed_time` string, date-time, nullable: When the venue actually closed the event (UTC).
    - `volume` number, nullable: Lifetime trading volume of the event: the venue's event total, or the sum of its markets where the venue publishes none (Kalshi). Venue-reported, in the venue's own unit and not converted across venues: shares for Polymarket and contracts for Kalshi (each pays $1 at resolution), play-money mana for Manifold, and each other venue's figure as it reports it. Null when there is no volume signal.
    - `volume_24hr` number, nullable: Event trading volume over the last 24 hours, totalled the same way as `volume`. Venue-reported, in the venue's own unit and not converted across venues: shares for Polymarket and contracts for Kalshi (each pays $1 at resolution), play-money mana for Manifold, and each other venue's figure as it reports it.
    - `volume_24h_change` number, nullable: Current `volume_24hr` minus the oldest snapshot of it recorded in the trailing 24h, in the same venue unit. Null when there is no usable history.
    - `normalized_vol_24hr` number, nullable: `volume_24hr` on a 0-100 log scale within its venue. Computed as 100 x ln(v+1)^2 / ln(cap+1)^2, where cap is the venue's largest value (its second largest when the largest is over 5x it), so it compares magnitude across venues where raw volume units do not. Null when the input is null or 0.
    - `normalized_volume` number, nullable: Lifetime `volume` on a 0-100 log scale within its venue. Computed as 100 x ln(v+1)^2 / ln(cap+1)^2, where cap is the venue's largest value (its second largest when the largest is over 5x it), so it compares magnitude across venues where raw volume units do not. Null when the input is null or 0.
    - `liquidity` number, nullable: Liquidity as the venue reports it, in the venue's own unit.
    - `open_interest` number, nullable: Open interest as the venue reports it, in the venue's own unit (contracts for Kalshi, summed over the event's markets).
    - `categories` string[]: pdata topic categories (e.g. Politics, Sports), assigned by rules and AI tagging. Empty when uncategorised.
    - `tags` union[]: The venue's own tags, passed through as published: objects with id/slug/label for Polymarket, plain strings elsewhere.
      - union
        - string
        - object
    - `synthetic` boolean: True when pdata created this event to wrap a single market that has no event at the venue. It has exactly one market.
    - `is_group` boolean: True when pdata created this event to group sibling Kalshi events that share a matchup and end date. Its id, title and volumes are derived from its child events.
    - `group_key` string, nullable: Matchup key used to build group events (Kalshi). Null elsewhere.
    - `parent_event_id` string, nullable: Id of the pdata group event this event belongs to. Null for top-level events.
    - `probability` number, nullable: Probability in [0, 1], copied from the single market. Set only on synthetic events; real events have one probability per market.
    - `spread` number, nullable: Best ask minus best bid in price units [0, 1], copied from the single market. Set only on synthetic events.
    - `top_outcome` string, nullable: Label of the leading market: the highest-probability open market, or the highest-probability closed one when none is open. For independent (not mutually exclusive) markets this is the highest-priced, not a winner. Null when the event has no direct markets (group events).
    - `top_outcome_probability` number, nullable: Probability of `top_outcome`, in [0, 1]. Null when `top_outcome` or its price is null.
    - `top_outcome_prob_24h_change` number, nullable: 24-hour change in `top_outcome_probability`, as a fraction on the [0, 1] scale (0.05 = up 5 percentage points). Null without usable history.
    - `top_outcome_volume_24h_change` number, nullable: 24-hour change in the leading market's `volume_24hr`, in the venue's unit. Null without usable history.
    - `updated_at` string, date-time, required: When pdata last wrote this row (UTC): on every fetch from the venue, and again when pdata recomputes a derived field such as 24h volume, so it can be later than `fetched_at`. It is not when the venue last changed the event.
    - `fetched_at` string, date-time, required: When pdata last fetched this row from the venue (UTC).
    - `added_at` string, date-time, nullable: When this event first appeared in pdata's database (UTC). Null for events loaded with pdata's initial backfill, whose real first appearance is earlier.
    - `url` string, nullable: Public page for this event on the venue's own website. Null for venues without event pages (Myriad) or when required fields are missing.
    - `chart_24h` number[], nullable: Last-24h sparkline, oldest first, at most 50 points: the event's `volume_24hr` series for real and group events, or the single market's probability in [0, 1] for synthetic events. Null with fewer than 2 points.
    - `kind` 'live': Always "live" here. A deleted event's URL serves the "tombstone" shape instead.
    - `mutually_exclusive` boolean, nullable: True when the venue marks the event's outcomes as mutually exclusive, so exactly one market can resolve YES (Polymarket negRisk, Kalshi mutually_exclusive, Manifold sum-to-one answers, Gemini categorical). False when its markets are independent questions. Null when the venue does not say (Opinion).
    - `markets_total` integer, nullable: How many markets the event has. Equal to the length of `markets` unless the `markets_limit` query parameter shortened the list.
    - `markets` MarketOut[]: The event's markets: those with 24h volume first, then the rest, each group by probability, highest first. For a group event, the markets of every child event, with `event_id` naming the child. `markets_limit` keeps the first N in this order.
      - `source` string, required: Venue the market comes from: polymarket, kalshi, manifold, myriad, limitless, predict, opinion or gemini.
      - `id` string, required: The venue's own market id; unique within `source`.
      - `event_id` string, nullable: Id of the parent event (same `source`). Null for orphan markets.
      - `slug` string, nullable: The venue's URL slug or ticker for the market, if any.
      - `question` string, nullable: The market's full question as the venue titles it. For outcomes of a multi-outcome event this can be a bare label (e.g. `Phoenix Suns`); pair it with `event_title`.
      - `group_item_title` string, nullable: Short outcome label for display under an already-shown event title, e.g. `Lakers` for 'Will the Lakers win the 2026 NBA Championship?'. Null when the venue supplies no separate label.
      - `description` string, nullable: Resolution rules / description text as published by the venue.
      - `image` string, nullable: Image URL published by the venue.
      - `icon` string, nullable: Icon URL published by the venue.
      - `outcomes` string[]: Outcome labels in venue order, usually `["Yes", "No"]`; other pairs exist (e.g. `["Over", "Under"]`, two team names).
      - `outcome_prices` number[]: Price of each outcome in `outcomes` order, in [0, 1] (0.62 = 62 cents on the dollar).
      - `probability` number, nullable: Implied probability of the first outcome (usually YES), in [0, 1]. The venue's own probability where it publishes one, else `outcome_prices[0]`.
      - `spread` number, nullable: Best ask minus best bid on the first outcome, in price units [0, 1]. Null when the venue publishes no order book.
      - `active` boolean, required: The venue's own active flag.
      - `closed` boolean, required: True once the venue has closed the market to trading (it may or may not have resolved yet; see `result`).
      - `start_date` string, date-time, nullable: When the market opened, as the venue reports it (UTC).
      - `end_date` string, date-time, nullable: Scheduled close or expiry, as the venue reports it (UTC).
      - `closed_time` string, date-time, nullable: When the venue actually closed the market (UTC).
      - `result` string, nullable: Venue-reported resolution, as the venue wrote it: usually yes/no (case varies by venue), Kalshi `scalar`, Manifold `CANCEL`/`MKT`, or the winning outcome label for non-Yes/No pairs (e.g. `over 2.5`, `Over`, a team name). Polymarket publishes no result field; for it this is derived from its UMA resolution status `resolved` plus a settlement price >= 0.99. Null until the market resolves.
      - `volume` number, nullable: Lifetime trading volume. Venue-reported, in the venue's own unit and not converted across venues: shares for Polymarket and contracts for Kalshi (each pays $1 at resolution), play-money mana for Manifold, and each other venue's figure as it reports it. Null when the venue publishes no per-market volume (Gemini reports it per event); 0 means genuinely no trading.
      - `volume_24hr` number, nullable: Trading volume over the last 24 hours. Venue-reported, in the venue's own unit and not converted across venues: shares for Polymarket and contracts for Kalshi (each pays $1 at resolution), play-money mana for Manifold, and each other venue's figure as it reports it. Limitless publishes no 24h figure, so pdata derives it from its own snapshots.
      - `prob_24h_change` number, nullable: Change in `probability` over the last 24 hours, as a fraction on the same [0, 1] scale (0.05 = up 5 percentage points; negative = fell): the current value minus the oldest snapshot recorded in the trailing 24h. Null when there is no price, no snapshot in that window, or the market closed >24h ago.
      - `volume_24h_change` number, nullable: Current `volume_24hr` minus the oldest snapshot of it recorded in the trailing 24h, in the same venue unit (positive = more activity than a day earlier). Null when there is no usable history.
      - `normalized_vol_24hr` number, nullable: `volume_24hr` on a 0-100 log scale within its venue. Computed as 100 x ln(v+1)^2 / ln(cap+1)^2, where cap is the venue's largest value (its second largest when the largest is over 5x it), so it compares magnitude across venues where raw volume units do not. Null when the input is null or 0.
      - `normalized_volume` number, nullable: Lifetime `volume` on a 0-100 log scale within its venue. Computed as 100 x ln(v+1)^2 / ln(cap+1)^2, where cap is the venue's largest value (its second largest when the largest is over 5x it), so it compares magnitude across venues where raw volume units do not. Null when the input is null or 0.
      - `liquidity` number, nullable: Liquidity as the venue reports it, in the venue's own unit.
      - `categories` string[]: pdata topic categories of the parent event (e.g. Politics, Sports). Empty for orphan markets and uncategorised events.
      - `countries` string[]: Countries the market concerns, full English names (at most 3), assigned by pdata's AI tagging. Empty when none applies or not yet tagged.
      - `updated_at` string, date-time, required: When pdata last wrote this row (UTC): on every fetch from the venue, and again when pdata recomputes a derived field such as 24h volume, so it can be later than `fetched_at`. It is not when the venue last changed the market.
      - `fetched_at` string, date-time, required: When pdata last fetched this row from the venue (UTC).
      - `added_at` string, date-time, nullable: When this market first appeared in pdata's database (UTC). Null for markets loaded with pdata's initial backfill, whose real first appearance is earlier.
      - `url` string, nullable: Public page for this market on the venue's own website. Null when the venue's URL pattern needs data this row lacks.
      - `event_title` string, nullable: Title of the parent event. Use it with `question` when the question is only an outcome label. Null for orphan markets.
      - `chart_24h` number[], nullable: Last-24h `probability` series in [0, 1], oldest first, at most 50 points. Null when fewer than 2 snapshots exist in the window.
    - `_meta` ResponseMetaResource: Agent metadata for single-resource responses (with cite_as).
      - `attribution` string: Who aggregated this data, under which licence, and whose data it is.
      - `canonical_url` string, required: Stable URL for this resource: the pdata.world page, or the API URL for list responses.
      - `as_of` string, date-time: When this response was generated (UTC).
      - `docs` string: API documentation.
      - `cite_as` string, required: A ready-made citation sentence: what the data says, its as-of date, and the canonical URL. Safe to quote verbatim.
      - `source_url` string, nullable: The same event or market on the venue's own website. NULL for venues without public event pages.
  - EventTombstoneOut: An event the retention sweep deleted, served at its original URL. `app/pipeline/retention.py` hard-deletes events closed more than 10 days ago. This row is what it captured on the way out, and it is all that exists: there is no market history, no chart, no similar-events list behind it. `/history` and `/similar` on the same id keep 404ing. Rows are written once and never refreshed (see `retention.capture_event_tombstones`), so every field here describes the event's final observed state, not its current one.
    - `kind` 'tombstone': Always "tombstone": the event closed more than 10 days ago and only this final record remains, with no price history. A live event has kind "live".
    - `source` string, required: Venue the event comes from: polymarket, kalshi, manifold, myriad, limitless, predict, opinion or gemini.
    - `id` string, required: The venue's own event id; unique within `source`.
    - `title` string, nullable: The event's title when it was archived.
    - `categories` string[]: pdata's topic categories for the event when it was archived.
    - `closed_time` string, date-time, nullable: When the event closed (UTC): the venue's close time, else its end date, else when pdata last updated it.
    - `url` string, nullable: The event's page on the venue's website. Null when it could not be built; it is never a guessed link.
    - `resolution` TombstoneMarketOut[]: Final state of the event's top markets, at most 10: markets that resolved YES first, then by lifetime volume (events archived before 2026-10-07: by volume only). Empty when the markets were already gone when the event was archived.
      - `id` string, nullable: The venue's own market id.
      - `question` string, nullable: The outcome's label: the venue's short outcome title where it sets one (e.g. a candidate's name), else the market's full question.
      - `result` string, nullable: The venue's own reported outcome: yes or no in the venue's casing, or the winning label for a market whose two outcomes are not Yes/No. Null when the venue reported none, and for Polymarket events archived before 2026-10-07.
      - `probability` number, nullable: The last price pdata saw, in [0, 1]. Usually taken after the market settled, so it records the result; it is not a forecast.
      - `volume` number, nullable: Lifetime trading volume when the event was archived. Venue-reported, in the venue's own unit and not converted across venues: shares for Polymarket and contracts for Kalshi (each pays $1 at resolution), play-money mana for Manifold, and each other venue's figure as it reports it.
    - `pruned_at` string, date-time, required: When pdata archived the event (UTC). Not the close date; that is `closed_time`.
    - `_meta` ResponseMetaResource: Agent metadata for single-resource responses (with cite_as).
      - `attribution` string: Who aggregated this data, under which licence, and whose data it is.
      - `canonical_url` string, required: Stable URL for this resource: the pdata.world page, or the API URL for list responses.
      - `as_of` string, date-time: When this response was generated (UTC).
      - `docs` string: API documentation.
      - `cite_as` string, required: A ready-made citation sentence: what the data says, its as-of date, and the canonical URL. Safe to quote verbatim.
      - `source_url` string, nullable: The same event or market on the venue's own website. NULL for venues without public event pages.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/pdata/apis/pdata-backend.md) · [All operations](https://skmtc.dev/pdata/apis/pdata-backend/llms.txt) · [OpenAPI document](https://skmtc.dev/pdata/apis/pdata-backend/revisions/4c9bf3856786?raw)
