Skip to main content

icpc-api

An unofficial Python client and CLI for icpc.global API. Supports authentication and customizable search over contest data.

Note: This project is aimed for regional contest organizers. If you want to compete, please use Regional Finder to find nearest regional competition to you and its schedule.

Install

Use Python 3.12+ and uv.

# add library to your project
uv add icpc-api

# run your script that uses `import icpc`
uv run --with icpc-api script.py

# install CLI into PATH
uv tool install 'icpc-api[cli]'

If you don't have uv, feel free to use pip or any other convenient Python package manager.

Quick start

CLI:

icpc auth login
icpc whoami
icpc contest teams 1234 --status ACCEPTED
icpc search teams 1234 --proj id,name,status --sort name:asc -o csv > teams.csv

Python synchronous API:

from icpc import Icpc
from icpc.search import contest_teams
from icpc.models import TeamStatus

with Icpc.from_store() as icpc:
    # Use DSL to build the request
    teams = contest_teams(1234)
    f = teams.fields
    q = teams.query(
        proj=[f.id.name, f.name.name, f.inst_short_name.name],
        filters=[f.status.eq(TeamStatus.ACCEPTED)],
        sort=[f.name.asc()],
    )
    # `icpc.all` executes search request
    for row in icpc.all(teams, q):
        print(row.id, row.name, row.inst_short_name)

Python asynchronous API:

import asyncio
from icpc import AsyncIcpc, Include


async def main() -> None:
    async with AsyncIcpc.from_store() as icpc:
        view = await icpc.load_contest(1234, Include.DEFAULT)
        for team in view.teams:
            print(team.name, len(team.contestants), team.institution.inst_name)


asyncio.run(main())

load_contest is the unified search: it fetches the team, team-member, institution and contest tables concurrently, then joins them — teams indexed by id, rosters bucketed by team, institutions attached by instId, participants by personId, and the JSON-in-a-string teamMembers and extraField columns parsed into real objects.

Authentication

Icpc.from_password("me@example.com", "…")  # SRP login
Icpc.from_store()  # use `icpc auth login` to authenticate
Icpc.from_token("eyJ…")  # a borrowed id token from localStorage
Icpc.anonymous()  # /contest/public/* only

When using store, token and credentials are written to ~/.config/icpc/credentials.json. You can also use ICPC_USERNAME and ICPC_PASSWORD or ICPC_ID_TOKEN environment variables. ID Token is valid only for one hour.

Documentation

Read detailed guides on how to use:

  • Python API — guide, with worked examples
  • CLI — every command, with worked examples
  • API reference — every endpoint this client wraps

Development

uv sync --extra cli
uv run pytest
uv run ruff check . && uv run ruff format --check .
uv run ty check icpc tests

Metadata

Release files for icpc-api 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for icpc-api 0.4.0
File Size Uploaded
icpc_api-0.4.0.tar.gz 156.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for icpc-api 0.4.0
File Interpreter ABI Platform
icpc_api-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 281.3 kB

Release files / icpc_api-0.4.0.tar.gz

Download URL icpc_api-0.4.0.tar.gz
Size 156.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c69cbc5a51463840787bed46bb7bf57e632b9f5bd8708bdb437c3711c433ad74
BLAKE2b-256 checksum
How to use checksums
d0ada93032eaf579699b3c025971b1d909690a0236c2d9bf05b0ba71640d0f5f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / icpc_api-0.4.0-py3-none-any.whl

Download URL icpc_api-0.4.0-py3-none-any.whl
Size 125.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
612325fe77a0eb0288ac402f0e50a97da5ac337764585e28b905ea0edd2ca55d
BLAKE2b-256 checksum
How to use checksums
a41ba3b6685e61c21973f4557c73e92917d65592a8173ae4bfeb621dc0e3233b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page