docs: sync Polymarket docs updates 2026-07-10
Updated 21 files: - trading/orders: overview, create - developers/CLOB/orders: orders, create-order, create-order-batch, get-order, get-active-order, check-scoring, onchain-order-info - developers/CLOB/status - market-makers: trading, maker-rebates, combos - trading/fees, market-makers maker-rebates-program, trading/fees - dev-tooling: python, typescript - api-reference/core: get-trades-for-a-user-or-markets, get-user-activity - changelog/changelog
This commit is contained in:
@@ -98,6 +98,23 @@ paths:
|
|||||||
enum:
|
enum:
|
||||||
- BUY
|
- BUY
|
||||||
- SELL
|
- SELL
|
||||||
|
- in: query
|
||||||
|
name: start
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
minimum: 0
|
||||||
|
description: >-
|
||||||
|
Lower-bound timestamp (epoch seconds) for the trade window. Omit or
|
||||||
|
pass `0` for the default window (most recent ~3 years); pass a
|
||||||
|
positive epoch (e.g. `1`) to retrieve full history.
|
||||||
|
- in: query
|
||||||
|
name: end
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
minimum: 0
|
||||||
|
description: >-
|
||||||
|
Upper-bound timestamp (epoch seconds) for the trade window. Omit for
|
||||||
|
the default (current time); rows newer than `end` are excluded.
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Success
|
description: Success
|
||||||
|
|||||||
@@ -108,6 +108,9 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
type: integer
|
type: integer
|
||||||
minimum: 0
|
minimum: 0
|
||||||
|
description: >-
|
||||||
|
Upper-bound timestamp (epoch seconds) for the activity window. Omit
|
||||||
|
for the default (current time); rows newer than `end` are excluded.
|
||||||
- in: query
|
- in: query
|
||||||
name: sortBy
|
name: sortBy
|
||||||
schema:
|
schema:
|
||||||
|
|||||||
@@ -6,6 +6,12 @@
|
|||||||
|
|
||||||
> Welcome to the Polymarket Changelog. Here you will find any important changes to Polymarket, including but not limited to CLOB, API, UI and Mobile Applications.
|
> Welcome to the Polymarket Changelog. Here you will find any important changes to Polymarket, including but not limited to CLOB, API, UI and Mobile Applications.
|
||||||
|
|
||||||
|
<Update label="Jul 10, 2026" description="Sports taker fee and maker rebate update">
|
||||||
|
* **Sports fee coefficient**: The sports taker fee rate increases from `0.03` to `0.05` at midnight UTC.
|
||||||
|
* **Sports maker rebate**: The sports maker rebate decreases from 25% to 15% of collected taker fees.
|
||||||
|
* **Updated documentation**: [Fees](/trading/fees) and [Maker Rebates Program](/market-makers/maker-rebates).
|
||||||
|
</Update>
|
||||||
|
|
||||||
<Update label="Jul 2, 2026" description="World Cup markets decimalized to a 0.0025 (0.25¢) tick size">
|
<Update label="Jul 2, 2026" description="World Cup markets decimalized to a 0.0025 (0.25¢) tick size">
|
||||||
* **Finer tick size for World Cup markets**: All World Cup *to advance*, *moneyline*, *spreads*, and *totals* markets are now decimalized to a **0.0025 (0.25¢)** tick size. This lets you execute at smaller ticks and tighter spreads for the most competitive prices. Applies only to those World Cup markets — see [Tick Sizes](/trading/orders/overview#tick-sizes).
|
* **Finer tick size for World Cup markets**: All World Cup *to advance*, *moneyline*, *spreads*, and *totals* markets are now decimalized to a **0.0025 (0.25¢)** tick size. This lets you execute at smaller ticks and tighter spreads for the most competitive prices. Applies only to those World Cup markets — see [Tick Sizes](/trading/orders/overview#tick-sizes).
|
||||||
</Update>
|
</Update>
|
||||||
|
|||||||
@@ -1102,6 +1102,25 @@ Secure clients expose the API credentials created for the authenticated session.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### `0.1.0b17`
|
||||||
|
|
||||||
|
* Added SDK pagination for Combo lifecycle activity and server-cursor pagination for Combo positions.
|
||||||
|
* Added typed overloads for market, event, and tag lookups, mutually-exclusive lookup arguments, and `redeem_positions`.
|
||||||
|
* Added trade time filters.
|
||||||
|
* Hardened Combo pagination filters and branded Combo activity IDs.
|
||||||
|
* Breaking beta change: Combo activity and position fields now use `wallet`, `amount`, and `payout`; Combo activity rows no longer expose `module_kind`.
|
||||||
|
|
||||||
|
```diff theme={null}
|
||||||
|
-activity.user_address
|
||||||
|
-activity.amount_usdc
|
||||||
|
-redeem_activity.payout_usdc
|
||||||
|
-position.user_address
|
||||||
|
+activity.wallet
|
||||||
|
+activity.amount
|
||||||
|
+redeem_activity.payout
|
||||||
|
+position.wallet
|
||||||
|
```
|
||||||
|
|
||||||
### `0.1.0b16`
|
### `0.1.0b16`
|
||||||
|
|
||||||
* Fixed Deposit Wallet trading setup approvals to use the current Protocol V2 auto-redeem operator.
|
* Fixed Deposit Wallet trading setup approvals to use the current Protocol V2 auto-redeem operator.
|
||||||
|
|||||||
@@ -1103,6 +1103,24 @@ Secure clients expose the API credentials created for the authenticated session.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### `0.1.0-beta.14`
|
||||||
|
|
||||||
|
* Added SDK pagination for Combo lifecycle activity and server-cursor pagination for Combo positions.
|
||||||
|
* Added Combo position sync request fields and exposed `outcome` and `redeemable` on Combo positions.
|
||||||
|
* Branded Combo activity row IDs.
|
||||||
|
* Breaking beta change: Combo activity and position fields now use `wallet`, `amount`, and `payout`; Combo activity rows no longer expose `moduleKind`.
|
||||||
|
|
||||||
|
```diff theme={null}
|
||||||
|
-activity.userAddress
|
||||||
|
-activity.amountUsdc
|
||||||
|
-redeemActivity.payoutUsdc
|
||||||
|
-position.userAddress
|
||||||
|
+activity.wallet
|
||||||
|
+activity.amount
|
||||||
|
+redeemActivity.payout
|
||||||
|
+position.wallet
|
||||||
|
```
|
||||||
|
|
||||||
### `0.1.0-beta.13`
|
### `0.1.0-beta.13`
|
||||||
|
|
||||||
* Added `listMarketClarifications` for reading market clarification text with SDK-owned pagination and market, event, state, question, and transaction filters.
|
* Added `listMarketClarifications` for reading market clarification text with SDK-owned pagination and market, event, state, question, and transaction filters.
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
.size(dec!(10))
|
.size(dec!(10))
|
||||||
.side(Side::Buy)
|
.side(Side::Buy)
|
||||||
.order_type(OrderType::GTD)
|
.order_type(OrderType::GTD)
|
||||||
.expiration(Utc::now() + TimeDelta::hours(1))
|
.expiration(Utc::now() + TimeDelta::minutes(1) + TimeDelta::hours(1))
|
||||||
.build()
|
.build()
|
||||||
.await?;
|
.await?;
|
||||||
let signed = client.sign(&signer, order).await?;
|
let signed = client.sign(&signer, order).await?;
|
||||||
@@ -217,9 +217,11 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
There is a security threshold of one minute on GTD expiration. To set an
|
GTD orders expire one minute before their stated expiration as a security
|
||||||
effective lifetime of N seconds, use `now + 60 + N`. For example, for a
|
threshold. To set an effective lifetime of N seconds, use `now + 60 + N`.
|
||||||
30-second effective lifetime, set the expiration to `now + 60 + 30`.
|
In addition, the expiration must be at least three minutes in the future —
|
||||||
|
orders expiring sooner are rejected — so the minimum effective lifetime is
|
||||||
|
about two minutes.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
.size(dec!(10))
|
.size(dec!(10))
|
||||||
.side(Side::Buy)
|
.side(Side::Buy)
|
||||||
.order_type(OrderType::GTD)
|
.order_type(OrderType::GTD)
|
||||||
.expiration(Utc::now() + TimeDelta::hours(1))
|
.expiration(Utc::now() + TimeDelta::minutes(1) + TimeDelta::hours(1))
|
||||||
.build()
|
.build()
|
||||||
.await?;
|
.await?;
|
||||||
let signed = client.sign(&signer, order).await?;
|
let signed = client.sign(&signer, order).await?;
|
||||||
@@ -217,9 +217,11 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
There is a security threshold of one minute on GTD expiration. To set an
|
GTD orders expire one minute before their stated expiration as a security
|
||||||
effective lifetime of N seconds, use `now + 60 + N`. For example, for a
|
threshold. To set an effective lifetime of N seconds, use `now + 60 + N`.
|
||||||
30-second effective lifetime, set the expiration to `now + 60 + 30`.
|
In addition, the expiration must be at least three minutes in the future —
|
||||||
|
orders expiring sooner are rejected — so the minimum effective lifetime is
|
||||||
|
about two minutes.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+507
-63
@@ -1623,8 +1623,8 @@ form](https://forms.gle/dk5A1DRw8EN5uP9z5).
|
|||||||
|
|
||||||
<Warning>
|
<Warning>
|
||||||
Makers are expected to accept most selected quotes. We track acceptance rates,
|
Makers are expected to accept most selected quotes. We track acceptance rates,
|
||||||
and makers who reject more than 15% of selected quotes over a one-hour lookback
|
and makers who reject more than 15% of selected quotes over a one-hour
|
||||||
window may be paused from quoting for a few minutes.
|
lookback window may be paused from quoting for a few minutes.
|
||||||
</Warning>
|
</Warning>
|
||||||
|
|
||||||
Once access is enabled, your quoting system will immediately be asked to review
|
Once access is enabled, your quoting system will immediately be asked to review
|
||||||
@@ -1886,11 +1886,14 @@ fresh outside the quote path.
|
|||||||
<Tabs>
|
<Tabs>
|
||||||
<Tab title="TypeScript">
|
<Tab title="TypeScript">
|
||||||
Use `client.listComboPositions(...)` to page through Combo positions for the
|
Use `client.listComboPositions(...)` to page through Combo positions for the
|
||||||
authenticated account. Filter by status, Combo condition ID, or Combo position
|
authenticated account.
|
||||||
ID when you only need a subset of positions.
|
|
||||||
|
|
||||||
```ts theme={null}
|
```ts theme={null}
|
||||||
import { ComboPositionStatus, type ComboPosition } from "@polymarket/client";
|
import {
|
||||||
|
ComboPositionSort,
|
||||||
|
ComboPositionStatus,
|
||||||
|
type ComboPosition,
|
||||||
|
} from "@polymarket/client";
|
||||||
|
|
||||||
const positions = client.listComboPositions({
|
const positions = client.listComboPositions({
|
||||||
status: ComboPositionStatus.Open,
|
status: ComboPositionStatus.Open,
|
||||||
@@ -1904,6 +1907,31 @@ fresh outside the quote path.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can filter positions by the following criteria. `conditionId` accepts one
|
||||||
|
Combo condition ID or an array of Combo condition IDs.
|
||||||
|
|
||||||
|
<CodeGroup>
|
||||||
|
```ts Condition ID theme={null}
|
||||||
|
const positions = client.listComboPositions({
|
||||||
|
conditionId: ["<combo_condition_id_1>", "<combo_condition_id_2>"],
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts Status theme={null}
|
||||||
|
const positions = client.listComboPositions({
|
||||||
|
status: ComboPositionStatus.Open,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts Incremental Sync theme={null}
|
||||||
|
const positions = client.listComboPositions({
|
||||||
|
updatedAfter: lastWatermarkSeconds,
|
||||||
|
sort: ComboPositionSort.UpdatedAsc,
|
||||||
|
pageSize: 1000,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
Each returned item is a `ComboPosition`.
|
Each returned item is a `ComboPosition`.
|
||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
@@ -1911,14 +1939,19 @@ fresh outside the quote path.
|
|||||||
type ComboPosition = {
|
type ComboPosition = {
|
||||||
conditionId: ComboConditionId;
|
conditionId: ComboConditionId;
|
||||||
positionId: PositionId;
|
positionId: PositionId;
|
||||||
|
outcome: ComboPositionOutcome;
|
||||||
moduleId: number;
|
moduleId: number;
|
||||||
userAddress: Address;
|
wallet: Address;
|
||||||
shares: DecimalString;
|
shares: DecimalString;
|
||||||
entryAvgPriceUsdc?: DecimalString | null;
|
entryAvgPriceUsdc?: DecimalString | null;
|
||||||
entryCostUsdc?: DecimalString | null;
|
entryCostUsdc?: DecimalString | null;
|
||||||
|
realizedPayoutUsdc?: DecimalString | null;
|
||||||
|
totalCostUsdc?: DecimalString | null;
|
||||||
status: ComboPositionStatus;
|
status: ComboPositionStatus;
|
||||||
|
redeemable: boolean;
|
||||||
firstEntryAt: IsoDateTimeString;
|
firstEntryAt: IsoDateTimeString;
|
||||||
resolvedAt?: IsoDateTimeString | null;
|
resolvedAt?: IsoDateTimeString | null;
|
||||||
|
updatedAt?: IsoDateTimeString;
|
||||||
legsTotal: number;
|
legsTotal: number;
|
||||||
legsResolved: number;
|
legsResolved: number;
|
||||||
legsPending: number;
|
legsPending: number;
|
||||||
@@ -1966,27 +1999,10 @@ fresh outside the quote path.
|
|||||||
```
|
```
|
||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
You can filter positions by the following criteria:
|
For redeemed positions, `shares` and `entryCostUsdc` track remaining inventory,
|
||||||
|
so both can read as zero after a winning Combo is redeemed. Use
|
||||||
<CodeGroup>
|
`realizedPayoutUsdc` for gross redemption proceeds and `totalCostUsdc` for
|
||||||
```ts Condition ID theme={null}
|
original cost basis; net result is `realizedPayoutUsdc - totalCostUsdc`.
|
||||||
const positions = client.listComboPositions({
|
|
||||||
conditionId: "<combo_condition_id>",
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts Position ID theme={null}
|
|
||||||
const positions = client.listComboPositions({
|
|
||||||
positionId: "<yes_position_id|no_position_id>",
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts Status theme={null}
|
|
||||||
const positions = client.listComboPositions({
|
|
||||||
status: ComboPositionStatus.Open,
|
|
||||||
});
|
|
||||||
```
|
|
||||||
</CodeGroup>
|
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab title="Python">
|
<Tab title="Python">
|
||||||
@@ -2003,6 +2019,31 @@ fresh outside the quote path.
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can filter positions by the following criteria. `condition_id` accepts one
|
||||||
|
Combo condition ID or a sequence of Combo condition IDs.
|
||||||
|
|
||||||
|
<CodeGroup>
|
||||||
|
```python Condition ID theme={null}
|
||||||
|
positions = client.list_combo_positions(
|
||||||
|
condition_id=["<combo_condition_id_1>", "<combo_condition_id_2>"],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python Status theme={null}
|
||||||
|
positions = client.list_combo_positions(
|
||||||
|
status="OPEN",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python Incremental Sync theme={null}
|
||||||
|
positions = client.list_combo_positions(
|
||||||
|
updated_after=last_watermark_seconds,
|
||||||
|
sort="updated_asc",
|
||||||
|
page_size=1000,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
The returned `ComboPosition` models include the following fields:
|
The returned `ComboPosition` models include the following fields:
|
||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
@@ -2010,14 +2051,19 @@ fresh outside the quote path.
|
|||||||
class ComboPosition:
|
class ComboPosition:
|
||||||
condition_id: ComboConditionId
|
condition_id: ComboConditionId
|
||||||
position_id: PositionId
|
position_id: PositionId
|
||||||
|
outcome: ComboPositionOutcome
|
||||||
module_id: int
|
module_id: int
|
||||||
user_address: EvmAddress
|
wallet: EvmAddress
|
||||||
shares: Decimal
|
shares: Decimal
|
||||||
entry_avg_price_usdc: Decimal | None
|
entry_avg_price_usdc: Decimal | None
|
||||||
entry_cost_usdc: Decimal | None
|
entry_cost_usdc: Decimal | None
|
||||||
|
realized_payout_usdc: Decimal | None
|
||||||
|
total_cost_usdc: Decimal | None
|
||||||
status: ComboPositionStatus
|
status: ComboPositionStatus
|
||||||
|
redeemable: bool
|
||||||
first_entry_at: datetime
|
first_entry_at: datetime
|
||||||
resolved_at: datetime | None
|
resolved_at: datetime | None
|
||||||
|
updated_at: datetime | None
|
||||||
legs_total: int
|
legs_total: int
|
||||||
legs_resolved: int
|
legs_resolved: int
|
||||||
legs_pending: int
|
legs_pending: int
|
||||||
@@ -2061,27 +2107,10 @@ fresh outside the quote path.
|
|||||||
```
|
```
|
||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
You can filter positions by the following criteria:
|
For redeemed positions, `shares` and `entry_cost_usdc` track remaining
|
||||||
|
inventory, so both can be zero after a winning Combo is redeemed. Use
|
||||||
<CodeGroup>
|
`realized_payout_usdc` for gross redemption proceeds and `total_cost_usdc` for
|
||||||
```python Condition ID theme={null}
|
original cost basis; net result is `realized_payout_usdc - total_cost_usdc`.
|
||||||
positions = client.list_combo_positions(
|
|
||||||
condition_id="<combo_condition_id>",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
```python Position ID theme={null}
|
|
||||||
positions = client.list_combo_positions(
|
|
||||||
position_id="<yes_position_id|no_position_id>",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
```python Status theme={null}
|
|
||||||
positions = client.list_combo_positions(
|
|
||||||
status="OPEN",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
</CodeGroup>
|
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab title="API">
|
<Tab title="API">
|
||||||
@@ -2100,7 +2129,7 @@ fresh outside the quote path.
|
|||||||
```bash Condition ID theme={null}
|
```bash Condition ID theme={null}
|
||||||
curl -G "https://data-api.polymarket.com/v1/positions/combos" \
|
curl -G "https://data-api.polymarket.com/v1/positions/combos" \
|
||||||
--data-urlencode "user=<maker_address>" \
|
--data-urlencode "user=<maker_address>" \
|
||||||
--data-urlencode "combo_condition_id=<combo_condition_id>"
|
--data-urlencode "market_id=<combo_condition_id>"
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash Position ID theme={null}
|
```bash Position ID theme={null}
|
||||||
@@ -2135,6 +2164,7 @@ fresh outside the quote path.
|
|||||||
"status": "OPEN",
|
"status": "OPEN",
|
||||||
"first_entry_at": "2026-06-08T00:00:00Z",
|
"first_entry_at": "2026-06-08T00:00:00Z",
|
||||||
"resolved_at": null,
|
"resolved_at": null,
|
||||||
|
"updated_at": "2026-06-08T00:00:00Z",
|
||||||
"legs_total": 2,
|
"legs_total": 2,
|
||||||
"legs_resolved": 0,
|
"legs_resolved": 0,
|
||||||
"legs_pending": 2,
|
"legs_pending": 2,
|
||||||
@@ -2155,27 +2185,441 @@ fresh outside the quote path.
|
|||||||
"pagination": {
|
"pagination": {
|
||||||
"limit": 50,
|
"limit": 50,
|
||||||
"offset": 0,
|
"offset": 0,
|
||||||
"has_more": false,
|
"has_more": true,
|
||||||
"next_cursor": null
|
"next_cursor": "eyJsIjo1MCwibyI6NTB9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Use `cursor` from `pagination.next_cursor` to fetch the next page. Keep the same
|
||||||
|
filters and `sort`; `cursor` supersedes `offset`. A `null` cursor means there
|
||||||
|
are no more pages.
|
||||||
|
|
||||||
|
```bash Cursor theme={null}
|
||||||
|
curl -G "https://data-api.polymarket.com/v1/positions/combos" \
|
||||||
|
--data-urlencode "user=<maker_address>" \
|
||||||
|
--data-urlencode "limit=100" \
|
||||||
|
--data-urlencode "sort=first_entry_desc" \
|
||||||
|
--data-urlencode "cursor=<pagination.next_cursor>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `updatedAfter` with `sort=updated_asc` to incrementally sync changed
|
||||||
|
positions. Store the newest `updated_at` you process as your next watermark;
|
||||||
|
boundary rows may re-deliver, so upsert by `(combo_condition_id,
|
||||||
|
combo_position_id)`.
|
||||||
|
|
||||||
|
```bash Incremental sync theme={null}
|
||||||
|
curl -G "https://data-api.polymarket.com/v1/positions/combos" \
|
||||||
|
--data-urlencode "user=<maker_address>" \
|
||||||
|
--data-urlencode "updatedAfter=<last_watermark_epoch_seconds>" \
|
||||||
|
--data-urlencode "sort=updated_asc" \
|
||||||
|
--data-urlencode "limit=1000"
|
||||||
|
```
|
||||||
|
|
||||||
|
For redeemed positions, `shares_balance` and `entry_cost_usdc` track remaining
|
||||||
|
inventory, so both can read as zero after a winning Combo is redeemed. Use
|
||||||
|
`realized_payout_usdc` for gross redemption proceeds and `total_cost_usdc` for
|
||||||
|
original cost basis; net result is `realized_payout_usdc - total_cost_usdc`.
|
||||||
</Tab>
|
</Tab>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|
||||||
<Note>
|
### List Combo Activity
|
||||||
**Displaying closed (redeemed) positions.** `entry_cost_usdc` is the
|
|
||||||
*remaining* cost basis (`entry_avg_price × shares_balance`), so it reads `~0`
|
|
||||||
once a winning combo is redeemed — and `shares_balance` does too. Two fields
|
|
||||||
carry the closed-position economics instead:
|
|
||||||
|
|
||||||
* `realized_payout_usdc` — gross redemption proceeds (winning shares redeem
|
Use Combo activity when you need an audit trail for inventory-changing events,
|
||||||
1:1 at \$1; accumulates under `PARTIAL`)
|
including splits, merges, conversions, wraps, unwraps, and redeems. Use Combo
|
||||||
* `total_cost_usdc` — original cost basis, reconstructed as
|
positions for current inventory state.
|
||||||
`entry_avg_price × (shares_balance + realized_payout)`
|
|
||||||
|
|
||||||
Net result of a finished combo = `realized_payout_usdc − total_cost_usdc`.
|
<Tabs>
|
||||||
</Note>
|
<Tab title="TypeScript">
|
||||||
|
Use `client.listComboActivity(...)` to page through Combo lifecycle activity for
|
||||||
|
the authenticated account.
|
||||||
|
|
||||||
|
```ts theme={null}
|
||||||
|
import { ComboActivityType, type ComboActivity } from "@polymarket/client";
|
||||||
|
|
||||||
|
const activity = client.listComboActivity({ pageSize: 50 });
|
||||||
|
|
||||||
|
for await (const page of activity) {
|
||||||
|
for (const item of page.items) {
|
||||||
|
// item: ComboActivity
|
||||||
|
if (item.type === ComboActivityType.Redeem) {
|
||||||
|
console.log(item.positionId, item.payout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter to one or more Combos with `conditionId`.
|
||||||
|
|
||||||
|
```ts theme={null}
|
||||||
|
const activity = client.listComboActivity({
|
||||||
|
conditionId: ["<combo_condition_id_1>", "<combo_condition_id_2>"],
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Each returned item is a discriminated `ComboActivity` union. All lifecycle rows
|
||||||
|
share the base fields; redeem rows also include the redeemed position ID and
|
||||||
|
payout.
|
||||||
|
|
||||||
|
<CodeGroup>
|
||||||
|
```ts ComboActivity theme={null}
|
||||||
|
type ComboActivity =
|
||||||
|
| ComboSplitActivity
|
||||||
|
| ComboMergeActivity
|
||||||
|
| ComboConvertActivity
|
||||||
|
| ComboCompressActivity
|
||||||
|
| ComboWrapActivity
|
||||||
|
| ComboUnwrapActivity
|
||||||
|
| ComboRedeemActivity;
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts Split / Merge theme={null}
|
||||||
|
type ComboSplitActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Split;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type ComboMergeActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Merge;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts Convert / Compress theme={null}
|
||||||
|
type ComboConvertActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Convert;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type ComboCompressActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Compress;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts Wrap / Unwrap theme={null}
|
||||||
|
type ComboWrapActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Wrap;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type ComboUnwrapActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Unwrap;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts ComboRedeemActivity theme={null}
|
||||||
|
type ComboRedeemActivity = {
|
||||||
|
id: ComboActivityId;
|
||||||
|
type: ComboActivityType.Redeem;
|
||||||
|
wallet: Address;
|
||||||
|
conditionId: ComboConditionId;
|
||||||
|
moduleId: number;
|
||||||
|
amount: DecimalString | null;
|
||||||
|
timestamp: EpochMilliseconds;
|
||||||
|
transactionAt: IsoDateTimeString;
|
||||||
|
transactionHash: TxHash;
|
||||||
|
logIndex: number;
|
||||||
|
blockNumber: number;
|
||||||
|
legs: ComboPositionLeg[];
|
||||||
|
positionId: PositionId;
|
||||||
|
payout: DecimalString | null;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
</Tab>
|
||||||
|
|
||||||
|
<Tab title="Python">
|
||||||
|
Use `client.list_combo_activity(...)` to page through Combo lifecycle activity
|
||||||
|
for a wallet.
|
||||||
|
|
||||||
|
```python theme={null}
|
||||||
|
activity = client.list_combo_activity(
|
||||||
|
user="<maker_address>",
|
||||||
|
page_size=50,
|
||||||
|
)
|
||||||
|
|
||||||
|
for page in activity:
|
||||||
|
for item in page.items:
|
||||||
|
# item: ComboActivity
|
||||||
|
if item.type == "REDEEM":
|
||||||
|
print(item.position_id, item.payout)
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter to one or more Combos with `condition_id`.
|
||||||
|
|
||||||
|
```python theme={null}
|
||||||
|
activity = client.list_combo_activity(
|
||||||
|
user="<maker_address>",
|
||||||
|
condition_id=["<combo_condition_id_1>", "<combo_condition_id_2>"],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
The returned `ComboActivity` models use a `type` discriminator. All lifecycle
|
||||||
|
rows share the base fields; redeem rows also include the redeemed position ID
|
||||||
|
and payout.
|
||||||
|
|
||||||
|
<CodeGroup>
|
||||||
|
```python ComboActivity theme={null}
|
||||||
|
ComboActivity = (
|
||||||
|
ComboSplitActivity
|
||||||
|
| ComboMergeActivity
|
||||||
|
| ComboConvertActivity
|
||||||
|
| ComboCompressActivity
|
||||||
|
| ComboWrapActivity
|
||||||
|
| ComboUnwrapActivity
|
||||||
|
| ComboRedeemActivity
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python Split / Merge theme={null}
|
||||||
|
class ComboSplitActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["SPLIT"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
|
||||||
|
|
||||||
|
class ComboMergeActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["MERGE"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
```python Convert / Compress theme={null}
|
||||||
|
class ComboConvertActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["CONVERT"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
|
||||||
|
|
||||||
|
class ComboCompressActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["COMPRESS"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
```python Wrap / Unwrap theme={null}
|
||||||
|
class ComboWrapActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["WRAP"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
|
||||||
|
|
||||||
|
class ComboUnwrapActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["UNWRAP"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
```python ComboRedeemActivity theme={null}
|
||||||
|
class ComboRedeemActivity:
|
||||||
|
id: ComboActivityId
|
||||||
|
type: Literal["REDEEM"]
|
||||||
|
wallet: EvmAddress
|
||||||
|
condition_id: ComboConditionId
|
||||||
|
module_id: int
|
||||||
|
amount: Decimal | None
|
||||||
|
timestamp: datetime
|
||||||
|
transaction_at: datetime
|
||||||
|
transaction_hash: TransactionHash
|
||||||
|
log_index: int
|
||||||
|
block_number: int
|
||||||
|
legs: tuple[ComboPositionLeg, ...]
|
||||||
|
position_id: PositionId
|
||||||
|
payout: Decimal | None
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
</Tab>
|
||||||
|
|
||||||
|
<Tab title="API">
|
||||||
|
Use the Data API to list Combo lifecycle activity for a wallet.
|
||||||
|
|
||||||
|
```bash theme={null}
|
||||||
|
curl -G "https://data-api.polymarket.com/v1/activity/combos" \
|
||||||
|
--data-urlencode "user=<maker_address>" \
|
||||||
|
--data-urlencode "limit=50"
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter to specific Combos with `market_id`, which accepts comma-separated
|
||||||
|
`combo_condition_id` values.
|
||||||
|
|
||||||
|
```bash Filter by Combo theme={null}
|
||||||
|
curl -G "https://data-api.polymarket.com/v1/activity/combos" \
|
||||||
|
--data-urlencode "user=<maker_address>" \
|
||||||
|
--data-urlencode "market_id=<combo_condition_id_1>,<combo_condition_id_2>"
|
||||||
|
```
|
||||||
|
|
||||||
|
The response returns lifecycle events in `activity` and pagination metadata in
|
||||||
|
`pagination`.
|
||||||
|
|
||||||
|
```json theme={null}
|
||||||
|
{
|
||||||
|
"activity": [
|
||||||
|
{
|
||||||
|
"id": "<tx_hash>-<log_index>",
|
||||||
|
"event_kind": "PositionsSplit",
|
||||||
|
"side": "Split",
|
||||||
|
"module_kind": "Combinatorial",
|
||||||
|
"user_address": "<maker_address>",
|
||||||
|
"combo_condition_id": "<combo_condition_id>",
|
||||||
|
"combo_position_id": "<combo_position_id>",
|
||||||
|
"module_id": 3,
|
||||||
|
"amount_usdc": 10.0,
|
||||||
|
"payout_usdc": null,
|
||||||
|
"timestamp": 1783379945,
|
||||||
|
"tx_dttm": "2026-07-06T23:19:05Z",
|
||||||
|
"tx_hash": "<tx_hash>",
|
||||||
|
"log_index": 2409,
|
||||||
|
"block_number": 89783300,
|
||||||
|
"legs": [
|
||||||
|
{
|
||||||
|
"leg_index": 0,
|
||||||
|
"leg_position_id": "<leg_position_id_1>",
|
||||||
|
"leg_condition_id": "<ctf_condition_id_1>",
|
||||||
|
"leg_outcome_index": 0,
|
||||||
|
"leg_outcome_label": "Yes",
|
||||||
|
"leg_status": "OPEN",
|
||||||
|
"leg_resolved_at": null,
|
||||||
|
"leg_current_price": "0.52"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pagination": {
|
||||||
|
"limit": 50,
|
||||||
|
"offset": 0,
|
||||||
|
"has_more": true,
|
||||||
|
"next_cursor": "eyJsIjo1MCwibyI6NTB9"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `cursor` from `pagination.next_cursor` to fetch the next page. `cursor`
|
||||||
|
supersedes `offset`. A `null` cursor means there are no more pages.
|
||||||
|
|
||||||
|
```bash Cursor theme={null}
|
||||||
|
curl -G "https://data-api.polymarket.com/v1/activity/combos" \
|
||||||
|
--data-urlencode "user=<maker_address>" \
|
||||||
|
--data-urlencode "limit=50" \
|
||||||
|
--data-urlencode "cursor=<pagination.next_cursor>"
|
||||||
|
```
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
### Inventory Management
|
### Inventory Management
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Maker Rebates are funded by taker fees collected in eligible markets. A percenta
|
|||||||
| Category | Maker Rebate | Distribution Method |
|
| Category | Maker Rebate | Distribution Method |
|
||||||
| --------------- | ------------ | ------------------- |
|
| --------------- | ------------ | ------------------- |
|
||||||
| Crypto | 20% | Fee-curve weighted |
|
| Crypto | 20% | Fee-curve weighted |
|
||||||
| Sports | 25% | Fee-curve weighted |
|
| Sports | 15% | Fee-curve weighted |
|
||||||
| Finance | 25% | Fee-curve weighted |
|
| Finance | 25% | Fee-curve weighted |
|
||||||
| Politics | 25% | Fee-curve weighted |
|
| Politics | 25% | Fee-curve weighted |
|
||||||
| Economics | 25% | Fee-curve weighted |
|
| Economics | 25% | Fee-curve weighted |
|
||||||
@@ -72,7 +72,7 @@ Where **C** = number of shares traded and **p** = price of the shares. The fee p
|
|||||||
| Category | Taker Fee Rate | Maker Fee Rate |
|
| Category | Taker Fee Rate | Maker Fee Rate |
|
||||||
| --------------- | -------------- | -------------- |
|
| --------------- | -------------- | -------------- |
|
||||||
| Crypto | 0.07 | 0 |
|
| Crypto | 0.07 | 0 |
|
||||||
| Sports | 0.03 | 0 |
|
| Sports | 0.05 | 0 |
|
||||||
| Finance | 0.04 | 0 |
|
| Finance | 0.04 | 0 |
|
||||||
| Politics | 0.04 | 0 |
|
| Politics | 0.04 | 0 |
|
||||||
| Economics | 0.05 | 0 |
|
| Economics | 0.05 | 0 |
|
||||||
@@ -99,7 +99,7 @@ Taker fees are calculated in pUSD and vary based on the share price. The fee amo
|
|||||||
|
|
||||||
<Frame>
|
<Frame>
|
||||||
<div className="p-3 bg-white rounded-xl">
|
<div className="p-3 bg-white rounded-xl">
|
||||||
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-cY9H4" src="https://datawrapper.dwcdn.net/cY9H4/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-dJ74e" src="https://datawrapper.dwcdn.net/dJ74e/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
||||||
</div>
|
</div>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
|
|||||||
@@ -181,14 +181,14 @@ Auto-expire quotes before known events like market close or resolution:
|
|||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript TypeScript theme={null}
|
```typescript TypeScript theme={null}
|
||||||
// Expire in 1 hour
|
// Expire in 1 hour (+ 60s security threshold buffer)
|
||||||
const expiringOrder = await client.createAndPostOrder(
|
const expiringOrder = await client.createAndPostOrder(
|
||||||
{
|
{
|
||||||
tokenID,
|
tokenID,
|
||||||
side: Side.BUY,
|
side: Side.BUY,
|
||||||
price: 0.5,
|
price: 0.5,
|
||||||
size: 1000,
|
size: 1000,
|
||||||
expiration: Math.floor(Date.now() / 1000) + 3600,
|
expiration: Math.floor(Date.now() / 1000) + 60 + 3600,
|
||||||
},
|
},
|
||||||
undefined,
|
undefined,
|
||||||
OrderType.GTD,
|
OrderType.GTD,
|
||||||
@@ -200,14 +200,14 @@ Auto-expire quotes before known events like market close or resolution:
|
|||||||
from py_clob_client_v2 import OrderArgs, OrderType
|
from py_clob_client_v2 import OrderArgs, OrderType
|
||||||
from py_clob_client_v2.order_builder.constants import BUY
|
from py_clob_client_v2.order_builder.constants import BUY
|
||||||
|
|
||||||
# Expire in 1 hour
|
# Expire in 1 hour (+ 60s security threshold buffer)
|
||||||
expiring_order = client.create_and_post_order(
|
expiring_order = client.create_and_post_order(
|
||||||
OrderArgs(
|
OrderArgs(
|
||||||
token_id=token_id,
|
token_id=token_id,
|
||||||
side=BUY,
|
side=BUY,
|
||||||
price=0.50,
|
price=0.50,
|
||||||
size=1000,
|
size=1000,
|
||||||
expiration=int(time.time()) + 3600,
|
expiration=int(time.time()) + 60 + 3600,
|
||||||
),
|
),
|
||||||
order_type=OrderType.GTD,
|
order_type=OrderType.GTD,
|
||||||
)
|
)
|
||||||
@@ -217,14 +217,14 @@ Auto-expire quotes before known events like market close or resolution:
|
|||||||
use chrono::{TimeDelta, Utc};
|
use chrono::{TimeDelta, Utc};
|
||||||
use polymarket_client_sdk_v2::clob::types::OrderType;
|
use polymarket_client_sdk_v2::clob::types::OrderType;
|
||||||
|
|
||||||
// Expire in 1 hour
|
// Expire in 1 hour (+ 60s security threshold buffer)
|
||||||
let order = client.limit_order()
|
let order = client.limit_order()
|
||||||
.token_id(token_id)
|
.token_id(token_id)
|
||||||
.price(dec!(0.50))
|
.price(dec!(0.50))
|
||||||
.size(dec!(1000))
|
.size(dec!(1000))
|
||||||
.side(Side::Buy)
|
.side(Side::Buy)
|
||||||
.order_type(OrderType::GTD)
|
.order_type(OrderType::GTD)
|
||||||
.expiration(Utc::now() + TimeDelta::hours(1))
|
.expiration(Utc::now() + TimeDelta::minutes(1) + TimeDelta::hours(1))
|
||||||
.build().await?;
|
.build().await?;
|
||||||
let signed = client.sign(&signer, order).await?;
|
let signed = client.sign(&signer, order).await?;
|
||||||
client.post_order(signed).await?;
|
client.post_order(signed).await?;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ Where **C** = number of shares traded and **p** = price of the shares.
|
|||||||
| Category | Taker Fee Rate | Maker Fee Rate | Maker Rebate |
|
| Category | Taker Fee Rate | Maker Fee Rate | Maker Rebate |
|
||||||
| --------------- | -------------- | -------------- | ------------ |
|
| --------------- | -------------- | -------------- | ------------ |
|
||||||
| Crypto | 0.07 | 0 | 20% |
|
| Crypto | 0.07 | 0 | 20% |
|
||||||
| Sports | 0.03 | 0 | 25% |
|
| Sports | 0.05 | 0 | 15% |
|
||||||
| Finance | 0.04 | 0 | 25% |
|
| Finance | 0.04 | 0 | 25% |
|
||||||
| Politics | 0.04 | 0 | 25% |
|
| Politics | 0.04 | 0 | 25% |
|
||||||
| Economics | 0.05 | 0 | 25% |
|
| Economics | 0.05 | 0 | 25% |
|
||||||
@@ -48,7 +48,7 @@ Taker fees are calculated in USDC and vary based on the share price. The fee amo
|
|||||||
|
|
||||||
<Frame>
|
<Frame>
|
||||||
<div className="p-3 bg-white rounded-xl">
|
<div className="p-3 bg-white rounded-xl">
|
||||||
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-cY9H4" src="https://datawrapper.dwcdn.net/cY9H4/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-dJ74e" src="https://datawrapper.dwcdn.net/dJ74e/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
||||||
</div>
|
</div>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
@@ -86,29 +86,29 @@ Taker fees are calculated in USDC and vary based on the share price. The fee amo
|
|||||||
<Tab title="Sports">
|
<Tab title="Sports">
|
||||||
| Price | Trade Value | Taker Fee (USDC) |
|
| Price | Trade Value | Taker Fee (USDC) |
|
||||||
| ------ | ----------- | ---------------- |
|
| ------ | ----------- | ---------------- |
|
||||||
| \$0.01 | \$1 | \$0.03 |
|
| \$0.01 | \$1 | \$0.05 |
|
||||||
| \$0.05 | \$5 | \$0.14 |
|
| \$0.05 | \$5 | \$0.24 |
|
||||||
| \$0.10 | \$10 | \$0.27 |
|
| \$0.10 | \$10 | \$0.45 |
|
||||||
| \$0.15 | \$15 | \$0.38 |
|
| \$0.15 | \$15 | \$0.64 |
|
||||||
| \$0.20 | \$20 | \$0.48 |
|
| \$0.20 | \$20 | \$0.80 |
|
||||||
| \$0.25 | \$25 | \$0.56 |
|
| \$0.25 | \$25 | \$0.94 |
|
||||||
| \$0.30 | \$30 | \$0.63 |
|
| \$0.30 | \$30 | \$1.05 |
|
||||||
| \$0.35 | \$35 | \$0.68 |
|
| \$0.35 | \$35 | \$1.14 |
|
||||||
| \$0.40 | \$40 | \$0.72 |
|
| \$0.40 | \$40 | \$1.20 |
|
||||||
| \$0.45 | \$45 | \$0.74 |
|
| \$0.45 | \$45 | \$1.24 |
|
||||||
| \$0.50 | \$50 | \$0.75 |
|
| \$0.50 | \$50 | \$1.25 |
|
||||||
| \$0.55 | \$55 | \$0.74 |
|
| \$0.55 | \$55 | \$1.24 |
|
||||||
| \$0.60 | \$60 | \$0.72 |
|
| \$0.60 | \$60 | \$1.20 |
|
||||||
| \$0.65 | \$65 | \$0.68 |
|
| \$0.65 | \$65 | \$1.14 |
|
||||||
| \$0.70 | \$70 | \$0.63 |
|
| \$0.70 | \$70 | \$1.05 |
|
||||||
| \$0.75 | \$75 | \$0.56 |
|
| \$0.75 | \$75 | \$0.94 |
|
||||||
| \$0.80 | \$80 | \$0.48 |
|
| \$0.80 | \$80 | \$0.80 |
|
||||||
| \$0.85 | \$85 | \$0.38 |
|
| \$0.85 | \$85 | \$0.64 |
|
||||||
| \$0.90 | \$90 | \$0.27 |
|
| \$0.90 | \$90 | \$0.45 |
|
||||||
| \$0.95 | \$95 | \$0.14 |
|
| \$0.95 | \$95 | \$0.24 |
|
||||||
| \$0.99 | \$99 | \$0.03 |
|
| \$0.99 | \$99 | \$0.05 |
|
||||||
|
|
||||||
The fee in USDC **peaks at 50%** probability (\$0.75) and decreases symmetrically toward both extremes.
|
The fee in USDC **peaks at 50%** probability (\$1.25) and decreases symmetrically toward both extremes.
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab title="Finance / Politics / Mentions / Tech">
|
<Tab title="Finance / Politics / Mentions / Tech">
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Maker Rebates are funded by taker fees collected in eligible markets. A percenta
|
|||||||
| Category | Maker Rebate | Distribution Method |
|
| Category | Maker Rebate | Distribution Method |
|
||||||
| --------------- | ------------ | ------------------- |
|
| --------------- | ------------ | ------------------- |
|
||||||
| Crypto | 20% | Fee-curve weighted |
|
| Crypto | 20% | Fee-curve weighted |
|
||||||
| Sports | 25% | Fee-curve weighted |
|
| Sports | 15% | Fee-curve weighted |
|
||||||
| Finance | 25% | Fee-curve weighted |
|
| Finance | 25% | Fee-curve weighted |
|
||||||
| Politics | 25% | Fee-curve weighted |
|
| Politics | 25% | Fee-curve weighted |
|
||||||
| Economics | 25% | Fee-curve weighted |
|
| Economics | 25% | Fee-curve weighted |
|
||||||
@@ -72,7 +72,7 @@ Where **C** = number of shares traded and **p** = price of the shares. The fee p
|
|||||||
| Category | Taker Fee Rate | Maker Fee Rate |
|
| Category | Taker Fee Rate | Maker Fee Rate |
|
||||||
| --------------- | -------------- | -------------- |
|
| --------------- | -------------- | -------------- |
|
||||||
| Crypto | 0.07 | 0 |
|
| Crypto | 0.07 | 0 |
|
||||||
| Sports | 0.03 | 0 |
|
| Sports | 0.05 | 0 |
|
||||||
| Finance | 0.04 | 0 |
|
| Finance | 0.04 | 0 |
|
||||||
| Politics | 0.04 | 0 |
|
| Politics | 0.04 | 0 |
|
||||||
| Economics | 0.05 | 0 |
|
| Economics | 0.05 | 0 |
|
||||||
@@ -99,7 +99,7 @@ Taker fees are calculated in pUSD and vary based on the share price. The fee amo
|
|||||||
|
|
||||||
<Frame>
|
<Frame>
|
||||||
<div className="p-3 bg-white rounded-xl">
|
<div className="p-3 bg-white rounded-xl">
|
||||||
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-cY9H4" src="https://datawrapper.dwcdn.net/cY9H4/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-dJ74e" src="https://datawrapper.dwcdn.net/dJ74e/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
||||||
</div>
|
</div>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
|
|||||||
+24
-24
@@ -33,7 +33,7 @@ Where **C** = number of shares traded and **p** = price of the shares.
|
|||||||
| Category | Taker Fee Rate | Maker Fee Rate | Maker Rebate |
|
| Category | Taker Fee Rate | Maker Fee Rate | Maker Rebate |
|
||||||
| --------------- | -------------- | -------------- | ------------ |
|
| --------------- | -------------- | -------------- | ------------ |
|
||||||
| Crypto | 0.07 | 0 | 20% |
|
| Crypto | 0.07 | 0 | 20% |
|
||||||
| Sports | 0.03 | 0 | 25% |
|
| Sports | 0.05 | 0 | 15% |
|
||||||
| Finance | 0.04 | 0 | 25% |
|
| Finance | 0.04 | 0 | 25% |
|
||||||
| Politics | 0.04 | 0 | 25% |
|
| Politics | 0.04 | 0 | 25% |
|
||||||
| Economics | 0.05 | 0 | 25% |
|
| Economics | 0.05 | 0 | 25% |
|
||||||
@@ -48,7 +48,7 @@ Taker fees are calculated in USDC and vary based on the share price. The fee amo
|
|||||||
|
|
||||||
<Frame>
|
<Frame>
|
||||||
<div className="p-3 bg-white rounded-xl">
|
<div className="p-3 bg-white rounded-xl">
|
||||||
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-cY9H4" src="https://datawrapper.dwcdn.net/cY9H4/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
<iframe title="Fee Curves" aria-label="Line chart" id="datawrapper-chart-dJ74e" src="https://datawrapper.dwcdn.net/dJ74e/" scrolling="no" frameborder="0" width={700} style={{ width: "0", minWidth: "100% !important", border: "none" }} height="450" data-external="1" />
|
||||||
</div>
|
</div>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
@@ -86,29 +86,29 @@ Taker fees are calculated in USDC and vary based on the share price. The fee amo
|
|||||||
<Tab title="Sports">
|
<Tab title="Sports">
|
||||||
| Price | Trade Value | Taker Fee (USDC) |
|
| Price | Trade Value | Taker Fee (USDC) |
|
||||||
| ------ | ----------- | ---------------- |
|
| ------ | ----------- | ---------------- |
|
||||||
| \$0.01 | \$1 | \$0.03 |
|
| \$0.01 | \$1 | \$0.05 |
|
||||||
| \$0.05 | \$5 | \$0.14 |
|
| \$0.05 | \$5 | \$0.24 |
|
||||||
| \$0.10 | \$10 | \$0.27 |
|
| \$0.10 | \$10 | \$0.45 |
|
||||||
| \$0.15 | \$15 | \$0.38 |
|
| \$0.15 | \$15 | \$0.64 |
|
||||||
| \$0.20 | \$20 | \$0.48 |
|
| \$0.20 | \$20 | \$0.80 |
|
||||||
| \$0.25 | \$25 | \$0.56 |
|
| \$0.25 | \$25 | \$0.94 |
|
||||||
| \$0.30 | \$30 | \$0.63 |
|
| \$0.30 | \$30 | \$1.05 |
|
||||||
| \$0.35 | \$35 | \$0.68 |
|
| \$0.35 | \$35 | \$1.14 |
|
||||||
| \$0.40 | \$40 | \$0.72 |
|
| \$0.40 | \$40 | \$1.20 |
|
||||||
| \$0.45 | \$45 | \$0.74 |
|
| \$0.45 | \$45 | \$1.24 |
|
||||||
| \$0.50 | \$50 | \$0.75 |
|
| \$0.50 | \$50 | \$1.25 |
|
||||||
| \$0.55 | \$55 | \$0.74 |
|
| \$0.55 | \$55 | \$1.24 |
|
||||||
| \$0.60 | \$60 | \$0.72 |
|
| \$0.60 | \$60 | \$1.20 |
|
||||||
| \$0.65 | \$65 | \$0.68 |
|
| \$0.65 | \$65 | \$1.14 |
|
||||||
| \$0.70 | \$70 | \$0.63 |
|
| \$0.70 | \$70 | \$1.05 |
|
||||||
| \$0.75 | \$75 | \$0.56 |
|
| \$0.75 | \$75 | \$0.94 |
|
||||||
| \$0.80 | \$80 | \$0.48 |
|
| \$0.80 | \$80 | \$0.80 |
|
||||||
| \$0.85 | \$85 | \$0.38 |
|
| \$0.85 | \$85 | \$0.64 |
|
||||||
| \$0.90 | \$90 | \$0.27 |
|
| \$0.90 | \$90 | \$0.45 |
|
||||||
| \$0.95 | \$95 | \$0.14 |
|
| \$0.95 | \$95 | \$0.24 |
|
||||||
| \$0.99 | \$99 | \$0.03 |
|
| \$0.99 | \$99 | \$0.05 |
|
||||||
|
|
||||||
The fee in USDC **peaks at 50%** probability (\$0.75) and decreases symmetrically toward both extremes.
|
The fee in USDC **peaks at 50%** probability (\$1.25) and decreases symmetrically toward both extremes.
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab title="Finance / Politics / Mentions / Tech">
|
<Tab title="Finance / Politics / Mentions / Tech">
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
.size(dec!(10))
|
.size(dec!(10))
|
||||||
.side(Side::Buy)
|
.side(Side::Buy)
|
||||||
.order_type(OrderType::GTD)
|
.order_type(OrderType::GTD)
|
||||||
.expiration(Utc::now() + TimeDelta::hours(1))
|
.expiration(Utc::now() + TimeDelta::minutes(1) + TimeDelta::hours(1))
|
||||||
.build()
|
.build()
|
||||||
.await?;
|
.await?;
|
||||||
let signed = client.sign(&signer, order).await?;
|
let signed = client.sign(&signer, order).await?;
|
||||||
@@ -217,9 +217,11 @@ GTD orders auto-expire at a specified time. Useful for quoting around known even
|
|||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
There is a security threshold of one minute on GTD expiration. To set an
|
GTD orders expire one minute before their stated expiration as a security
|
||||||
effective lifetime of N seconds, use `now + 60 + N`. For example, for a
|
threshold. To set an effective lifetime of N seconds, use `now + 60 + N`.
|
||||||
30-second effective lifetime, set the expiration to `now + 60 + 30`.
|
In addition, the expiration must be at least three minutes in the future —
|
||||||
|
orders expiring sooner are rejected — so the minimum effective lifetime is
|
||||||
|
about two minutes.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|||||||
@@ -33,9 +33,10 @@ The underlying order primitive is structured, hashed, and signed using the [EIP-
|
|||||||
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
* **GTC** and **GTD** are limit order types — they rest on the book at your specified price.
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
**GTD expiration**: There is a security threshold of one minute. If you need
|
**GTD expiration**: Orders expire one minute before their stated expiration
|
||||||
the order to expire in 90 seconds, the correct expiration value is `now + 1
|
as a security threshold, and the expiration must be at least three minutes
|
||||||
minute + 30 seconds`.
|
in the future. For a 5-minute effective lifetime, the correct expiration
|
||||||
|
value is `now + 1 minute + 5 minutes`.
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
### Post-Only Orders
|
### Post-Only Orders
|
||||||
|
|||||||
Reference in New Issue
Block a user