Redmine Client
Python client for the Redmine REST API with synchronous and asynchronous support.
Features
- Synchronous and asynchronous client
- Full type hints with Pydantic models
- Custom fields support
- Automatic pagination
- Context manager support
Installation
pip install redmine-client
Or for development:
pip install -e ".[dev]"
Usage
Synchronous
from redmine_client import RedmineClient
with RedmineClient("https://redmine.example.com", "your-api-key") as client:
# Get all open issues assigned to me
issues = client.get_issues(assigned_to_id="me", status_id="open")
for issue in issues:
print(f"#{issue.id}: {issue.subject}")
# Update issue with custom field
client.update_issue(
issue_id=123,
custom_fields=[{"id": 42, "value": "2026-KW03-KW04"}]
)
Asynchronous
from redmine_client import AsyncRedmineClient
async with AsyncRedmineClient("https://redmine.example.com", "your-api-key") as client:
issues = await client.get_issues(assigned_to_id="me", status_id="open")
for issue in issues:
print(f"#{issue.id}: {issue.subject}")
API
Issues
# Get issues
issues = client.get_issues(
project_id="myproject", # Optional: filter by project
assigned_to_id="me", # Optional: filter by assignee
status_id="open", # Optional: "open", "closed", "*", or ID
tracker_id=1, # Optional: Bug, Feature, etc.
)
# Get single issue
issue = client.get_issue(123, include_journals=True)
# Create issue
new_issue = client.create_issue(
project_id="myproject",
subject="New feature",
description="Description...",
tracker_id=2,
custom_fields=[{"id": 42, "value": "Sprint value"}]
)
# Update issue
client.update_issue(
issue_id=123,
subject="New subject",
notes="Add a comment",
custom_fields=[{"id": 42, "value": "New value"}]
)
# Add comment
client.add_issue_note(123, "My comment")
Custom Fields
# Get all custom fields (requires admin rights)
fields = client.get_custom_fields()
# Get issue custom fields only
issue_fields = client.get_issue_custom_fields()
# Find custom field by name
sprint_field = client.find_custom_field_by_name("Sprint")
# Read custom field value from issue
issue = client.get_issue(123)
sprint = issue.get_custom_field("Sprint")
Projects
projects = client.get_projects(include_closed=False)
project = client.get_project("myproject")
Users
current_user = client.get_current_user()
users = client.get_users(status=1) # 1 = active
user = client.get_user(42)
Enumerations
trackers = client.get_trackers()
statuses = client.get_issue_statuses()
priorities = client.get_issue_priorities()
activities = client.get_time_entry_activities()
Models
All responses are returned as Pydantic models:
RedmineIssue- Issue/TicketRedmineProject- ProjectRedmineUser- UserRedmineTimeEntry- Time entryRedmineCustomField- Custom field valueRedmineCustomFieldDefinition- Custom field definition
Error Handling
from redmine_client import (
RedmineError,
RedmineAuthenticationError,
RedmineNotFoundError,
RedmineValidationError,
)
try:
issue = client.get_issue(99999)
except RedmineNotFoundError:
print("Issue not found")
except RedmineAuthenticationError:
print("Invalid API key")
except RedmineValidationError as e:
print(f"Validation error: {e.response}")
except RedmineError as e:
print(f"Redmine error: {e}")
License
MIT
Metadata
Release files for redmine-client 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| redmine_client-0.2.0.tar.gz | 18.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| redmine_client-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.3 kB
Release files / redmine_client-0.2.0.tar.gz
| Download URL | redmine_client-0.2.0.tar.gz |
|---|---|
| Size | 18.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
87619ae4f7ad95f57c1c6271940d366c0d0d8c2caacffeddd9b12013e6159e86
|
|
BLAKE2b-256 checksum How to use checksums |
e1dfee4b036830f934b7e8dd8d89e51723981239a51a7c36853ced090404f86f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Feb 8, 2026.
Transparency logRelease files / redmine_client-0.2.0-py3-none-any.whl
| Download URL | redmine_client-0.2.0-py3-none-any.whl |
|---|---|
| Size | 16.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d9d5acceb58e29dd17ba180d405ed01ab27d481b797ef3739ce25ba947a0f7f3
|
|
BLAKE2b-256 checksum How to use checksums |
5bb8e5112a50e6281fc5eab51618394a3e6a0e8d8557a017ae9a97036d0940a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Feb 8, 2026.
Transparency log