Skip to main content

forgejo

Async Python client for the Forgejo REST API. Forgejo keeps API compatibility with Gitea, so this works against Gitea instances too.

The library covers the read-only surface needed to monitor a forge: version, account, unread notifications, repository counters, the latest Actions run, and the tip commit. It has no Home Assistant dependency — if that is what you are after, see HA-Forgejo.

Install

pip install forgejo

Requires Python 3.12+.

Use

import asyncio

from forgejo import ForgejoClient


async def main() -> None:
    async with ForgejoClient("https://git.example.com", token="your-api-token") as client:
        server = await client.get_version()
        print(f"Forgejo {server.version}")

        me = await client.get_authenticated_user()
        print(f"Signed in as {me.login}")

        print(f"{await client.get_new_notification_count()} unread notifications")

        repo = await client.get_repository("example-user", "example-repo")
        print(f"{repo.full_name}: {repo.open_issues} issues, {repo.open_pull_requests} PRs")

        run = await client.get_latest_workflow_run("example-user", "example-repo")
        if run is not None:
            print(f"Last CI run: {run.name} -> {run.status}")


asyncio.run(main())

Bring your own session

Pass an existing aiohttp.ClientSession and the client will use it and leave it open. This is what you want inside a larger application that already pools connections.

async with aiohttp.ClientSession() as session:
    client = ForgejoClient("https://git.example.com", token="...", session=session)

Self-signed certificates

Instances on a private network often use a certificate the system trust store does not know about.

client = ForgejoClient("https://git.internal", token="...", verify_ssl=False)

Turning verification off means the connection is encrypted but unauthenticated. Prefer installing the CA certificate where possible.

Getting a token

In the web UI: Settings → Applications → Generate New Token. Read-only scopes are enough:

  • read:repository — repository counters, Actions runs, commits
  • read:issue — issue and pull-request counts
  • read:notification — unread notification count
  • read:user — the account the token belongs to

Everything except get_version() needs a token.

API

Method Returns
get_version() ServerInfo
get_authenticated_user() User
get_new_notification_count() int
list_repositories(limit=50) list[Repository]
get_repository(owner, repo) Repository
get_latest_workflow_run(owner, repo) WorkflowRun | None
get_latest_commit(owner, repo) Commit | None

Methods return dataclasses, never raw dictionaries. None means the thing does not exist — a repository with no workflows, or an empty repository with no commits — which is different from an error.

Errors

All exceptions derive from ForgejoError:

  • ForgejoConnectionError — unreachable or timed out
  • ForgejoAuthenticationError — token rejected or missing a scope
  • ForgejoNotFoundError — no such repository or endpoint
  • ForgejoResponseError — answered, but not with usable JSON

A common cause of ForgejoResponseError is an auth proxy in front of the instance returning its own login page with HTTP 200.

Notes on the API

  • open_issues excludes pull requests. Pull requests are counted separately in open_pull_requests. This surprises people coming from the GitHub API, where the equivalent field includes both.
  • A workflow run status is only meaningful once it reaches a terminal state. TERMINAL_RUN_STATUSES holds the set; anything else means still running, which is not the same as failing.

License

MIT

Download files

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

Source Distribution

forgejo-1.0.0.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

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

forgejo-1.0.0-py3-none-any.whl (11.0 kB view details)

Uploaded Python 3

File details

Details for the file forgejo-1.0.0.tar.gz.

File metadata

  • Download URL: forgejo-1.0.0.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for forgejo-1.0.0.tar.gz
Algorithm Hash digest
SHA256 10a30fdbee06b34ba00dcbff39bfeefa85917387675e8b9b48b577fc516c2d07
MD5 e585c3af4d9fbd03ca0df840ab3e7393
BLAKE2b-256 607540468708dc1db5af388619a06c037903c74dabc5d2f1706e55ffa04895cb

See more details on using hashes here.

File details

Details for the file forgejo-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: forgejo-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 11.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for forgejo-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 406aa08de6bbc2bcfa368c9442a2b31740b297608cd9679c83b9c6e933be3523
MD5 930fcaef5465eb5694babacba0cd75ff
BLAKE2b-256 d1658e3a6807b8aebc219ccf6da2e11fcc51952e8b9e429047fdb647630f5120

See more details on using hashes here.

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