curl --request POST \
--url https://api.rook.pm/v1/markets:compose \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"venue": "polymarket",
"settlement_convention_id": "demo_all_legs_win_v1",
"legs": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_no"
}
]
}
'import requests
url = "https://api.rook.pm/v1/markets:compose"
payload = {
"venue": "polymarket",
"settlement_convention_id": "demo_all_legs_win_v1",
"legs": [{ "outcome_id": "out_fed_dec_2026_cut_yes" }, { "outcome_id": "out_fed_dec_2026_hold_no" }]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
venue: 'polymarket',
settlement_convention_id: 'demo_all_legs_win_v1',
legs: [
{outcome_id: 'out_fed_dec_2026_cut_yes'},
{outcome_id: 'out_fed_dec_2026_hold_no'}
]
})
};
fetch('https://api.rook.pm/v1/markets:compose', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"market": {
"market_id": "mkt_combo_cut_and_no_hold",
"version": "1",
"title": "Fed cuts rates AND does not hold rates",
"description": "Illustrative two-leg ticket. The second leg adds no condition when a cut already requires a change.",
"event_ids": [],
"family_ids": [
"fam_fed_dec_2026"
],
"category": "rates",
"settlement_summary": "Pays 1 USDC if the policy rate is cut; the no-hold leg is automatically satisfied by a cut.",
"payout_conditions": [
"A cut pays YES 1 USDC.",
"A hold or hike pays YES 0 USDC."
],
"outcomes": [
{
"outcome_id": "out_combo_cut_and_no_hold_yes",
"label": "YES",
"listings": []
},
{
"outcome_id": "out_combo_cut_and_no_hold_no",
"label": "NO",
"listings": []
}
],
"is_combo": true,
"analytical_only": true,
"observed_at": "2026-10-19T12:00:00Z",
"legs": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_no"
}
],
"settlement_convention_id": "demo_all_legs_win_v1"
},
"coverage": {
"complete": true,
"submitted_count": 2,
"supported_count": 2,
"items": [
{
"input_reference": "out_fed_dec_2026_cut_yes",
"outcome_id": "out_fed_dec_2026_cut_yes",
"status": "SUPPORTED",
"family_ids": [
"fam_fed_dec_2026"
]
},
{
"input_reference": "out_fed_dec_2026_hold_no",
"outcome_id": "out_fed_dec_2026_hold_no",
"status": "SUPPORTED",
"family_ids": [
"fam_fed_dec_2026"
]
}
]
},
"versions": {
"market_versions": [
{
"market_id": "mkt_fed_dec_2026_cut",
"version": "1"
},
{
"market_id": "mkt_fed_dec_2026_hold",
"version": "1"
},
{
"market_id": "mkt_combo_cut_and_no_hold",
"version": "1"
}
],
"mapping_version": "1",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"as_of": "2026-10-19T12:00:00Z"
},
"findings": [
{
"code": "REDUNDANT_LEG",
"explanation": "If the Fed cuts rates, it cannot hold rates unchanged. The second leg does not change this ticket’s payout.",
"leg_indices": [
1
],
"witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_cut"
}
]
}
]
}Compose a Combo
Interpret an explicitly supplied set of outcome legs as one Combo payout under a supported venue/product settlement convention. Supply at least two legs, venue and settlement_convention_id; optional scenario_pins make interpretation reproducible.
The response returns an analytical market with its outcomes, interpreted settlement conditions, coverage and versions. Findings explain impossible or redundant legs and include supporting scenarios. The combined payout follows the stated product convention, including supported exceptional settlements; it is not the sum of individual positions.
Use the returned outcome IDs for payout or exposure calculations. Composition does not create a venue event, attach the Combo to a fabricated event, create a tradable venue listing or submit an order. Unsupported conventions or joint scenario scope fail explicitly.
curl --request POST \
--url https://api.rook.pm/v1/markets:compose \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"venue": "polymarket",
"settlement_convention_id": "demo_all_legs_win_v1",
"legs": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_no"
}
]
}
'import requests
url = "https://api.rook.pm/v1/markets:compose"
payload = {
"venue": "polymarket",
"settlement_convention_id": "demo_all_legs_win_v1",
"legs": [{ "outcome_id": "out_fed_dec_2026_cut_yes" }, { "outcome_id": "out_fed_dec_2026_hold_no" }]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
venue: 'polymarket',
settlement_convention_id: 'demo_all_legs_win_v1',
legs: [
{outcome_id: 'out_fed_dec_2026_cut_yes'},
{outcome_id: 'out_fed_dec_2026_hold_no'}
]
})
};
fetch('https://api.rook.pm/v1/markets:compose', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"market": {
"market_id": "mkt_combo_cut_and_no_hold",
"version": "1",
"title": "Fed cuts rates AND does not hold rates",
"description": "Illustrative two-leg ticket. The second leg adds no condition when a cut already requires a change.",
"event_ids": [],
"family_ids": [
"fam_fed_dec_2026"
],
"category": "rates",
"settlement_summary": "Pays 1 USDC if the policy rate is cut; the no-hold leg is automatically satisfied by a cut.",
"payout_conditions": [
"A cut pays YES 1 USDC.",
"A hold or hike pays YES 0 USDC."
],
"outcomes": [
{
"outcome_id": "out_combo_cut_and_no_hold_yes",
"label": "YES",
"listings": []
},
{
"outcome_id": "out_combo_cut_and_no_hold_no",
"label": "NO",
"listings": []
}
],
"is_combo": true,
"analytical_only": true,
"observed_at": "2026-10-19T12:00:00Z",
"legs": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_no"
}
],
"settlement_convention_id": "demo_all_legs_win_v1"
},
"coverage": {
"complete": true,
"submitted_count": 2,
"supported_count": 2,
"items": [
{
"input_reference": "out_fed_dec_2026_cut_yes",
"outcome_id": "out_fed_dec_2026_cut_yes",
"status": "SUPPORTED",
"family_ids": [
"fam_fed_dec_2026"
]
},
{
"input_reference": "out_fed_dec_2026_hold_no",
"outcome_id": "out_fed_dec_2026_hold_no",
"status": "SUPPORTED",
"family_ids": [
"fam_fed_dec_2026"
]
}
]
},
"versions": {
"market_versions": [
{
"market_id": "mkt_fed_dec_2026_cut",
"version": "1"
},
{
"market_id": "mkt_fed_dec_2026_hold",
"version": "1"
},
{
"market_id": "mkt_combo_cut_and_no_hold",
"version": "1"
}
],
"mapping_version": "1",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"as_of": "2026-10-19T12:00:00Z"
},
"findings": [
{
"code": "REDUNDANT_LEG",
"explanation": "If the Fed cuts rates, it cannot hold rates unchanged. The second leg does not change this ticket’s payout.",
"leg_indices": [
1
],
"witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_cut"
}
]
}
]
}Authorizations
Proposed server-to-server API key. No client request HMAC signing scheme is specified.
Headers
Caller correlation reference; not an idempotency guarantee.
Body
At least two explicitly selected outcome/listing references; retained in the interpreted market.
2Supply exactly one outcome_id or listing_id; never both.
- Option 1
- Option 2
Show child attributes
Show child attributes
Venue whose supported product settlement convention applies; not an order destination.
Opaque text identifier. Preserve its exact value.
1Caller correlation reference for this requested analytical Combo.
Optional family/version pins for reproducible interpretation; otherwise current compatible versions are selected once.
Show child attributes
Show child attributes