NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
APIOct 2, 2026

Polymarket Redeem API (2026): How to Redeem Winning Positions

Polymarket Redeem API (2026): How to Redeem Winning Positions

The Short Answer

To redeem a resolved Polymarket position through the API, call redeemPositions({ conditionId }) on the official SDK's secure client, or redeem_positions in Python. The client picks the right collateral adapter for the market type and redeems your balance on both outcomes, and each winning share returns 1 pUSD. Without the SDK, you encode a redeemPositions call on the matching collateral adapter and submit it through Polymarket's relayer as a gasless wallet transaction. There is no redemption deadline, and most failed redemptions come down to an unresolved market, a missing approval or the wrong wallet.

Key Takeaways

  • Winning outcome tokens redeem for 1 pUSD each after resolution, and losing tokens redeem for nothing.
  • The unified SDK's redeemPositions takes only a condition ID and handles standard and negative risk markets.
  • Over the raw API, standard markets use the CtfCollateralAdapter and negative risk markets use the NegRiskCtfCollateralAdapter.
  • Redemption runs as a gasless wallet transaction through the relayer, so wait for it to confirm before using the payout.
  • Winning tokens never expire, so a redemption that fails today can be retried later.

When can you redeem a Polymarket position?

As soon as the market resolves. Polymarket resolves markets through the UMA Optimistic Oracle: someone proposes an outcome, a two-hour challenge period follows, and the market resolves if nobody disputes it. A dispute starts another round, so a contested market can take longer. You can check where a market stands in its resolution data before trying.

Once resolved, each winning token returns 1 pUSD and each losing token returns 0. In the rare case of a 50-50 resolution, every token redeems for $0.50. There is no deadline: winning tokens stay redeemable at any time after resolution.

How do you redeem with the Polymarket SDK?

Use the unified TypeScript SDK, @polymarket/client, with a secure client authorized by a Relayer API key or a Builder API key, so the redemption runs as a gasless transaction:

import { createSecureClient, relayerApiKey } from '@polymarket/client';
import { privateKey } from '@polymarket/client/viem';

const client = await createSecureClient({
  signer: privateKey(process.env.SIGNER_PRIVATE_KEY),
  wallet: process.env.POLYMARKET_WALLET_ADDRESS,
  apiKey: relayerApiKey({
    key: process.env.POLYMARKET_RELAYER_API_KEY!,
    address: process.env.POLYMARKET_RELAYER_API_KEY_ADDRESS!,
  }),
});

const transaction = await client.redeemPositions({ conditionId: '0xYourMarketConditionId' });
const outcome = await transaction.wait();
console.log(outcome.transactionHash);

The client reads the market type from the condition ID and selects the right collateral adapter, so the same call works for standard and negative risk markets. There is no amount parameter: it redeems the wallet's balance on both outcomes. wait() resolves once the transaction settles.

The Python SDK, polymarket-client, has the same method on its async and sync secure clients:

import os
from polymarket import AsyncSecureClient, RelayerApiKey

client = await AsyncSecureClient.create(
    private_key=os.environ["SIGNER_PRIVATE_KEY"],
    wallet=os.environ["POLYMARKET_WALLET_ADDRESS"],
    api_key=RelayerApiKey(
        key=os.environ["POLYMARKET_RELAYER_API_KEY"],
        address=os.environ["POLYMARKET_RELAYER_API_KEY_ADDRESS"],
    ),
)

transaction = await client.redeem_positions(condition_id="0xYourMarketConditionId")
outcome = await transaction.wait()
print(outcome.transaction_hash)

Relayer and Builder API keys, and how gasless transactions work, are explained in the Polymarket relayer API guide.

How do you redeem through the API without the SDK?

You build the contract call yourself, then send it through the relayer. The target is the collateral adapter that matches the market's negRisk flag:

Market typeCollateral adapter
Standard (negRisk false)CtfCollateralAdapter, 0xAdA100Db00Ca00073811820692005400218FcE1f
Negative risk (negRisk true)NegRiskCtfCollateralAdapter, 0xadA2005600Dec949baf300f4C6120000bDB6eAab

ABI-encode a call to redeemPositions(address collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint256[] indexSets) with these arguments:

ArgumentValue
collateralTokenpUSD, 0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB
parentCollectionId32 zero bytes
conditionIdThe market's condition ID
indexSets[1, 2], which covers both outcomes

For a Deposit Wallet, put that call into a signed wallet batch and submit it to the relayer:

