Skip to main content

Official Python client for Polymarket

Project description

Polymarket Python SDK

Beta

Official Python SDK for Polymarket.

The SDK gives Python developers one coherent, workflow-oriented interface for building on Polymarket across public data, authenticated account, trading, builder attribution, and wallet workflows.

Beta Status

The Python SDK is currently in beta. We are working toward a stable public API and will use feedback during the beta period to refine the developer experience.

We welcome bug reports, feature requests, and general feedback through GitHub Issues. Please use the provided issue templates so we can triage reports consistently.

Installation

uv add --prerelease allow polymarket-client

or:

pip install --pre polymarket-client

Usage

Synchronous client:

from polymarket import Market, PublicClient

with PublicClient() as client:
    market: Market = client.get_market(url="https://polymarket.com/event/example-market")

Asynchronous client:

import asyncio

from polymarket import AsyncPublicClient, Market


async def main() -> None:
    async with AsyncPublicClient() as client:
        market: Market = await client.get_market(
            url="https://polymarket.com/event/example-market"
        )


asyncio.run(main())

Custom transaction calls:

from polymarket.calls import merge_v2_call
from polymarket.types import EvmAddress

router = EvmAddress(client.environment.protocol_v2_router)

handle = client.execute_transaction(
    calls=[
        merge_v2_call(router=router, condition_id="0x03...", amount=1_000_000),
        merge_v2_call(router=router, condition_id="0x03...", amount=2_000_000),
        merge_v2_call(router=router, condition_id="0x03...", amount=500_000),
    ],
    metadata="Merge 3 combo positions",
)

outcome = handle.wait()

Batch position merges:

# Merge regular market positions by condition or market id.
handle = client.merge_multiple_positions(
    positions=[
        {"condition_id": condition_id_1},
        {"market_id": market_id_2, "amount": "max"},
        {"condition_id": condition_id_3, "amount": 500_000},
    ],
)

outcome = handle.wait()

# Or merge combo positions by position id. Do not mix market and combo
# requests in the same batch.
handle = client.merge_multiple_positions(
    positions=[
        {"position_id": combo_position_id_1},
        {"position_id": combo_position_id_2, "amount": "max"},
        {"position_id": combo_position_id_3, "amount": 500_000},
    ],
)

outcome = handle.wait()

API Design

See SDK Direction for public API design principles and developer-experience decisions.

Development

Install dependencies:

make sync

Run checks:

make check

Build package artifacts:

make build

The Makefile is a thin convenience wrapper around uv. Running the underlying commands directly is also fine.

Testing

Unit tests run by default:

make test

Run unit tests in watch mode:

make test-watch

This runs the tests once immediately, then reruns them when Python files change.

Integration tests are opt-in:

make test-integration

Integration tests can load local secrets from a gitignored .env copied from .env.example:

cp .env.example .env

See .env.example for the supported local and CI secret names.

Tests that require credentials should use the require_env fixture so they skip when secrets are unavailable:

import pytest


@pytest.mark.integration
def test_authenticated_flow(require_env):
    private_key = require_env("POLYMARKET_PRIVATE_KEY")
    builder_api_key = require_env("POLYMARKET_BUILDER_API_KEY")

    assert private_key
    assert builder_api_key

The SDK does not load .env files at runtime. The integration test fixture loads .env only for tests that request credentials, and existing environment variables take precedence over local .env values.

Tests that place orders, spend funds, or mutate live state must also use @pytest.mark.metered. Metered tests are skipped unless POLYMARKET_RUN_METERED_TESTS=1 is set:

import pytest


@pytest.mark.integration
@pytest.mark.metered
def test_order_lifecycle(require_env):
    private_key = require_env("POLYMARKET_PRIVATE_KEY")

    assert private_key
POLYMARKET_RUN_METERED_TESTS=1 make test-integration

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

polymarket_client-0.1.0b18.tar.gz (303.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

polymarket_client-0.1.0b18-py3-none-any.whl (275.2 kB view details)

Uploaded Python 3

File details

Details for the file polymarket_client-0.1.0b18.tar.gz.

File metadata

  • Download URL: polymarket_client-0.1.0b18.tar.gz
  • Upload date:
  • Size: 303.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for polymarket_client-0.1.0b18.tar.gz
Algorithm Hash digest
SHA256 39e0e379aa4889d0db3165e027490a48b2523c11d9d5459211f45b9971fbf87f
MD5 59d6d89c7e92da60fedcc333332da65c
BLAKE2b-256 5e9d5699ec3bbe7914e34b6ec1d94cb0a903b8cf8bfcde45b517ff3431e0a6e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for polymarket_client-0.1.0b18.tar.gz:

Publisher: release-please.yml on Polymarket/py-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file polymarket_client-0.1.0b18-py3-none-any.whl.

File metadata

File hashes

Hashes for polymarket_client-0.1.0b18-py3-none-any.whl
Algorithm Hash digest
SHA256 d38c636fb4525d4ae055ed0642b1851ff9d5b57b0eb435c01424a34cfc646d26
MD5 d666c2a79626e9116876c2db46e84892
BLAKE2b-256 973ecf0f4b1cfe3e34f2b806e5544583173b9d9b6d55051a774dd98878ec1305

See more details on using hashes here.

Provenance

The following attestation bundles were made for polymarket_client-0.1.0b18-py3-none-any.whl:

Publisher: release-please.yml on Polymarket/py-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page