---
title: "One event with all linked markets, cross-venue prices, catalysts, and resolution detail"
method: GET
path: "/v1/events/{slug}"
---

# One event with all linked markets, cross-venue prices, catalysts, and resolution detail

`GET /v1/events/{slug}`

## Path parameters

- `slug` string, required

## Query parameters

- `detail` 'full' | 'concise'

## Response `200`

Event fields FLATTENED at the top level (not wrapped in an `event` key), plus linked markets and resolution log

- object — Canonical record of a prediction market question. One row per canonical tradable question; every event has one or more markets attached. The editorial layer that platforms don't ship. Thematic grouping across events is handled via tags, not a hierarchy. API response shape includes derived fields (venues_covered, current_primary_mark) computed at serve time from the normalized 4-table storage. API responses add serve-time fields beyond this canonical schema (_provenance, _notice, and per-endpoint extras).
  - `event_id` string, required — ClearMarket canonical event ID. Format: 'CM-EVT-' + 9-char vowel-free base36 + 1-char mod-10 check digit. Stable forever — never changes.
  - `slug` string, required — Human-readable URL form. Can change; not a stable identifier.
  - `question` string, required — ClearMarket-canonical normalized English question text.
  - `category` 'economics' | 'financials' | 'crypto' | 'companies' | 'technology' | 'health' | 'politics' | 'geopolitics' | 'climate', required — Top-level institutional classification. 9-enum (matches classify.py CATEGORIES_IN).
  - `tags` string[] — Cross-cutting filter tags (editorial + platform).
  - `primary_market_id` string, nullable — FK to markets.market_id. The market quoted as the event's headline price. Auto-computed nightly unless locked.
  - `primary_market_locked` boolean — Editorial override flag. If true, primary_market_id is not auto-recomputed.
  - `catalyst_dates` object[] — Scheduled real-world events that drive resolution or repricing, with provenance. Macro from FRED, FOMC from the Fed calendar, earnings from API Ninjas, ad-hoc from Exa.
    - `date` string, date, required
    - `type` string — Catalyst type: fomc / cpi / jobs / gdp / ppi / corporate_earnings / etc.
    - `label` string, required — Human-readable catalyst label.
    - `source_url` string — Deep link to the authoritative source for this date (provenance).
  - `published` boolean, required — API gate. If false, event is internal-only and excluded from public API responses.
  - `editorial_notes` string, nullable — Public-facing editorial context (why this event is grouped, source quality caveats, cross-platform observations). Surfaced in API responses — this is the editorial layer platforms don't ship.
  - `venue` 'kalshi' | 'polymarket' | 'null', nullable — Primary venue this event was ingested from. (Cross-venue coverage is surfaced via venues_covered at serve time.)
  - `bundle_type` 'categorical' | 'date_ladder' | 'strike_ladder' | 'augmented_negrisk' | 'singleton' | 'null', nullable — Resolution-inheritance shape of the event's child markets (OCC class->series analog). Determines which resolution fields are event-level shared vs per-child native.
  - `resolution_reference` string, nullable — Generic, subject-free event-level resolution ontology (the OCC class-level settlement rule): the data source, mechanism, and deadline that resolve ANY outcome in this event, inherited by all children. Never names a specific child's subject; per-child references are composed from this plus each child's group_item_title.
  - `created_at` string, date-time, required — Row creation timestamp (TIMESTAMPTZ).
  - `updated_at` string, date-time, required — Last update timestamp (TIMESTAMPTZ).
  - `venues_covered` string[] — DERIVED AT API SERVE TIME. Distinct platform values across all markets linked to this event.
  - `current_primary_mark` object, nullable — DERIVED AT API SERVE TIME. Latest marks row for the event's primary_market_id. Shape matches the marks schema response.
  - `field_provenance` object — Per-field provenance. Keys are field names; values are objects with 'source' ('platform_api' / 'clearmarket_editorial' / 'derived') and optional metadata.
  - `markets` Market[]
    - `market_id` string, required — ClearMarket canonical market ID. Format: 'CM-MKT-' + 6-digit zero-padded sequence. Stable forever — never changes.
    - `platform` 'kalshi' | 'polymarket', required — Source venue.
    - `platform_market_id` string, required — Venue's native ID. Kalshi ticker (e.g., 'KXFED-26APR-T3.25') or Polymarket conditionId.
    - `event_id` string, nullable — FK to events.event_id. Nullable — editorial assignment. Market can exist without an event.
    - `platform_event_id` string, nullable — Platform's own grouping identifier (informational). Kalshi event_ticker; Polymarket event slug.
    - `question_raw` string, nullable — Platform's short headline question.
    - `description_raw` string, nullable — Platform's long prose description.
    - `category_raw` string, nullable — Platform's own category classification.
    - `contract_type` 'binary' | 'scalar', required — Binary YES/NO or true-scalar payout. v0.1 only populates binary; scalar support v0.2+.
    - `settlement_currency` 'USD' | 'USDC', required — USD (Kalshi) or USDC (Polymarket).
    - `tick_size` number, nullable — Minimum price increment.
    - `contract_multiplier` number, nullable — Notional per contract. Usually 1.0 for binaries.
    - `underlying_reference` string, nullable — Editorial: specific real-world data reference (e.g., 'BLS Series CUUR0000SA0', 'S&P 500 index close per S&P Dow Jones Indices', 'Credible news reporting — no specific feed'). For multi-outcome events this is COMPOSED per child from the event's generic resolution_reference + this market's group_item_title, so each child names its own subject and no sibling's identity leaks.
    - `group_item_title` string, nullable — Per-child subject within a multi-outcome event (the OSI-symbol analog): the candidate, company, strike, or date this market resolves on ('María Corina Machado', 'Discord', '$2 trillion', 'June 2026'). Native from the venue; composes underlying_reference against the event-level resolution_reference.
    - `close_at` string, date-time, nullable — When trading stops (TIMESTAMPTZ).
    - `last_trading_date` string, date-time, nullable — Last tradeable date. May differ from close_at.
    - `resolve_at` string, date-time, nullable — Expected payout date.
    - `status` 'open' | 'closed' | 'resolved' | 'amended', required — Market lifecycle state.
    - `resolution_rules_raw` string, nullable — Full rules text from platform. Source for the parsed resolution_triggers.
    - `resolution_triggers` object, nullable — Parsed machine-readable resolution structure. Editorial.
      - `triggers` object[] — Array of resolution trigger conditions.
        - `type` string
        - `description` string
        - `metric` string
        - `threshold` unknown
        - `source` string
        - `deadline` string, date-time, nullable
      - `trigger_logic` 'AND' | 'OR' | 'SINGLE'
      - `exclusions` string[] — What explicitly does not count as resolution.
      - `resolution_risks` string — Known edge cases or dispute scenarios.
    - `arbitration_model` 'uma_oracle' | 'kalshi_staff' | 'polymarket_staff' | 'platform_auto' | 'determinations_committee' | 'other' | 'null', nullable — Who arbitrates disputes. Stored column (not derived).
    - `resolution_proposer` 'permissionless' | 'managed_whitelist' | 'platform_staff' | 'gov_agency' | 'null', nullable — Who can propose resolution outcomes. 'managed_whitelist' captures UMA MOOV2 (Aug 2025 — whitelist of 37 proposers).
    - `resolution_source` string, nullable — What data is cited. Editorial fill for Polymarket where API is blank or prose is vague ('consensus of credible reporting').
    - `source_citation` string, uri, nullable — Link to the data source itself (not the arbiter's admin page).
    - `resolution_source_list` object[], nullable — Full source set: every venue-listed source (provenance: platform_api) plus prose-named authorities surfaced by the commitment judgment (provenance: clearmarket_editorial). Added by the source-layer refactor 2026-07-03.
      - `name` string, nullable
      - `url` string, nullable
      - `provenance` 'platform_api' | 'clearmarket_editorial' | 'null', nullable
    - `source_commitment` 'named' | 'uncommitted' | 'none' | 'null', nullable — Top-level commitment class, stamped at enrichment from the LLM commitment judgment (rubric version recorded in field_provenance). committed_secondhand markets carry 'named' here — the venue DID commit; the quality deficiency is expressed by the subtype and the grade cap.
    - `source_commitment_subtype` 'named' | 'committed_secondhand' | 'uncommitted_illustrative' | 'uncommitted_placeholder' | 'none' | 'null', nullable — Full commitment taxonomy (vocabulary: /schema/source-commitment/v1). Feeds the grade ceiling: uncommitted_illustrative caps B; committed_secondhand, uncommitted_placeholder and none cap C.
    - `source_of_record` string, nullable — The committed source's name, copied VERBATIM from the venue's text or source list (never minted by the model — the anti-hallucination gate discards untraceable names). The authority for named; the secondhand source for committed_secondhand; null when uncommitted.
    - `source_status` 'platform_named' | 'no_committed_source' | 'no_source_stated' | 'unknown' | 'null', nullable — THE stamped source judgment — pure function of the LLM commitment classification, stamped at enrichment. Every surface (API/MCP/web/.json/JSON-LD) reads this; none re-derives from raw field presence. Serve layers emit 'unknown' for pre-refactor rows with no stamp and no commitment; the stored value is never 'unknown'.
    - `source_mechanism` 'single_authority' | 'precedence' | 'quorum' | 'null', nullable — How multiple sources bind when commitment=named: one controlling authority, a stated precedence/fallback rule, or a quorum (N sources must agree). The CFTC-comment tie-break disclosure, structured.
    - `source_type` 'gov_stat_agency' | 'central_bank' | 'regulated_data_vendor' | 'media_consensus' | 'court_filing' | 'issuer_announcement' | 'scheduled_event' | 'subjective' | 'other' | 'null', nullable — Objectivity classification of the data source.
    - `threshold` number, nullable — Numeric resolution threshold (e.g. 150000 for 'Bitcoin reaches $150,000'). Typed top-level field for cross-venue matching; the verbose parse stays in resolution_triggers. Null for non-numeric (occurrence) markets.
    - `direction` 'above' | 'below' | 'reach' | 'between' | 'occurrence' | 'null', nullable — Polarity of the claim relative to the threshold. An ATTRIBUTE, not an event discriminator — 'above'/'below' at the same threshold/window/settlement_style are the SAME claim (complementary; comparison normalizes polarity before computing a spread).
    - `settlement_style` 'touch' | 'terminal' | 'relative' | 'occurrence' | 'null', nullable — How the contract settles on the underlying: 'touch' (level ever reached in a window), 'terminal' (level at a single point in time), 'relative' (new high/low), 'occurrence' (a discrete event happens). Distinct from arbitration_model (who arbitrates). Part of the cross-venue event key.
    - `question_id` string, nullable — Canonical question id. The normalized real-world question this market settles (subject + threshold + settlement_style, plus window for terminal). Markets sharing a question_id are the SAME question — across venues and across events within a venue. The stable join key CM Signal references. Null where the market has not been canonicalized. (Value prefix is CMX- for historical continuity; it is the ClearMarket question id.)
    - `tags` string[] — Entity tags for search + cross-cutting retrieval (e.g. 'bitcoin', 'deutsche-bank'). Market-level (events also carry tags). v1 plain strings; later resolved to sameAs Wikidata QIDs.
    - `regulatory_class` 'DCM' | 'DeFi' | 'Other' | 'null', nullable — Regulatory class of the venue. DCM: CFTC-regulated Designated Contract Market. DeFi: token-vote-arbitrated decentralized protocol. Other: anything not in those two buckets (e.g., Manifold, Augur, Zeitgeist, prediction-market projects without CFTC registration or token-vote arbitration).
    - `analyst_notes` string, nullable — ClearMarket editorial note surfacing operational edge cases, dispute risks, or time-cutoff details for the market. v0.2: populated via per-venue fallback in render layer. v0.3+: populate via resolution_triggers.resolution_risks in enhance.py.
    - `contract_terms_url` string, uri, nullable — Kalshi PDF link to full contract terms. Kalshi-only.
    - `resolution_outcome` string, nullable — Once resolved: 'YES', 'NO', or scalar value. Null until resolved.
    - `resolution_value` number, nullable — For scalar markets: final numeric value. Null for binary.
    - `resolved_at` string, date-time, nullable — Actual settlement timestamp.
    - `first_seen_at` string, date-time, required — When ClearMarket first ingested this market.
    - `last_updated_at` string, date-time, required — Most recent ingestion update.
    - `also_on` object[], nullable — DERIVED. The SAME question (same question_id) priced on other venues. Non-null only when this market's question_id has markets on a different venue; null when the question is unique to this venue. Lets a consumer see the cross-venue twin(s) without a second lookup.
      - `venue` 'kalshi' | 'polymarket', required — The other venue this question trades on.
      - `market_id` string, required — FK to the counterpart market (market_id) on that venue.
      - `price` number, nullable — Last price (implied probability) of the counterpart market.
    - `field_provenance` object — Per-field provenance. Keys are field names; values indicate 'platform_api' / 'clearmarket_editorial' / 'derived' / 'null_by_venue_limitation'.
  - `resolution_log` ResolutionLogEntry[]
    - `log_id` integer, required — BIGSERIAL auto-generated primary key.
    - `market_id` string, required — FK to markets.market_id.
    - `event_type` 'status_change' | 'rule_change' | 'resolution_proposed' | 'disputed' | 'resolved' | 'amended' | 'reversed', required — Lifecycle event type. status_change: market state transition (active -> closed, etc). rule_change: resolution criteria amended mid-life. resolution_proposed: outcome submitted (UMA or staff). disputed: proposed resolution challenged. resolved: final outcome committed. amended: post-resolution correction. reversed: post-resolution full reversal.
    - `occurred_basis` 'venue_settlement' | 'deadline' | 'first_observed' | 'null', nullable — Which clock occurred_at holds. venue_settlement: the venue's actual settlement timestamp (Kalshi settlement_ts, Polymarket closedTime). deadline: the contract deadline, used as fallback when the venue exposes no settlement time (e.g. delisted before settlement) — deadline-basis timestamps are NOT settlement times. first_observed: neither was available; the first pipeline observation date.
    - `occurred_at` string, date-time, required — When the event happened, by the venue's clock. Authoritative event timestamp.
    - `recorded_at` string, date-time, required — When ClearMarket captured this event. Gap between occurred_at and recorded_at = detection lag.
    - `from_value` string, nullable — Prior state. For status_change: old status string. For rule_change: snippet of old rule. NULL for initial creation events.
    - `to_value` string, nullable — New state. Same format as from_value.
    - `diff` object, nullable — Structured diff for multi-field changes (rule_change, complex amended). Simple status changes leave this null. Free-form JSONB — typical shape: {field_name: {before, after}, reason_prose}.
    - `source` 'platform_api' | 'uma_subgraph' | 'editorial_observation' | 'platform_announcement' | 'cftc_filing', required — How ClearMarket detected this event. v0.1 supports platform_api, editorial_observation, platform_announcement. uma_subgraph and cftc_filing are v0.3+.
    - `source_ref` string, nullable — Pointer into the source: UMA dispute ID (for uma_subgraph), announcement URL (platform_announcement), editorial commit hash (editorial_observation). Null for platform_api events.
    - `actor` string, nullable — Who caused the event: platform name, UMA proposer address, editorial author. NULL for autonomous platform state transitions where actor is implicit.

## Other responses

- `404` — Unknown slug/event_id

---

[API](https://skmtc.dev/clearmarket/apis/clearmarket-api.md) · [All operations](https://skmtc.dev/clearmarket/apis/clearmarket-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/clearmarket/clearmarket-api/revisions/1fa9b0f1663c/schema)
