---
title: "Resolve Combos"
method: POST
path: "/v1/markets/resolve-combos"
tags: ["markets"]
---

# Resolve Combos

`POST /v1/markets/resolve-combos`

Resolve Kalshi combo markets into their constituent legs.

Legs come back hydrated with the full market row when the leg is in the
universe. River_ids that are not combos (or whose legs have not been
ingested yet) return an empty ``legs`` list.

## Request body

- ResolveCombosRequest — Resolve Kalshi combo markets into their constituent legs.
  - `river_ids` integer[], required — Combo river_ids to resolve.

## Response `200`

Successful Response

- ResolveCombosResponse — ``legs`` is empty for river_ids that are not combos or whose legs are not ingested yet.
  - `results` ResolveCombosResult[], required
    - `river_id` integer, required
    - `legs` ComboLeg[], required
      - `river_id` integer, nullable
      - `ticker` string, required
      - `leg_qty` integer, required — +1 = yes side, -1 = no side.
      - `market` MarketSearchResult — Schema for a single market search result.
        - `river_id` integer, required
        - `exchange_value` integer, required
        - `exchange_name` string, required
        - `ticker` string, nullable
        - `token_id_yes` string, nullable
        - `token_id_no` string, nullable
        - `slug` string, nullable
        - `tick_size_price` number, required
        - `tick_size_qty` number, required
        - `tick_structure` string
        - `minimum_order_size` number, required
        - `expiration_datetime` string, nullable — Market expiration datetime (UTC)
        - `start_datetime` string, nullable — Game/event start datetime (UTC). Populated for sports; null otherwise.
        - `neg_risk` boolean, required
        - `neg_risk_id` string, nullable
        - `condition_id` string, nullable
        - `name` string, required
        - `subtitle` string, nullable
        - `description` string, nullable
        - `status` 'active' | 'closed' | 'inactive', required — Instrument status derived in instruments table from exchange-specific fields. Kalshi: maps from kalshi_markets.status - 'active' -> ACTIVE - everything else (closed, determined, finalized, settled, amended, inactive, initialized) -> CLOSED Polymarket: maps from polymarket_markets.closed and polymarket_markets.active booleans - closed=true -> CLOSED - active=true (and not closed) -> ACTIVE - else (active=false, closed=false) -> INACTIVE
        - `category` string
        - `subcategory` string, nullable
        - `rank` number, nullable
        - `event_ticker` string, nullable
        - `event_title` string, nullable
        - `is_combo` boolean — True for parlays.
        - `volume` integer, nullable
        - `volume_24h` integer, nullable
        - `series_ticker` string, nullable
        - `image` string, nullable
        - `last_price` number, nullable — Most recent YES price normalized to 0.0–1.0 (probability). Kalshi cents / 100; Polymarket already 0.0–1.0. NULL when no trade has been observed.
        - `primary_entity_name` string, nullable — Resolved display name of the canonical structured-target entity (player, team, competitor, …) referenced by the market. NULL for markets without a structured target. Kalshi only — Polymarket has no equivalent concept.
        - `event_market_count` integer, nullable — Total number of markets in this row's event. Only populated on the event-paginated path; when markets_per_event trims an event, this is how clients know more markets exist than were returned.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/rivermarkets/apis/river-finance-api.md) · [All operations](https://skmtc.net/rivermarkets/apis/river-finance-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/rivermarkets/river-finance-api/revisions/c90d562d4ad1/schema)
