Skip to main content
POST
Co-sign a NegRisk position convert (NO-basket → USDC)

Authorizations

X-Api-Key
string
header
required

Partner / integrator key — format ps_live_<keyId>_<secret>. Partner keys are issued by PredictStreet; a user can also create keys bound to their own wallet from their account settings in the web app. Never ship to a browser. multi_wallet partners must additionally send X-User-Wallet: 0x<40-hex> on every authenticated request to declare the acting wallet. See the API keys guide for scope taxonomy, partner kinds, rate limits, and rotation procedure.

Headers

idempotency-key
string

Optional. Requests carrying the same key replay the original operation instead of creating a new one. When omitted, the key is derived from the wallet, the operation and the exact request body, so a byte-identical repeat replays the first operation — send your own key to run the same operation twice.

Body

application/json
marketId
string
required

Off-chain market symbol, e.g. "PM-WC26-WIN-FRA-WC26-1910V2". The server resolves it to the on-chain bytes32 NegRisk marketId; only neg-risk markets resolve, and a binary market fails with market_not_found.

Example:

"PM-WC26-WIN-FRA-WC26-1910V2"

indexSet
string
required

uint256 indexSet bitmap over outcomes to collapse, decimal string. Each bit set marks an outcome whose NO position is being burned. Server converts to bigint at the EIP-712 boundary. Example: a 4-outcome market collapsing NO_1 + NO_2 + NO_3 → indexSet = 0b1110 = 14. Empty (0) and full-universe (every outcome) sets are rejected.

Example:

"14"

amount
string
required

uint256 base-units (decimal string) — burned per outcome bit set in indexSet. NOT human-decimal: pass raw uint256 since CTF outcome tokens already mint 1:1 against 6-decimal USDC. Empty / zero rejected.

Example:

"1000000"

Response

201 - application/json
signedOpId
string
required

Operation id (UUID) for this convert co-sign — pass it to POST /api/me/positions/op-submit.

digest
string
required

EIP-712 digest the user must sign with their EOA private key. The returned backendSig is over this exact digest; both signatures are submitted on-chain to vault.convertPositions(...).

backendSig
string
required

0x-hex backend EIP-712 signature over digest.

salt
string
required

uint256 EIP-712 salt (decimal string).

deadline
number
required

uint256 EIP-712 deadline (Unix seconds).

marketId
string
required

bytes32 NegRisk on-chain marketId — the value the contract expects in convertPositions(marketId, ...). Distinct from the off-chain marketSymbol in the request: this is the resolved on-chain identifier.

indexSet
string
required

uint256 indexSet bitmap (decimal string), echoed back.

amount
string
required

uint256 base units echoed back.

vaultAddress
string
required

Per-user vault address (EIP-712 verifyingContract).

tokenIds
string[]
required

Ordered list (ascending outcome index) of decimal-string tokenIds the convert will BURN. Lets clients preview/display the operation without re-deriving the indexSet → tokenId mapping.

Example: