Combo redemptions and reductions
curl --request GET \
--url https://api.polynode.dev/v3/combos/redemptions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/combos/redemptions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/combos/redemptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.polynode.dev/v3/combos/redemptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.polynode.dev/v3/combos/redemptions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.polynode.dev/v3/combos/redemptions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/combos/redemptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"redemptions": [
{
"position_type": "combo",
"is_combo": true,
"id": "<string>",
"type": "<string>",
"event_kind": "PositionRedeemed",
"side": "<string>",
"module_kind": "Combinatorial",
"user_address": "<string>",
"wallet_address": "<string>",
"combo_condition_id": "<string>",
"module_id": 3,
"timestamp": 123,
"tx_hash": "<string>",
"log_index": 123,
"block_number": 123,
"redemption_scope": "full",
"redemption_type": "FULL_COMBO",
"redemption_evidence": "terminal_position_redeemed",
"is_full_combo_redemption": true,
"is_partial_combo_redemption": true,
"is_terminal_redemption": true,
"is_partial_combo_reduction": true,
"has_collateral_payout": true,
"lineage_event_id": "<string>",
"lineage_status": "<string>",
"legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"full_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"source_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"remaining_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"removed_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"residual_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"metadata_coverage": "complete",
"parity_status": "<string>",
"combo_position_id": "<string>",
"combo_outcome_index": 127,
"amount_usdc": "<string>",
"payout_usdc": "<string>",
"position_amount_usdc": "<string>",
"collateral_out_usdc": "<string>",
"tx_dttm": "2023-11-07T05:31:56Z",
"source_event_kind": "<string>",
"full_combo_condition_id": "<string>",
"parent_combo_condition_id": "<string>",
"source_combo_condition_id": "<string>",
"reduced_combo_condition_id": "<string>",
"residual_combo_condition_id": "<string>",
"child_yes_combo_condition_id": "<string>",
"child_no_combo_condition_id": "<string>",
"destination_combo_condition_id": "<string>",
"source_position_id": "<string>",
"destination_position_id": "<string>",
"underlying_position_id": "<string>",
"event_id": "<string>",
"condition_index": 123,
"lineage": {},
"source_leg_count": 1,
"removed_leg_count": 1,
"remaining_leg_count": 1,
"leg_transition": "<string>",
"remaining_combo": {
"combo_condition_id": "<string>",
"combo_position_id": "<string>",
"shares_created": "<string>",
"current_wallet_balance": "<string>",
"still_held": true,
"status": "OPEN"
}
}
],
"rows_returned": 123,
"has_more": true,
"offset": 123,
"limit": 123,
"position_type": "combo",
"source": "v3.combos.redemptions"
}Combos
Combo Redemptions
Query terminal combo redemptions, partial post-resolution compression, and exact on-chain lineage.
GET
/
v3
/
combos
/
redemptions
Combo redemptions and reductions
curl --request GET \
--url https://api.polynode.dev/v3/combos/redemptions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.polynode.dev/v3/combos/redemptions"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.polynode.dev/v3/combos/redemptions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.polynode.dev/v3/combos/redemptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.polynode.dev/v3/combos/redemptions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.polynode.dev/v3/combos/redemptions")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.polynode.dev/v3/combos/redemptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"redemptions": [
{
"position_type": "combo",
"is_combo": true,
"id": "<string>",
"type": "<string>",
"event_kind": "PositionRedeemed",
"side": "<string>",
"module_kind": "Combinatorial",
"user_address": "<string>",
"wallet_address": "<string>",
"combo_condition_id": "<string>",
"module_id": 3,
"timestamp": 123,
"tx_hash": "<string>",
"log_index": 123,
"block_number": 123,
"redemption_scope": "full",
"redemption_type": "FULL_COMBO",
"redemption_evidence": "terminal_position_redeemed",
"is_full_combo_redemption": true,
"is_partial_combo_redemption": true,
"is_terminal_redemption": true,
"is_partial_combo_reduction": true,
"has_collateral_payout": true,
"lineage_event_id": "<string>",
"lineage_status": "<string>",
"legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"full_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"source_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"remaining_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"removed_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"residual_legs": [
{
"leg_index": 1,
"leg_position_id": "<string>",
"leg_condition_id": "<string>",
"leg_outcome_index": 1,
"leg_outcome_label": "<string>",
"leg_status": "<string>",
"leg_resolved_at": "2023-11-07T05:31:56Z",
"market_token_id": "<string>",
"leg_result": "won",
"leg_current_price": "<string>",
"leg_price_source": "settlement",
"market": {
"market_id": "<string>",
"slug": "<string>",
"title": "<string>",
"outcome": "<string>",
"image_url": "<string>",
"icon_url": "<string>",
"category": "<string>",
"subcategory": "<string>",
"tags": [
"<unknown>"
],
"end_date": "2023-11-07T05:31:56Z",
"active": true,
"closed": true,
"accepting_orders": true,
"resolved": true,
"winning_outcome_index": 1,
"event": {
"event_id": "<string>",
"event_slug": "<string>",
"event_title": "<string>",
"event_image": "<string>"
}
}
}
],
"metadata_coverage": "complete",
"parity_status": "<string>",
"combo_position_id": "<string>",
"combo_outcome_index": 127,
"amount_usdc": "<string>",
"payout_usdc": "<string>",
"position_amount_usdc": "<string>",
"collateral_out_usdc": "<string>",
"tx_dttm": "2023-11-07T05:31:56Z",
"source_event_kind": "<string>",
"full_combo_condition_id": "<string>",
"parent_combo_condition_id": "<string>",
"source_combo_condition_id": "<string>",
"reduced_combo_condition_id": "<string>",
"residual_combo_condition_id": "<string>",
"child_yes_combo_condition_id": "<string>",
"child_no_combo_condition_id": "<string>",
"destination_combo_condition_id": "<string>",
"source_position_id": "<string>",
"destination_position_id": "<string>",
"underlying_position_id": "<string>",
"event_id": "<string>",
"condition_index": 123,
"lineage": {},
"source_leg_count": 1,
"removed_leg_count": 1,
"remaining_leg_count": 1,
"leg_transition": "<string>",
"remaining_combo": {
"combo_condition_id": "<string>",
"combo_position_id": "<string>",
"shares_created": "<string>",
"current_wallet_balance": "<string>",
"still_held": true,
"status": "OPEN"
}
}
],
"rows_returned": 123,
"has_more": true,
"offset": 123,
"limit": 123,
"position_type": "combo",
"source": "v3.combos.redemptions"
}Use this endpoint to answer one question: after a user’s combo (parlay) was processed, was the whole position redeemed, or were settled legs removed and a smaller combo left behind?
The response preserves Polymarket’s public combo activity fields and adds the explicit before-and-after transition. That includes what the combo contained before the operation, which legs were removed, what remained, and whether the resulting combo is still held.
This endpoint is additive. It does not change standard positions or combo position responses.
Use
In the public
No filter is required. Use the filters below for wallet, market, position, transaction, event, scope, or time-bounded reads.
A non-terminal
For a combo reduced to a smaller combo—for example, three legs reduced to two:
This distinction is intentional:
Condition-to-position mapping is deterministic: the combo condition occupies the high 31 bytes of the position ID and the outcome index occupies the low byte. This lets historical full redemptions map to their combo without re-indexing unrelated contracts.
For a chain of multiple compressions,
GET /v3/combos/activity for ordinary combo acquisition and burn activity such as PositionsSplit and PositionsMerged. This endpoint is scoped to terminal redemptions, post-resolution compression, and the module-level transformations needed to explain redemption lineage.
The consumer view
- A full redemption means the complete combo was consumed.
remaining_leg_countis0, and there is no remaining combo position. - A partial redemption means post-resolution compression removed one or more settled legs and produced a smaller combo.
remaining_comboidentifies the resulting position and, when available, whether the wallet still holds it. - A transformation changes combo structure but is not evidence of a redemption payout. These rows are kept separate so extraction or wrapping is not mistaken for money being redeemed.
leg_transition: "5_to_1" means a five-leg combo became a one-leg combo. Four legs were removed, one leg remained, and the user may still hold the new one-leg position.
How this differs from Polymarket combo activity
Polymarket provides a public combo activity endpoint and combo positions endpoint. The activity response supplies the lifecycle event, reported combo identifiers, amount or payout, transaction details, and a per-leg breakdown. polynode preserves that basic record and adds the transaction-level interpretation needed to explain the redemption directly:| Question | Polymarket combo activity | polynode combo redemptions |
|---|---|---|
| What operation happened? | REDEEM, COMPRESS, and other lifecycle types | Preserved as type and event_kind |
| Was the whole combo redeemed or did a smaller combo remain? | Inferred from the operation and surrounding position state | Explicit redemption_scope, redemption_type, and terminal/partial flags |
| What did the operation start with and produce? | The activity row identifies the reported combo | Explicit source, full, reduced, and destination condition and position IDs |
| How many legs were removed and left? | Not explicit in the activity row | source_leg_count, removed_leg_count, remaining_leg_count, and leg_transition |
| Which exact legs changed? | One legs array for the reported combo | Separate source_legs, removed_legs, and remaining_legs arrays |
| Does the user still hold the resulting combo? | Requires a combo-position lookup | Compact remaining_combo snapshot when the balance is available |
5_to_1 transaction used below, Polymarket reports a COMPRESS event with the resulting one-leg combo. polynode also identifies the consumed five-leg combo, the four removed legs, the exact source-to-destination position transition, and the remaining holding. This removes the need to reconstruct the change from separate activity and position records.
Request
GET /v3/combos/redemptions
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
wallet | string | — | Wallet address |
market_id | string | — | One or more comma-separated combo condition IDs. Matches any condition in the lineage. |
condition_id | string | — | Combo condition ID. Matches the source, full, parent, reduced, residual, child, or destination condition. |
position_id | string | — | Decimal ERC-1155 position ID. Matches the primary, source, destination, or underlying position. |
event_kind | string | — | PositionRedeemed, Compressed, Extracted, Unwrapped, or another supported combo lifecycle event |
redemption_scope | string | all | full, partial, transformation, or all |
redemption_type | string | all | FULL_COMBO, PARTIAL_COMBO, COMBO_TRANSFORMATION, or all |
tx_hash | string | — | Exact Polygon transaction hash |
after | integer | — | Inclusive Unix timestamp in seconds |
before | integer | — | Inclusive Unix timestamp in seconds |
limit | integer | 100 | Results per page, max 300 |
offset | integer | 0 | Pagination offset |
Full redemptions
curl "https://api.polynode.dev/v3/combos/redemptions?wallet=0xf83ec0e37ac9eece71c064507270e9001a734663&redemption_scope=full&limit=25" \
-H "x-api-key: $POLYNODE_API_KEY"
{
"event_kind": "PositionRedeemed",
"redemption_scope": "full",
"redemption_type": "FULL_COMBO",
"redemption_evidence": "terminal_position_redeemed",
"is_full_combo_redemption": true,
"is_partial_combo_redemption": false,
"is_terminal_redemption": true,
"is_partial_combo_reduction": false,
"has_collateral_payout": true,
"combo_condition_id": "0x03c90d5cf41198141f9d85cee33943b3750000000000000000000000000000",
"combo_position_id": "1712167034491293012950849257976671163728504435933953725817269660684235309057",
"payout_usdc": "0.001749",
"source_leg_count": 3,
"removed_leg_count": 3,
"remaining_leg_count": 0,
"leg_transition": "3_to_0",
"legs": [
{"leg_index": 0, "leg_outcome_label": "Yes"},
{"leg_index": 1, "leg_outcome_label": "No"},
{"leg_index": 2, "leg_outcome_label": "No"}
]
}
PositionRedeemed proves that the entire referenced combo position was redeemed. A terminal Compressed event whose destination position is 0 is also classified as full, with redemption_evidence: "terminal_compression". Router and auto-redeemer transactions use the user-facing wallet rather than attributing the redemption to an intermediary contract.
Partial post-resolution redemptions
curl "https://api.polynode.dev/v3/combos/redemptions?redemption_scope=partial&event_kind=Compressed&limit=25" \
-H "x-api-key: $POLYNODE_API_KEY"
Compressed row proves that post-resolution processing changed an old combo position into a smaller combo position. The leg arrays below are abbreviated:
{
"event_kind": "Compressed",
"type": "COMPRESS",
"side": "Compress",
"wallet_address": "0xc82f0a25aad828f59347670e63ead5ea144466a7",
"redemption_scope": "partial",
"redemption_type": "PARTIAL_COMBO",
"redemption_evidence": "post_resolution_compression",
"is_full_combo_redemption": false,
"is_partial_combo_redemption": true,
"is_terminal_redemption": false,
"is_partial_combo_reduction": true,
"has_collateral_payout": false,
"combo_condition_id": "0x03f20b4d62f602343ec586eb21b1fd88320000000000000000000000000000",
"combo_position_id": "1784593540973682895298448580384733359095951577285561914582372891673092947968",
"full_combo_condition_id": "0x0387525b6b182939b62c8ffd3f64c703aa0000000000000000000000000000",
"reduced_combo_condition_id": "0x03f20b4d62f602343ec586eb21b1fd88320000000000000000000000000000",
"source_position_id": "1596031307328819069153563606934811624985504858539062944212408350305599619073",
"destination_position_id": "1784593540973682895298448580384733359095951577285561914582372891673092947969",
"amount_usdc": "392.295381",
"position_amount_usdc": "392.295381",
"collateral_out_usdc": "0.000000",
"source_leg_count": 5,
"removed_leg_count": 4,
"remaining_leg_count": 1,
"leg_transition": "5_to_1",
"full_legs": [{"leg_index": 0, "leg_outcome_label": "Spain"}],
"source_legs": [{"leg_index": 0, "leg_outcome_label": "Spain"}],
"remaining_legs": [
{
"leg_index": 0,
"leg_position_id": "607054667337535653336040312390449441244232932993621750080905322313694576640",
"leg_condition_id": "0x4a0aa5a56b98476ffbab967ba0eb70d35794ad0f154fbce5b976d6053bb47808",
"leg_outcome_index": 0,
"leg_outcome_label": "Argentina",
"market_token_id": "67596909630505748192273119086224135081859582478741941473155557882450542807607",
"leg_result": "won",
"leg_current_price": "1.0000",
"leg_price_source": "settlement",
"market": {
"title": "Argentina vs. Cabo Verde: Team to Advance",
"slug": "fifwc-arg-cvi-2026-07-03-team-to-advance",
"active": true,
"closed": true,
"accepting_orders": false,
"resolved": true,
"winning_outcome_index": 0
}
}
],
"removed_legs": [{"leg_index": 0, "leg_outcome_label": "Spain"}],
"remaining_combo": {
"combo_condition_id": "0x03f20b4d62f602343ec586eb21b1fd88320000000000000000000000000000",
"combo_position_id": "1784593540973682895298448580384733359095951577285561914582372891673092947969",
"shares_created": "392.295381",
"current_wallet_balance": "873.364653",
"still_held": true,
"status": "OPEN"
},
"metadata_coverage": "complete",
"tx_hash": "0xe73ed3c24d1ca763984df61fad854479c45ea67b555ebaa547c994aa777add0c",
"log_index": 559,
"block_number": 89561963
}
full_combo_condition_ididentifies the pre-transition combo consumed by this compression.reduced_combo_condition_ididentifies the surviving smaller combo.combo_condition_id,combo_position_id, andlegsretain Polymarket’s basic record for the surviving combo.full_legsandsource_legspreserve that pre-transition combo context.remaining_legsandremoved_legscompare the indexed leg registries.source_position_idanddestination_position_idprovide the exact ERC-1155 transition.source_leg_count,removed_leg_count, andremaining_leg_countanswer how many legs the operation started with, removed, and left behind.leg_transitionis the compact form, such as3_to_2.remaining_combois a compact holding snapshot for the destination combo. It does not include entry price, cost basis, or P&L and is not a replacement for the positions endpoint.
has_collateral_payout and collateral_out_usdc tell you whether compression also emitted collateral. A zero collateral amount can still be a real partial resolution: the surviving value moved entirely into the reduced combo position.
For a full redemption, remaining_leg_count is 0, removed_leg_count equals the source leg count, and remaining_combo is omitted. If a partial redemption’s current destination balance is unavailable, remaining_combo still includes its condition, position, and shares_created; balance-dependent fields are omitted rather than assumed to be zero.
Leg identifiers, result, and price
Each object inlegs, full_legs, source_legs, remaining_legs, removed_legs, and residual_legs can include:
| Field | Description |
|---|---|
leg_position_id | Position ID used by the combo contract for this leg |
leg_condition_id | Standard market condition ID |
leg_outcome_index | Selected outcome index within the standard market |
leg_outcome_label | Selected outcome label |
market_token_id | Canonical Polymarket CLOB token ID for the selected outcome. Use this with price, order-book, trade, and candle endpoints. |
leg_result | won, lost, resolved, or pending for the selected outcome |
leg_current_price | Best available canonical price for the selected outcome, formatted from 0.0000 to 1.0000 |
leg_price_source | settlement, clob_mid, last_fill, or polymarket_market |
market.active | Whether Polymarket marks the market active |
market.closed | Whether the market is closed |
market.accepting_orders | Whether the market currently accepts orders |
market.resolved | Whether a final result is known |
market.winning_outcome_index | Winning outcome index when one unique winner is known |
settlement is the terminal 0 or 1 outcome value. clob_mid is the current order-book midpoint. last_fill is the most recent trade price when a midpoint is unavailable. polymarket_market is Polymarket’s market-level outcome price fallback.
market_token_id is intentionally distinct from leg_position_id. The former is the standard market token accepted by price and order-book endpoints; the latter is the combo contract’s leg identifier.
Permissionless combo markets can contain an on-chain leg that has no corresponding Polymarket CLOB market or order book. In that case, the exact leg_position_id remains present while market_token_id, leg_result, leg_current_price, leg_price_source, and standard market metadata are omitted rather than inferred.
Structural extraction is not a redemption
Extracted returns full_combo_condition_id, reduced_combo_condition_id, and residual_combo_condition_id, which is useful for reconstructing a larger combo into smaller branches. It is classified as:
{
"event_kind": "Extracted",
"redemption_scope": "transformation",
"redemption_type": "COMBO_TRANSFORMATION",
"redemption_evidence": "condition_extraction",
"is_partial_combo_redemption": false,
"is_partial_combo_reduction": true
}
Extracted proves exact condition lineage, but it does not prove a redemption payout. Use Compressed for a partial post-resolution transition and PositionRedeemed or terminal compression for a terminal redemption.
Scope meanings
| Scope | Meaning |
|---|---|
full | A complete combo position was redeemed (PositionRedeemed) or terminally compressed to position 0. |
partial | A non-terminal post-resolution Compressed event changed the old combo into a reduced combo. |
transformation | A non-redemption lifecycle transformation such as extract, inject, wrap, unwrap, convert, or condition/event split/merge. |
Evidence and lineage fields
| Field | Description |
|---|---|
redemption_evidence | Why the row is classified as terminal, partial, extraction, injection, or another transformation |
is_terminal_redemption | true for terminal PositionRedeemed or terminal compression |
is_partial_combo_reduction | true for a smaller-combo compression or structural extraction |
has_collateral_payout | Whether payout_usdc or collateral_out_usdc is positive |
lineage_event_id | Stable transaction-hash/log-index identifier |
full_combo_condition_id | Pre-transition full/source combo condition for this event |
parent_combo_condition_id | Parent condition for condition/event operations |
source_combo_condition_id | Condition consumed by the operation |
reduced_combo_condition_id | Smaller combo condition produced by a reduction |
residual_combo_condition_id | Residual condition emitted by extract/inject |
child_yes_combo_condition_id / child_no_combo_condition_id | Child conditions emitted by condition splits/merges |
destination_combo_condition_id | Primary destination condition when one exists |
source_position_id / destination_position_id | Exact position transition when present |
underlying_position_id | Standard underlying position for wrap/unwrap operations |
full_combo_condition_id is the immediate pre-transition combo on each row, not a guessed earliest ancestor. Follow source_position_id and destination_position_id across rows when the chain facts are available; the endpoint does not invent a root parlay identifier that the contract did not emit.
Metadata coverage
metadata_coverage describes the leg expansion available for that row:
complete: the required combo leg registries are available.missing_source_legs: the source condition is known on chain, but its leg metadata is not yet available.missing_reduced_legs: the reduction is known on chain, but the reduced combo’s leg metadata is not yet available.
Authorizations
Query Parameters
Wallet address
Pattern:
^0x[a-fA-F0-9]{40}$One or more comma-separated combo condition IDs. Matches any condition in the lineage.
Combo condition ID. Matches source, full, parent, reduced, residual, child, and destination conditions.
Pattern:
^0x[a-fA-F0-9]{62}$Primary, source, destination, or underlying position ID
Pattern:
^[0-9]+$Available options:
PositionRedeemed, Compressed, ConvertedOnEvent, ConvertedToYesBasket, Extracted, Injected, MergedFromYesBasket, MergedOnCondition, MergedOnEvent, SplitOnCondition, SplitOnEvent, Unwrapped, Wrapped, all full = terminal redemption; partial = non-terminal post-resolution compression; transformation = non-redemption lifecycle lineage
Available options:
full, partial, transformation, all Available options:
FULL_COMBO, PARTIAL_COMBO, COMBO_TRANSFORMATION, all Exact Polygon transaction hash
Pattern:
^0x[a-fA-F0-9]{64}$Inclusive Unix timestamp in seconds
Required range:
x >= 0Inclusive Unix timestamp in seconds
Required range:
x >= 0Required range:
1 <= x <= 300Required range:
x >= 0