curl -X POST "https://relayer-v2.polymarket.com/submit" \
  -H "Content-Type: application/json" \
  -H "RELAYER_API_KEY: $RELAYER_API_KEY" \
  -H "RELAYER_API_KEY_ADDRESS: $RELAYER_API_KEY_ADDRESS" \
  --data '{
    "type": "WALLET",
    "from": "<signer_address>",
    "to": "0x00000000000Fb5C9ADea0298D729A0CB3823Cc07",
    "nonce": "<wallet_nonce>",
    "signature": "<wallet_batch_signature>",
    "metadata": "Redeem positions",
    "depositWalletParams": {
      "depositWallet": "<deposit_wallet_address>",
      "deadline": "<unix_seconds>",
      "calls": [{ "target": "<collateral_adapter_address>", "value": "0", "data": "<encoded_redeem_calldata>" }]
    }
  }'

The to address is the Deposit Wallet Factory, and each entry in calls is one contract call the wallet makes. Poll the transaction until it reaches STATE_CONFIRMED before treating the pUSD as received. Every address used here is listed in Polymarket's contract addresses.

Why did my Polymarket redeem fail?

Work through these checks in order. Each one matches a requirement in Polymarket's own redemption steps:

  1. The market has not resolved yet. A proposal in its two-hour challenge period, or a disputed one, is not a resolution. Wait for the final result.
  2. The adapter is not approved. The collateral adapter must be approved to move your outcome tokens, through setApprovalForAll on the Conditional Tokens contract, before it can redeem them.
  3. The wrong adapter. Negative risk markets need the NegRiskCtfCollateralAdapter. The SDK chooses for you, so this mostly affects hand-built calls.
  4. The tokens are in another wallet. Most accounts hold positions in a proxy or deposit wallet, not the signing key. Redeem from the wallet that holds the tokens, found as explained in how to find your Polymarket proxy wallet.
  5. The transaction has not confirmed. A relayer submission is not final until it reaches STATE_CONFIRMED.
  6. There was nothing to redeem. Losing tokens return 0 pUSD, so redeeming only the losing side of a market moves no money.

Because winning tokens never expire, nothing is lost by fixing the cause and trying again later.

How do you find positions that are ready to redeem?

Polymarket's Data API returns positions for any wallet with a redeemable flag, as covered in the Polymarket Data API guide. If the same wallet also trades on other venues, the Predictefy API values its positions across all of them in one call, with each position's status:

import { Predictefy } from '@predictefy/sdk';

const client = new Predictefy({ apiKey: process.env.PREDICTEFY_API_KEY });

const portfolio = await client.fetchPortfolio({ address: '0xYourWalletAddress' });
for (const [venue, v] of Object.entries(portfolio.venues)) {
  for (const p of v.positions.data ?? []) {
    if (p.status === 'resolved' && (p.size ?? 0) > 0) console.log(venue, p.marketId, p.side, p.size);
  }
}

Every row is a position the wallet still holds in a market that has resolved, grouped by venue. On Polymarket, those are the condition IDs to pass to redeemPositions, and the same check covers the other venues Predictefy serves in one pass.

Frequently Asked Questions

How do I redeem Polymarket positions through the API?

Call redeemPositions with the market's condition ID on a secure client from the official TypeScript SDK, or redeem_positions in Python. The client selects the right collateral adapter and redeems both outcomes. Without the SDK, encode a redeemPositions call on the matching collateral adapter and submit it through the relayer.

Is there a deadline to redeem on Polymarket?

No. Polymarket's documentation states there is no redemption deadline, and winning tokens remain redeemable at any time after a market resolves.

Why can't I redeem my Polymarket winnings?

Usually the market has not finished resolving, the collateral adapter is not approved to move your outcome tokens, or the tokens sit in a different wallet from the one you are redeeming from. Check those first, and wait for a relayer transaction to reach STATE_CONFIRMED before assuming it failed.

Does redeeming on Polymarket cost gas?

Not when it runs through Polymarket's relayer, which submits the redemption as a gasless wallet transaction authorized by a Relayer or Builder API key. Calling the contracts directly from your own wallet pays Polygon gas.

How do negative risk markets redeem?

Through the NegRiskCtfCollateralAdapter instead of the standard CtfCollateralAdapter. The SDK's redeemPositions detects the market type from the condition ID and uses the right adapter automatically.

What happens if a market resolves 50-50?

Every outcome token redeems for $0.50 instead of $1 or $0. Redemption works the same way as any other resolved market.