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.2.1

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.2.1
File Size Uploaded
icpc_api-0.2.1.tar.gz 135.6 kB Details

Built distribution (wheel)

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

Total release size: 243.5 kB

Release files / icpc_api-0.2.1.tar.gz

Download URL icpc_api-0.2.1.tar.gz
Size 135.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7937e70d0e969476482796a0dd1e1035d89a63e970cd1c62888188e7ddd2209f
BLAKE2b-256 checksum
How to use checksums
1fc5d9fc9a00b4ecf6cb74f7fcb2bb99ad2d9b137e25f70214afe6da18ee5e76
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 Sep 18, 2026.

Transparency log

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

Download URL icpc_api-0.2.1-py3-none-any.whl
Size 107.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb565c89fae9705ba71fdbd9e594473bce00ee89bf1a0111c80e51181da960cb
BLAKE2b-256 checksum
How to use checksums
93a58ad71dc26111850613ad2119a540bb313b29c641812c40d00215dd765c9d
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 Sep 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.0

2 release files

0.3.0

2 release files

This release

0.2.1 This release

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