---
title: "Open prediction markets expiring soon"
method: GET
path: "/api/prediction-markets/expiring"
tags: ["public-pm-data"]
---

# Open prediction markets expiring soon

`GET /api/prediction-markets/expiring`

## Request

- Base URL: `https://api.coinrithm.com`
- URL: `https://api.coinrithm.com/api/prediction-markets/expiring`
- Auth: none required

Keyless catalog of OPEN events whose `endDate` falls within the
lookahead window (`days`, default 7), soonest end first. Requires
24h volume >= 1000 or lifetime volume >= 10000 in the venue's raw
(pre-fiat-conversion) units, so thin/inactive markets are excluded.
Each row is a full event plus `expiresInMs`: milliseconds from the
response time to `endDate`.

## Query parameters

- `limit` integer
- `offset` integer
- `fiat` string
- `days` integer
- `source` 'polymarket' | 'kalshi' | 'rothera' | 'limitless' | 'smarkets' | 'manifold' | 'metaculus' | 'predictit' | 'futuur' | 'myriad' | 'forecastex' | 'gemini'

## Response `200`

Paginated soon-to-expire open events

- PublicPmExpiringEventsResponse
  - `data` PublicPmEvent[], required: Each row is a PublicPmEvent that additionally carries `expiresInMs` (integer, milliseconds from fetch time to endDate); PublicPmEvent's open additionalProperties allows the extra field.
    - `id` string, required
    - `slug` string, required
    - `title` string, required
    - `marketSubtitle` string: Kalshi single-market (Yes/No) events only: the contract's subject as the venue labels it, e.g. "Over 2.5 maps" under the title "... : Total Maps". Yes and No resolve against this line. Absent when the venue gives none, when it is just "Yes", and on every other event; the Yes/No outcome names and the title are unchanged.
    - `description` string, nullable
    - `status` string, required
    - `startDate` string, date-time, nullable
    - `endDate` string, date-time, nullable
    - `resolvedAt` string, date-time, nullable
    - `resolvedOutcomeExternalMarketId` string, nullable
    - `resolutionOutcomeBasis` string, nullable
    - `freshness` object: Observation time, age and source-aware freshness state.
    - `volume` number, nullable
    - `volume24h` number, nullable
    - `liquidity` number, nullable
    - `openInterestUsd` number: Event detail only (full and `view=core`): open interest in USD, whatever `fiat` was requested. Omitted when the venue publishes none; never a fabricated 0. On Kalshi it is the same amount the venue's `liquidity` carries.
    - `openInterestBasis` 'venue_reported_usd' | 'contracts_x_notional_usd': How `openInterestUsd` was measured. `venue_reported_usd`: the venue's own event figure (Polymarket, Rothera). `contracts_x_notional_usd`: open contracts times each contract's USD notional, summed over the event's markets (Kalshi).
    - `openInterestBasisNote` string: Short human-readable description of `openInterestBasis`.
    - `bestBid` number, nullable
    - `bestAsk` number, nullable
    - `spread` number, nullable
    - `source` PublicPmSource, required
      - `id` 'polymarket' | 'kalshi' | 'rothera' | 'limitless' | 'smarkets' | 'manifold' | 'metaculus' | 'predictit' | 'futuur' | 'myriad' | 'forecastex' | 'gemini', required
      - `name` string, required
      - `kind` string
      - `supportsTrading` boolean
    - `priceChange24h` number, nullable: Signed event-level probability change in percentage points (-100 to +100; probabilities are 0 to 100), not a fraction or relative percent change. The representative contract or outcome and nominal 24h lookback basis vary by venue; this need not be the displayed leader or largest outcome move. The lookback may be a previous-session close or an observed-window span rather than exactly 24 hours. Use outcome.priceChange24h for a named outcome's change. Null means unavailable.
    - `priceChange7d` number, nullable: Signed event-level probability change over the venue's available seven-day lookback, in percentage points (-100 to +100; probabilities are 0 to 100), not a fraction or relative percent change. The representative contract or outcome varies by venue; this need not be the displayed leader or largest outcome move. Null means unavailable.
    - `probabilityBook` object, nullable: Book-level probability basis: `basis` is `normalized_complete_book` when outcomes carry normalizedProbability (with `rawSum` and `overroundPoints`), else `raw_quotes`.
    - `outcomes` PublicPmOutcome[], required
      - `externalMarketId` string
      - `name` string, required
      - `openInterestUsd` number: Event detail, Kalshi multi-market events only (also on `representativeOutcome`). This contract's open interest in USD (open contracts times USD notional). Omitted elsewhere.
      - `probability` number, nullable: Provider-implied probability on a 0–100 scale (raw venue input; may include vig, so a book's outcomes can sum above 100). Execution eligibility and a usable quote are reported by the quote endpoint, not inferred from this field alone.
      - `normalizedProbability` number, nullable: Vig-removed display probability on a 0–100 scale, proportionally normalized so a complete exclusive book sums to ~100. Null when the book is not a complete exclusive book (threshold ladders, partial catalogs, non-market sources). This is display context, not an execution quote.
      - `hasObservedPrice` boolean: Optional source-data truth flag. `true` means a supported source observation validated a usable observed price, including numeric 0; `false` is emitted only for the Rothera explicit writer-null marker and means no usable observed price input. Omitted means unknown, legacy, or unsupported source data. This flag does not claim live pricing, liquidity, or tradability.
      - `priceBasis` string: Polymarket and Kalshi open outcomes only: what `probability` is. `unquoted` means never traded and no usable book, so `probability` is not a price (a Polymarket wide-book midpoint such as 48 on a 3/93 book, or a stored 0 on Kalshi). `book_mid` is the order-book midpoint (Polymarket: a spread of 10 points or less; Kalshi: the venue's quote midpoint). `last_trade` is the last traded price (Polymarket uses it when the book is wider than 10 points). Absent on other venues, on settled outcomes and on responses served before 2026-09-29. Like `hasObservedPrice`, it is not an execution quote; use the quote endpoint for tradability. A plain string, so a basis added later cannot break older clients: treat an unknown value as unknown.
      - `sourceObservation` object, nullable: Optional bounded provenance for the stored outcome price. Null means the supported source marker was unavailable or explicitly null; it does not prove that the outcome has no price. Timestamps describe source evidence, not current freshness or executable liquidity.
        - `version` integer, required: Source-observation schema version; currently 1.
        - `basis` 'provider_quote' | 'provider_trade' | 'daily_clearing_mark' | 'clearing_settlement' | 'last_price_untimed', required
        - `provider` 'robinhood' | 'forecastex' | 'rothera', required
        - `observedAt` string, date-time, nullable
        - `tradeDate` string, date, nullable
      - `priceChange24h` number, nullable: Signed outcome probability change in percentage points (-100 to +100; probabilities are 0 to 100), not a fraction or relative percent change. For example, 20% to 25.5% is +5.5 points. The nominal 24h field follows the venue's available lookback basis, which may be a previous-session close or an observed-window span rather than exactly 24 hours. Null means unavailable.
      - `lifecycle` object, nullable: Per-outcome provider lifecycle evidence. Terminal states are results, not live quotes; an open state with providerAcceptingOrders=false is a paused quote.
        - `state` 'open' | 'closed' | 'resolved' | 'voided' | 'unknown'
        - `providerAcceptingOrders` boolean, nullable
        - `entryBlockedByLifecycle` boolean
        - `isResult` boolean
        - `result` 'won' | 'lost' | 'voided' | 'null', nullable
        - `basis` 'provider' | 'stored_winner' | 'unknown'
        - `closedAt` string, date-time, nullable
        - `resolvedAt` string, date-time, nullable
        - `observedAt` string, date-time, nullable
      - `priorProbability` object, nullable: Last stored provider quote before the outcome closed, when available.
        - `value` number
        - `asOf` string, date-time
        - `cutoff` string, date-time
      - `venueTerms` object: Venue-published order and settlement terms; null values mean unavailable, unreported, or invalid.
        - `orderMinSize` number, nullable, required: Polymarket minimum order size in shares.
        - `tickSize` number, nullable, required: Polymarket minimum probability increment as a ratio.
        - `feesEnabled` boolean, nullable, required: Polymarket market fee flag.
        - `canCloseEarly` boolean, nullable, required: Kalshi early-close capability.
        - `settlementTimerSeconds` integer, nullable, required: Kalshi venue-published settlement timer in seconds; not a guaranteed deadline after close.
      - `quoteEvidence` object, nullable: Present only when the request sent `includeQuoteEvidence=1`. The stored venue book observation for Polymarket and Kalshi outcomes on a 0-100 scale (values outside 0-100 are served as null); null for other venues or when none is stored. Not an executable quote.
        - `version` integer
        - `bid` number, nullable
        - `ask` number, nullable
        - `last` number, nullable
    - `representativeOutcome` PublicPmOutcome
      - `externalMarketId` string
      - `name` string, required
      - `openInterestUsd` number: Event detail, Kalshi multi-market events only (also on `representativeOutcome`). This contract's open interest in USD (open contracts times USD notional). Omitted elsewhere.
      - `probability` number, nullable: Provider-implied probability on a 0–100 scale (raw venue input; may include vig, so a book's outcomes can sum above 100). Execution eligibility and a usable quote are reported by the quote endpoint, not inferred from this field alone.
      - `normalizedProbability` number, nullable: Vig-removed display probability on a 0–100 scale, proportionally normalized so a complete exclusive book sums to ~100. Null when the book is not a complete exclusive book (threshold ladders, partial catalogs, non-market sources). This is display context, not an execution quote.
      - `hasObservedPrice` boolean: Optional source-data truth flag. `true` means a supported source observation validated a usable observed price, including numeric 0; `false` is emitted only for the Rothera explicit writer-null marker and means no usable observed price input. Omitted means unknown, legacy, or unsupported source data. This flag does not claim live pricing, liquidity, or tradability.
      - `priceBasis` string: Polymarket and Kalshi open outcomes only: what `probability` is. `unquoted` means never traded and no usable book, so `probability` is not a price (a Polymarket wide-book midpoint such as 48 on a 3/93 book, or a stored 0 on Kalshi). `book_mid` is the order-book midpoint (Polymarket: a spread of 10 points or less; Kalshi: the venue's quote midpoint). `last_trade` is the last traded price (Polymarket uses it when the book is wider than 10 points). Absent on other venues, on settled outcomes and on responses served before 2026-09-29. Like `hasObservedPrice`, it is not an execution quote; use the quote endpoint for tradability. A plain string, so a basis added later cannot break older clients: treat an unknown value as unknown.
      - `sourceObservation` object, nullable: Optional bounded provenance for the stored outcome price. Null means the supported source marker was unavailable or explicitly null; it does not prove that the outcome has no price. Timestamps describe source evidence, not current freshness or executable liquidity.
        - `version` integer, required: Source-observation schema version; currently 1.
        - `basis` 'provider_quote' | 'provider_trade' | 'daily_clearing_mark' | 'clearing_settlement' | 'last_price_untimed', required
        - `provider` 'robinhood' | 'forecastex' | 'rothera', required
        - `observedAt` string, date-time, nullable
        - `tradeDate` string, date, nullable
      - `priceChange24h` number, nullable: Signed outcome probability change in percentage points (-100 to +100; probabilities are 0 to 100), not a fraction or relative percent change. For example, 20% to 25.5% is +5.5 points. The nominal 24h field follows the venue's available lookback basis, which may be a previous-session close or an observed-window span rather than exactly 24 hours. Null means unavailable.
      - `lifecycle` object, nullable: Per-outcome provider lifecycle evidence. Terminal states are results, not live quotes; an open state with providerAcceptingOrders=false is a paused quote.
        - `state` 'open' | 'closed' | 'resolved' | 'voided' | 'unknown'
        - `providerAcceptingOrders` boolean, nullable
        - `entryBlockedByLifecycle` boolean
        - `isResult` boolean
        - `result` 'won' | 'lost' | 'voided' | 'null', nullable
        - `basis` 'provider' | 'stored_winner' | 'unknown'
        - `closedAt` string, date-time, nullable
        - `resolvedAt` string, date-time, nullable
        - `observedAt` string, date-time, nullable
      - `priorProbability` object, nullable: Last stored provider quote before the outcome closed, when available.
        - `value` number
        - `asOf` string, date-time
        - `cutoff` string, date-time
      - `venueTerms` object: Venue-published order and settlement terms; null values mean unavailable, unreported, or invalid.
        - `orderMinSize` number, nullable, required: Polymarket minimum order size in shares.
        - `tickSize` number, nullable, required: Polymarket minimum probability increment as a ratio.
        - `feesEnabled` boolean, nullable, required: Polymarket market fee flag.
        - `canCloseEarly` boolean, nullable, required: Kalshi early-close capability.
        - `settlementTimerSeconds` integer, nullable, required: Kalshi venue-published settlement timer in seconds; not a guaranteed deadline after close.
      - `quoteEvidence` object, nullable: Present only when the request sent `includeQuoteEvidence=1`. The stored venue book observation for Polymarket and Kalshi outcomes on a 0-100 scale (values outside 0-100 are served as null); null for other venues or when none is stored. Not an executable quote.
        - `version` integer
        - `bid` number, nullable
        - `ask` number, nullable
        - `last` number, nullable
    - `representativeOutcomeBasis` 'threshold_ladder_line' | 'informative_leader': Event detail only, open events only: the rule that chose representativeOutcome. `threshold_ladder_line` is a threshold ladder's line nearest 50% (a Kalshi strike ladder). `informative_leader` is the highest current outcome strictly inside 5-95, else the highest; it is not necessarily the leading outcome.
    - `referenceProbability` object, nullable: Canonical matched-venue reference with venue count and spread. Also carries `methodologyVersion` (the row's own writer version: `consensus_probability_v2` or `consensus_probability_v3`) and `weightBasis` (`open_interest` | `liquidity`, null for a v3 row without a recognised basis); see the consensus-methodology endpoint.
    - `decisionSupport` object, nullable
    - `quality` object, nullable: Persisted truth-engine decision eligibility and reason codes.
    - `crossPlatform` object[]
    - `outcomesTotal` integer: Full outcome count when the outcome list was trimmed (`view=compact`, or matched/related events without `full=1`).
    - `availability` object: Event detail only, and only for an open event whose venue CoinRithm has paused: its prices stopped updating at `lastCollectedAt`. Absent otherwise.
      - `status` 'paused', required
      - `lastCollectedAt` string, date-time, nullable, required
  - `pagination` PublicPmPagination, required
    - `limit` integer, required
    - `offset` integer, required
    - `hasMore` boolean, required
  - `meta` object, required
    - `totalExpiring` integer, required
    - `window` object, required
      - `from` string, date-time, required
      - `to` string, date-time, required

## Other responses

- `400`: Invalid or missing parameters. On a route with a query allowlist, an undocumented query parameter returns `{"error": "unsupported_query_parameter", "message": "Unsupported query parameter: <key>. Supported: <keys>."}`.
- `500`: Server error

---

[API](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api.md) · [All operations](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/llms.txt) · [OpenAPI document](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/revisions/28fb59f285fe?raw)
