curl --request POST \
--url https://api.rook.pm/v1/relationships:analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_yes"
}
]
}
'import requests
url = "https://api.rook.pm/v1/relationships:analyze"
payload = { "selection": [{ "outcome_id": "out_fed_dec_2026_cut_yes" }, { "outcome_id": "out_fed_dec_2026_hold_yes" }] }
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({
selection: [
{outcome_id: 'out_fed_dec_2026_cut_yes'},
{outcome_id: 'out_fed_dec_2026_hold_yes'}
]
})
};
fetch('https://api.rook.pm/v1/relationships:analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"relationships": [
{
"relationship_id": "rel_fed_cut_hold_exclusive",
"type": "EXCLUSIVITY",
"from_outcome_id": "out_fed_dec_2026_cut_yes",
"to_outcome_id": "out_fed_dec_2026_hold_yes",
"related_market_ids": [
"mkt_fed_dec_2026_cut",
"mkt_fed_dec_2026_hold"
],
"related_event_ids": [
"evt_pm_900001",
"evt_pm_900002"
],
"explanation": "The same Fed decision cannot both lower the policy rate and leave it unchanged. The two YES outcomes never pay together in these scenarios.",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_cut"
},
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_hold"
}
]
}
],
"baskets": [
{
"classification": "EXCLUSIVE",
"outcome_ids": [
"out_fed_dec_2026_cut_yes",
"out_fed_dec_2026_hold_yes"
],
"selected_outcome_count": 2,
"scenario_count": 3,
"representation": "CUT_HOLD_HIKE",
"paying_definition": "POSITIVE_PAYOUT",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"paying_counts": {
"none": 1,
"exactly_one": 2,
"two_or_more": 0
},
"gap_witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_hike"
}
],
"overlap_witnesses": []
}
],
"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_yes",
"outcome_id": "out_fed_dec_2026_hold_yes",
"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"
}
],
"mapping_version": "1",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"as_of": "2026-10-19T12:00:00Z"
}
}Analyze relationships
Explain how an explicitly selected set of outcomes can pay together. Supply outcome_id or listing_id references in selection; resolve native market IDs first. The response can include pair relationships, basket overlap/gap counts and example settlement witnesses.
For example, two outcomes can be mutually exclusive even when their markets appear in different original venue events. The analysis uses published family scenarios rather than titles or price correlation. Returned scenario pins and the paying_definition state the scope of the finding; FULL_PAYOUT distinguishes full wins from fractional payouts.
Only supplied outcomes participate, and duplicate references to the same canonical outcome are deduplicated for set counts. Witness limits bound returned examples, not the scenario domain used to prove a finding. Complete-coverage requests reject missing interpretations; partial requests identify the supported subset explicitly.
curl --request POST \
--url https://api.rook.pm/v1/relationships:analyze \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": [
{
"outcome_id": "out_fed_dec_2026_cut_yes"
},
{
"outcome_id": "out_fed_dec_2026_hold_yes"
}
]
}
'import requests
url = "https://api.rook.pm/v1/relationships:analyze"
payload = { "selection": [{ "outcome_id": "out_fed_dec_2026_cut_yes" }, { "outcome_id": "out_fed_dec_2026_hold_yes" }] }
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({
selection: [
{outcome_id: 'out_fed_dec_2026_cut_yes'},
{outcome_id: 'out_fed_dec_2026_hold_yes'}
]
})
};
fetch('https://api.rook.pm/v1/relationships:analyze', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"relationships": [
{
"relationship_id": "rel_fed_cut_hold_exclusive",
"type": "EXCLUSIVITY",
"from_outcome_id": "out_fed_dec_2026_cut_yes",
"to_outcome_id": "out_fed_dec_2026_hold_yes",
"related_market_ids": [
"mkt_fed_dec_2026_cut",
"mkt_fed_dec_2026_hold"
],
"related_event_ids": [
"evt_pm_900001",
"evt_pm_900002"
],
"explanation": "The same Fed decision cannot both lower the policy rate and leave it unchanged. The two YES outcomes never pay together in these scenarios.",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_cut"
},
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_hold"
}
]
}
],
"baskets": [
{
"classification": "EXCLUSIVE",
"outcome_ids": [
"out_fed_dec_2026_cut_yes",
"out_fed_dec_2026_hold_yes"
],
"selected_outcome_count": 2,
"scenario_count": 3,
"representation": "CUT_HOLD_HIKE",
"paying_definition": "POSITIVE_PAYOUT",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"paying_counts": {
"none": 1,
"exactly_one": 2,
"two_or_more": 0
},
"gap_witnesses": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1",
"scenario_id": "scn_hike"
}
],
"overlap_witnesses": []
}
],
"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_yes",
"outcome_id": "out_fed_dec_2026_hold_yes",
"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"
}
],
"mapping_version": "1",
"scenario_pins": [
{
"family_id": "fam_fed_dec_2026",
"scenario_version": "1"
}
],
"as_of": "2026-10-19T12:00:00Z"
}
}Authorizations
Proposed server-to-server API key. No client request HMAC signing scheme is specified.
Headers
Caller correlation reference; not an idempotency guarantee.
Body
Explicit supplied outcome/listing references; resolved canonical outcomes are deduplicated for set statistics.
1Supply exactly one outcome_id or listing_id; never both.
- Option 1
- Option 2
Show child attributes
Show child attributes
Optional explicit family/version pins; returned even when selected automatically.
Show child attributes
Show child attributes
POSITIVE_PAYOUT by default; FULL_PAYOUT distinguishes fractional settlements.
POSITIVE_PAYOUT, FULL_PAYOUT Requested outputs; default PAIRS, BASKET and WITNESSES.
PAIRS, BASKET, WITNESSES, EVIDENCE Maximum example witnesses per finding; never limits the domain used to establish the finding.
x >= 0True rejects incomplete selected-set scope; false explicitly labels analysis of the supported subset.