docs: daily sync Polymarket docs 2026-06-17 - add 6 new doc pages

Added new API documentation discovered via llms.txt:
- Combo Markets: get-combo-markets.md (Combinatorial RFQ API)
- Core: get-user-combo-activity.md, get-user-combo-positions.md
- Maker (RFQ): cancel-a-quote.md, confirm-or-decline-last-look.md, submit-a-quote.md

Updated TARGET.md with new section for Combo Markets, Core (Combo), and Maker (RFQ) endpoints.
This commit is contained in:
GLaDOS
2026-06-17 14:12:02 +02:00
parent 72269f5586
commit 7f24037d5e
7 changed files with 2409 additions and 0 deletions
@@ -0,0 +1,213 @@
# Get combo markets
> Returns active markets that can be used as combo legs, ordered by volume
descending. This endpoint is public and does not require CLOB
authentication.
Entries in `position_ids`, `outcomes`, and `outcome_prices` correspond by
array index (`[0]` is YES, `[1]` is NO). Use `next_cursor` unchanged in
the next request; a value of `null` indicates the final page.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml get /v1/rfq/combo-markets
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/rfq/combo-markets:
get:
tags:
- Combo Markets
summary: Get combo markets
description: >
Returns active markets that can be used as combo legs, ordered by volume
descending. This endpoint is public and does not require CLOB
authentication.
Entries in `position_ids`, `outcomes`, and `outcome_prices` correspond
by
array index (`[0]` is YES, `[1]` is NO). Use `next_cursor` unchanged in
the next request; a value of `null` indicates the final page.
operationId: getComboMarkets
parameters:
- name: limit
in: query
required: false
description: Number of markets to return. Defaults to `50`; maximum `100`.
schema:
type: integer
minimum: 1
maximum: 100
default: 50
- name: cursor
in: query
required: false
description: Opaque cursor returned as `next_cursor` by the previous response.
schema:
type: string
- name: exclude
in: query
required: false
description: >-
Comma-separated condition IDs to omit, such as markets already
shown.
schema:
type: string
example: 0x4cd7...110ff,0x0391ab0e...
responses:
'200':
description: Catalog page of combo-able markets
content:
application/json:
schema:
$ref: '#/components/schemas/ComboMarketsResponse'
example:
markets:
- id: '1897034'
condition_id: 0x4cd7...110ff
position_ids:
- 1012585...362880
- 1012585...362881
slug: fifwc-mex-rsa-2026-06-11-mex
title: Will Mexico win on 2026-06-11?
outcomes:
- 'Yes'
- 'No'
outcome_prices:
- '0.685'
- '0.315'
image: https://...
volume: 330327.7128580074
tags:
- sports
- soccer
- games
- world-cup
next_cursor: Mg
'400':
$ref: '#/components/responses/BadRequest'
security: []
components:
schemas:
ComboMarketsResponse:
type: object
properties:
markets:
type: array
items:
$ref: '#/components/schemas/ComboMarket'
next_cursor:
type:
- string
- 'null'
description: Cursor for the next page, or `null` on the final page.
required:
- markets
- next_cursor
ComboMarket:
type: object
properties:
id:
type: string
condition_id:
type: string
position_ids:
type: array
description: Combo position IDs; `[0]` is YES, `[1]` is NO.
items:
type: string
slug:
type: string
title:
type: string
outcomes:
type: array
items:
type: string
outcome_prices:
type: array
items:
type: string
image:
type: string
volume:
type: number
format: double
tags:
type: array
items:
type: string
required:
- id
- condition_id
- position_ids
- slug
- title
- outcomes
- outcome_prices
- image
- volume
- tags
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
````
@@ -0,0 +1,263 @@
# Get user combo activity
> Combo lifecycle and redeem events (split / merge / convert / compress / wrap / unwrap / redeem) for a user, with per-leg breakdown. The combo counterpart to /activity trade rows. Also available at /v1/data/user/{address}/activity/combos (address from the path).
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/activity/combos
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/activity/combos:
get:
tags:
- Core
summary: Get user combo activity
description: >-
Combo lifecycle and redeem events (split / merge / convert / compress /
wrap / unwrap / redeem) for a user, with per-leg breakdown. The combo
counterpart to /activity trade rows. Also available at
/v1/data/user/{address}/activity/combos (address from the path).
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: market_id
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/ComboConditionId'
description: >-
Comma-separated combo_condition_id values to filter to specific
combos. These equal the market_id of isCombo rows on /activity. Omit
for all of the user's combo activity.
- in: query
name: limit
schema:
type: integer
default: 50
minimum: 0
maximum: 500
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/CombosActivityResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
ComboConditionId:
type: string
description: >-
Combo condition ID (0x-prefixed, 62 hex chars / bytes31). Equals the
market_id (unified) / conditionId (legacy) of isCombo rows on /activity.
pattern: ^0x[a-fA-F0-9]{62}$
example: '0x0391ab0ebea17b65ba87e071b0566e816b0000000000000000000000000000'
CombosActivityResponse:
type: object
properties:
activity:
type: array
items:
$ref: '#/components/schemas/ComboActivity'
pagination:
$ref: '#/components/schemas/Pagination'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
ComboActivity:
type: object
properties:
id:
type: string
event_kind:
type: string
description: >-
Raw on-chain event, e.g. PositionsSplit, PositionsMerged,
PositionRedeemed.
side:
type: string
description: Normalized label for rendering.
enum:
- Split
- Merge
- Convert
- Compress
- Wrap
- Unwrap
- Redeem
module_kind:
type: string
description: Always Combinatorial.
user_address:
$ref: '#/components/schemas/Address'
combo_condition_id:
$ref: '#/components/schemas/ComboConditionId'
combo_position_id:
type: string
module_id:
type: integer
amount_usdc:
type: number
nullable: true
description: Lifecycle amount; null on redeems.
payout_usdc:
type: number
nullable: true
description: Redeem payout; null on lifecycle events.
timestamp:
type: integer
format: int64
tx_dttm:
type: string
description: RFC3339 UTC
tx_hash:
type: string
log_index:
type: integer
block_number:
type: integer
format: int64
legs:
type: array
items:
$ref: '#/components/schemas/ComboLeg'
Pagination:
type: object
description: >-
Standard pagination metadata. No total count; has_more is derived from
page fullness. next_cursor is opaque.
properties:
limit:
type: integer
offset:
type: integer
has_more:
type: boolean
next_cursor:
type: string
nullable: true
description: Opaque cursor for the next page; null when has_more is false.
ComboLeg:
type: object
properties:
leg_index:
type: integer
leg_position_id:
type: string
leg_condition_id:
type: string
description: The leg market's condition ID (distinct from the combo's).
leg_outcome_index:
type: integer
leg_outcome_label:
type: string
leg_status:
type: string
description: Placeholder (OPEN) until leg-resolution integration ships.
leg_resolved_at:
type: string
nullable: true
leg_current_price:
type: string
description: Placeholder ("0") until live-price integration ships.
market:
$ref: '#/components/schemas/ComboMarket'
ComboMarket:
type: object
properties:
market_id:
type: string
slug:
type: string
title:
type: string
outcome:
type: string
image_url:
type: string
icon_url:
type: string
category:
type: string
subcategory:
type: string
tags:
type: array
items:
type: string
end_date:
type: string
description: RFC3339 UTC
event:
$ref: '#/components/schemas/ComboEvent'
ComboEvent:
type: object
properties:
event_id:
type: string
event_slug:
type: string
event_title:
type: string
event_image:
type: string
````
@@ -0,0 +1,283 @@
# Get user combo positions
> Combinatorial (multi-market) positions held by a user, with per-leg breakdown. Also available at /v1/data/user/{address}/positions/combos (address from the path).
## OpenAPI
````yaml /api-spec/data-openapi.yaml get /v1/positions/combos
openapi: 3.0.3
info:
title: Polymarket Data API
version: 1.0.0
description: >
HTTP API for Polymarket data. This specification documents all public
routes.
servers:
- url: https://data-api.polymarket.com
description: Relative server (same host)
security: []
tags:
- name: Data API Status
description: Data API health check
- name: Core
- name: Builders
- name: Misc
paths:
/v1/positions/combos:
get:
tags:
- Core
summary: Get user combo positions
description: >-
Combinatorial (multi-market) positions held by a user, with per-leg
breakdown. Also available at /v1/data/user/{address}/positions/combos
(address from the path).
parameters:
- in: query
name: user
required: true
schema:
$ref: '#/components/schemas/Address'
- in: query
name: status
schema:
type: string
enum:
- OPEN
- PARTIAL
- RESOLVED_WIN
- RESOLVED_LOSS
- in: query
name: sort
schema:
type: string
enum:
- current_value_desc
- first_entry_desc
- entry_cost_desc
- resolved_at_desc
default: current_value_desc
- in: query
name: market_id
style: form
explode: false
schema:
type: array
items:
$ref: '#/components/schemas/ComboConditionId'
description: >-
Comma-separated combo_condition_id values to filter to specific
combos. These equal the market_id of isCombo rows on /activity. Omit
for all of the user's combos.
- in: query
name: limit
schema:
type: integer
default: 20
minimum: 0
maximum: 100
- in: query
name: offset
schema:
type: integer
default: 0
minimum: 0
maximum: 10000
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/CombosResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
Address:
type: string
description: User Profile Address (0x-prefixed, 40 hex chars)
pattern: ^0x[a-fA-F0-9]{40}$
example: '0x56687bf447db6ffa42ffe2204a05edaa20f55839'
ComboConditionId:
type: string
description: >-
Combo condition ID (0x-prefixed, 62 hex chars / bytes31). Equals the
market_id (unified) / conditionId (legacy) of isCombo rows on /activity.
pattern: ^0x[a-fA-F0-9]{62}$
example: '0x0391ab0ebea17b65ba87e071b0566e816b0000000000000000000000000000'
CombosResponse:
type: object
properties:
combos:
type: array
items:
$ref: '#/components/schemas/ComboPosition'
pagination:
$ref: '#/components/schemas/Pagination'
ErrorResponse:
type: object
properties:
error:
type: string
required:
- error
ComboPosition:
type: object
properties:
combo_condition_id:
$ref: '#/components/schemas/ComboConditionId'
combo_position_id:
type: string
module_id:
type: integer
description: 3 = Combinatorial
user_address:
$ref: '#/components/schemas/Address'
shares_balance:
type: string
description: Decimal string (precision-preserving).
entry_avg_price_usdc:
type: string
entry_cost_usdc:
type: string
description: >-
REMAINING cost basis (entry_avg_price × shares_balance). Reads ~0
after a winning combo is redeemed — use total_cost_usdc to display
what was paid on closed positions.
realized_payout_usdc:
type: string
description: >-
Gross redemption proceeds (winning combo shares redeem 1:1 at $1).
"0.00" while OPEN / unredeemed / RESOLVED_LOSS; accumulates under
PARTIAL. Gross payout, not net PnL — net = realized_payout_usdc
total_cost_usdc.
total_cost_usdc:
type: string
description: >-
Original cost basis = entry_avg_price × (shares_balance +
realized_payout). Survives redemption burning the shares; equals
entry_cost_usdc while OPEN.
status:
type: string
enum:
- OPEN
- PARTIAL
- RESOLVED_WIN
- RESOLVED_LOSS
first_entry_at:
type: string
description: RFC3339 UTC
resolved_at:
type: string
nullable: true
legs_total:
type: integer
legs_resolved:
type: integer
legs_pending:
type: integer
legs:
type: array
items:
$ref: '#/components/schemas/ComboLeg'
Pagination:
type: object
description: >-
Standard pagination metadata. No total count; has_more is derived from
page fullness. next_cursor is opaque.
properties:
limit:
type: integer
offset:
type: integer
has_more:
type: boolean
next_cursor:
type: string
nullable: true
description: Opaque cursor for the next page; null when has_more is false.
ComboLeg:
type: object
properties:
leg_index:
type: integer
leg_position_id:
type: string
leg_condition_id:
type: string
description: The leg market's condition ID (distinct from the combo's).
leg_outcome_index:
type: integer
leg_outcome_label:
type: string
leg_status:
type: string
description: Placeholder (OPEN) until leg-resolution integration ships.
leg_resolved_at:
type: string
nullable: true
leg_current_price:
type: string
description: Placeholder ("0") until live-price integration ships.
market:
$ref: '#/components/schemas/ComboMarket'
ComboMarket:
type: object
properties:
market_id:
type: string
slug:
type: string
title:
type: string
outcome:
type: string
image_url:
type: string
icon_url:
type: string
category:
type: string
subcategory:
type: string
tags:
type: array
items:
type: string
end_date:
type: string
description: RFC3339 UTC
event:
$ref: '#/components/schemas/ComboEvent'
ComboEvent:
type: object
properties:
event_id:
type: string
event_slug:
type: string
event_title:
type: string
event_image:
type: string
````
+430
View File
@@ -0,0 +1,430 @@
# Cancel a quote
> Cancel an active maker quote before it is selected. Requires CLOB L2
authentication for the maker role. `signer_address` and `maker_address`
must match the authenticated identity.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/quotes/cancel
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/quotes/cancel:
post:
tags:
- Maker
summary: Cancel a quote
description: |
Cancel an active maker quote before it is selected. Requires CLOB L2
authentication for the maker role. `signer_address` and `maker_address`
must match the authenticated identity.
operationId: cancelMakerQuote
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CancelQuoteRequest'
example:
rfq_id: rfq_<id>
quote_id: quote_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
responses:
'200':
description: Current RFQ snapshot after the cancellation was applied
content:
application/json:
schema:
$ref: '#/components/schemas/RFQSnapshot'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
CancelQuoteRequest:
type: object
properties:
rfq_id:
type: string
example: rfq_<id>
quote_id:
type: string
example: quote_<id>
signer_address:
type: string
description: Must match the authenticated `signer_address`.
example: 0xYourSigner
maker_address:
type: string
description: Must match the authenticated `maker_address`.
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
required:
- rfq_id
- quote_id
- signer_address
- maker_address
- signature_type
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a String.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````
@@ -0,0 +1,663 @@
# Confirm or decline last look
> Respond to a last-look confirmation request for a selected quote. Requires
CLOB L2 authentication for the maker role. `decision` must be `CONFIRM` or
`DECLINE`.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/confirmations
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/confirmations:
post:
tags:
- Maker
summary: Confirm or decline last look
description: >
Respond to a last-look confirmation request for a selected quote.
Requires
CLOB L2 authentication for the maker role. `decision` must be `CONFIRM`
or
`DECLINE`.
operationId: submitMakerConfirmation
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/MakerConfirmationRequest'
example:
rfq_id: rfq_<id>
quote_id: quote_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
decision: CONFIRM
responses:
'200':
description: Result of the confirmation — a snapshot and/or an execution handoff
content:
application/json:
schema:
$ref: '#/components/schemas/MakerConfirmationResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
MakerConfirmationRequest:
type: object
description: Maker last-look confirmation response.
properties:
rfq_id:
type: string
example: rfq_<id>
quote_id:
type: string
example: quote_<id>
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
decision:
type: string
description: Confirmation decision.
enum:
- CONFIRM
- DECLINE
required:
- rfq_id
- quote_id
- signer_address
- maker_address
- signature_type
- decision
MakerConfirmationResult:
type: object
description: >-
Result of a maker confirmation. Includes a snapshot, an execution
handoff,
or both, depending on whether the confirmation completed the bundle.
properties:
snapshot:
$ref: '#/components/schemas/RFQSnapshot'
execution:
$ref: '#/components/schemas/ExecutionHandoff'
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
ExecutionHandoff:
type: object
description: Handoff produced when a confirmed RFQ is ready for onchain execution.
properties:
execution_id:
type: string
request:
$ref: '#/components/schemas/RFQRequest'
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
requester_acceptance:
$ref: '#/components/schemas/RequesterAcceptance'
maker_quotes:
type: array
items:
$ref: '#/components/schemas/Quote'
reservations:
type: array
items:
$ref: '#/components/schemas/WalletReservation'
ready_at:
type: integer
format: int64
description: Unix milliseconds.
required:
- execution_id
- request
- quote_id
- bundle
- requester_acceptance
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
RequesterAcceptance:
type: object
properties:
rfq_id:
type: string
quote_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
accepted_at:
type: integer
format: int64
description: Unix milliseconds.
required:
- rfq_id
- quote_id
- signed_order
Quote:
type: object
description: A signed maker quote.
properties:
quote_id:
type: string
description: Maker-generated quote ID (required for REST submissions).
example: quote_<id>
rfq_id:
type: string
description: RFQ ID from the `RFQ_REQUEST`.
example: rfq_<id>
auth_address:
type: string
description: Derived from the authenticated session; ignored if provided.
readOnly: true
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
price_e6:
type: string
description: Quote price in six-decimal fixed-point units (must be positive).
example: '450000'
size_e6:
type: string
description: >-
Fillable share count in six-decimal fixed-point units (must be
positive.
Note this differs from the request's size field, which may be
notional or shares.
example: '1000000'
valid_until:
type: integer
format: int64
description: Optional quote expiry in Unix milliseconds.
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
received_at:
type: integer
format: int64
description: Server-assigned receipt time in Unix milliseconds.
readOnly: true
required:
- quote_id
- rfq_id
- signer_address
- maker_address
- signature_type
- price_e6
- size_e6
- signed_order
WalletReservation:
type: object
properties:
action_id:
type: string
user:
type: string
wallet_nonce:
type: integer
format: int64
deltas:
type: array
items:
$ref: '#/components/schemas/WalletAssetDelta'
required:
- action_id
- user
- wallet_nonce
- deltas
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a string.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
ExchangeV3Order:
type: object
description: >-
Signed Exchange v3 order. Combinatorial RFQ trades settle through
Exchange v3.
properties:
salt:
type: string
description: Order salt (uint256 as a decimal string)
maker:
type: string
description: Wallet that funds the order
example: 0xYourQuoterWallet
signer:
type: string
description: Address that signs the order
example: 0xYourSigner
tokenId:
type: string
description: YES or NO combo position ID (uint256 as a decimal string)
makerAmount:
type: string
description: >-
Amount the maker pays, in six-decimal base units (uint256 as a
string)
takerAmount:
type: string
description: >-
Amount the maker receives, in six-decimal base units (uint256 as a
string)
side:
type: integer
description: Order side — `0` BUY, `1` SELL
enum:
- 0
- 1
signatureType:
$ref: '#/components/schemas/SignatureType'
timestamp:
type: string
description: Order timestamp in Unix seconds (as a string)
metadata:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
builder:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
signature:
type: string
description: EIP-712 signature over the order
example: 0x...
required:
- salt
- maker
- signer
- tokenId
- makerAmount
- takerAmount
- side
- signatureType
- timestamp
- signature
WalletAssetDelta:
type: object
properties:
asset:
type: string
asset_id:
type: string
amount:
type: string
required:
- asset
- asset_id
- amount
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````
+545
View File
@@ -0,0 +1,545 @@
# Submit a quote
> Submit a signed maker quote for an active RFQ. Requires CLOB L2
authentication for the maker role.
REST does not assign a quote ID — generate `quote_id` client-side.
## OpenAPI
````yaml /api-spec/combos-rfq-openapi.yaml post /v1/maker/quotes
openapi: 3.1.0
info:
title: Polymarket Combinatorial RFQ API
description: >
REST API for the combinatorial RFQ (Request for Quote) system.
This spec covers the publicly documented endpoints used by quoters (market
makers): the combo-market catalog and the authenticated maker commands for
submitting, cancelling, and confirming quotes.
Conventions:
- All `*_e6` fields are six-decimal fixed-point values encoded as
**strings**
to avoid number precision issues.
- All timestamps are **Unix milliseconds** (integer); zero/omitted means
unset.
- Errors return an HTTP status code with a body of the form `{ "error":
"..." }`.
license:
name: MIT
identifier: MIT
version: 1.0.0
servers:
- url: https://combos-rfq-api.polymarket.com
description: Production combinatorial RFQ API
security: []
tags:
- name: Combo Markets
description: Public catalog of markets that can be used as combo legs
- name: Maker
description: Authenticated quoter (maker) commands
paths:
/v1/maker/quotes:
post:
tags:
- Maker
summary: Submit a quote
description: |
Submit a signed maker quote for an active RFQ. Requires CLOB L2
authentication for the maker role.
REST does not assign a quote ID — generate `quote_id` client-side.
operationId: submitMakerQuote
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Quote'
example:
quote_id: quote_<id>
rfq_id: rfq_<id>
signer_address: 0xYourSigner
maker_address: 0xYourQuoterWallet
signature_type: 0
price_e6: '450000'
size_e6: '1000000'
signed_order:
salt: <order_salt>
maker: 0xYourQuoterWallet
signer: 0xYourSigner
tokenId: <yes_or_no_position_id>
makerAmount: <amount_to_pay>
takerAmount: <taker_amount>
side: 0
signatureType: 0
timestamp: <unix_seconds>
metadata: >-
0x0000000000000000000000000000000000000000000000000000000000000000
builder: >-
0x0000000000000000000000000000000000000000000000000000000000000000
signature: 0x...
responses:
'200':
description: Current RFQ snapshot after the quote was accepted
content:
application/json:
schema:
$ref: '#/components/schemas/RFQSnapshot'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/TooManyRequests'
'503':
$ref: '#/components/responses/ServiceUnavailable'
security:
- polyApiKey: []
polyAddress: []
polySignature: []
polyPassphrase: []
polyTimestamp: []
components:
schemas:
Quote:
type: object
description: A signed maker quote.
properties:
quote_id:
type: string
description: Maker-generated quote ID (required for REST submissions).
example: quote_<id>
rfq_id:
type: string
description: RFQ ID from the `RFQ_REQUEST`.
example: rfq_<id>
auth_address:
type: string
description: Derived from the authenticated session; ignored if provided.
readOnly: true
signer_address:
type: string
example: 0xYourSigner
maker_address:
type: string
example: 0xYourQuoterWallet
signature_type:
$ref: '#/components/schemas/SignatureType'
price_e6:
type: string
description: Quote price in six-decimal fixed-point units (must be positive).
example: '450000'
size_e6:
type: string
description: >-
Fillable share count in six-decimal fixed-point units (must be
positive.
Note this differs from the request's size field, which may be
notional or shares.
example: '1000000'
valid_until:
type: integer
format: int64
description: Optional quote expiry in Unix milliseconds.
signed_order:
$ref: '#/components/schemas/ExchangeV3Order'
received_at:
type: integer
format: int64
description: Server-assigned receipt time in Unix milliseconds.
readOnly: true
required:
- quote_id
- rfq_id
- signer_address
- maker_address
- signature_type
- price_e6
- size_e6
- signed_order
RFQSnapshot:
type: object
description: Point-in-time view of an RFQ and its competition/confirmation windows.
properties:
request:
$ref: '#/components/schemas/RFQRequest'
status:
$ref: '#/components/schemas/RFQStatus'
competition_started_at:
type: integer
format: int64
description: Unix milliseconds.
competition_ends_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_started_at:
type: integer
format: int64
description: Unix milliseconds.
confirmation_ends_at:
type: integer
format: int64
description: Unix milliseconds.
quote_id:
type: string
bundle:
$ref: '#/components/schemas/FillBundle'
maker_confirmations:
type: array
items:
$ref: '#/components/schemas/MakerConfirmationSnapshot'
required:
- request
- status
SignatureType:
type: integer
description: |
CLOB signature type:
- `0` EOA
- `1` POLY_PROXY
- `2` GNOSIS_SAFE
- `3` POLY_1271
enum:
- 0
- 1
- 2
- 3
example: 0
ExchangeV3Order:
type: object
description: >-
Signed Exchange v3 order. Combinatorial RFQ trades settle through
Exchange v3.
properties:
salt:
type: string
description: Order salt (uint256 as a decimal string)
maker:
type: string
description: Wallet that funds the order
example: 0xYourQuoterWallet
signer:
type: string
description: Address that signs the order
example: 0xYourSigner
tokenId:
type: string
description: YES or NO combo position ID (uint256 as a decimal string)
makerAmount:
type: string
description: >-
Amount the maker pays, in six-decimal base units (uint256 as a
string)
takerAmount:
type: string
description: >-
Amount the maker receives, in six-decimal base units (uint256 as a
string)
side:
type: integer
description: Order side — `0` BUY, `1` SELL
enum:
- 0
- 1
signatureType:
$ref: '#/components/schemas/SignatureType'
timestamp:
type: string
description: Order timestamp in Unix seconds (as a string)
metadata:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
builder:
type: string
description: 32-byte hex field; defaults to the zero value
example: '0x0000000000000000000000000000000000000000000000000000000000000000'
signature:
type: string
description: EIP-712 signature over the order
example: 0x...
required:
- salt
- maker
- signer
- tokenId
- makerAmount
- takerAmount
- side
- signatureType
- timestamp
- signature
RFQRequest:
type: object
description: The RFQ request as stored by the engine.
properties:
rfq_id:
type: string
auth_address:
type: string
signer_address:
type: string
maker_address:
type: string
signature_type:
$ref: '#/components/schemas/SignatureType'
requestor_public_id:
type: string
leg_position_ids:
type: array
items:
type: string
condition_id:
type: string
yes_position_id:
type: string
no_position_id:
type: string
direction:
$ref: '#/components/schemas/Direction'
side:
$ref: '#/components/schemas/Side'
requested_size:
$ref: '#/components/schemas/RequestedSize'
created_at:
type: integer
format: int64
description: Creation time in Unix milliseconds.
required:
- rfq_id
- leg_position_ids
- direction
- side
RFQStatus:
type: string
description: Lifecycle status of the RFQ
enum:
- CREATED
- COLLECTING_QUOTES
- AWAITING_REQUESTER_ACCEPTANCE
- AWAITING_MAKER_CONFIRMATION
- EXECUTING
- FILLED
- FAILED
- EXPIRED
- CANCELED
- REJECTED
FillBundle:
type: object
description: The selected executable bundle of maker allocations.
properties:
requested_shares_e6:
type: string
description: Requested share size in six-decimal fixed-point units.
requested_notional_e6:
type: string
description: Requested notional in six-decimal fixed-point units (BUY RFQs only).
blended_price_e6:
type: string
description: Blended bundle price in six-decimal fixed-point units.
allocations:
type: array
items:
$ref: '#/components/schemas/FillAllocation'
required:
- requested_shares_e6
- blended_price_e6
- allocations
MakerConfirmationSnapshot:
type: object
properties:
quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
decision:
type: string
enum:
- CONFIRM
- DECLINE
- TIMED_OUT
reason:
type: string
responded_at:
type: integer
format: int64
description: Response time in Unix milliseconds.
required:
- quote_id
- signer_address
- maker_address
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error detail
required:
- error
Direction:
type: string
description: Requester trade direction
enum:
- BUY
- SELL
Side:
type: string
description: Combinatorial position side. Currently only `YES` is supported.
enum:
- 'YES'
- 'NO'
RequestedSize:
type: object
description: Requested RFQ size and unit
properties:
unit:
type: string
description: >
`notional` for requester BUY RFQs and `shares` for requester SELL
RFQs.
enum:
- notional
- shares
value_e6:
type: string
description: Six-decimal fixed-point value encoded as a string.
example: '1000000'
required:
- unit
- value_e6
FillAllocation:
type: object
properties:
maker_quote_id:
type: string
signer_address:
type: string
maker_address:
type: string
size_e6:
type: string
description: >-
Accepted fill size for this maker quote, in six-decimal fixed-point
units.
price_e6:
type: string
description: Fill price in six-decimal fixed-point units.
received_at:
type: integer
format: int64
description: Receipt time in Unix milliseconds.
required:
- maker_quote_id
- signer_address
- maker_address
- size_e6
- price_e6
responses:
BadRequest:
description: >-
Invalid request (malformed JSON, invalid parameters, or failed
validation)
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: invalid quote
Unauthorized:
description: Missing or invalid CLOB L2 authentication
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unauthenticated
Forbidden:
description: >-
Authenticated identity does not match the request, or role is not
allowed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: auth address mismatch
NotFound:
description: The referenced RFQ is not active or no longer exists
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: unknown rfq
Conflict:
description: The RFQ is not in a state that accepts this command
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: competition window closed
TooManyRequests:
description: Rate limited
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: rate limited
ServiceUnavailable:
description: An RFQ service dependency is temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: service unavailable
securitySchemes:
polyApiKey:
type: apiKey
in: header
name: POLY_API_KEY
description: CLOB API key
polyAddress:
type: apiKey
in: header
name: POLY_ADDRESS
description: Wallet address associated with the API key
polySignature:
type: apiKey
in: header
name: POLY_SIGNATURE
description: HMAC-SHA256 signature of the request
polyPassphrase:
type: apiKey
in: header
name: POLY_PASSPHRASE
description: CLOB API key passphrase
polyTimestamp:
type: apiKey
in: header
name: POLY_TIMESTAMP
description: Unix timestamp of the request
````