Python client library for Unraid's official GraphQL API
Project description
unraid-api
An async Python client library for the Unraid GraphQL API (v4.21.0+, Unraid 7.1.4+).
Primary consumer: ha-unraid Home Assistant integration
Features
- 🔄 Async/await - Built with
aiohttpfor non-blocking operations - 🏠 Home Assistant ready - Accepts external
aiohttp.ClientSessionfor integration - 🔒 Secure by design - GraphQL variables, no string interpolation
- 📦 Typed - Full type hints with
py.typedmarker (PEP 561) - 🧩 Pydantic models - Structured response parsing
- 🔌 SSL auto-discovery - Handles Unraid's "No", "Yes", and "Strict" SSL modes
- ⚡ Redirect handling - Supports myunraid.net remote access
Installation
pip install unraid-api
Quick Start
import asyncio
from unraid_api import UnraidClient
async def main():
async with UnraidClient("192.168.1.100", "your-api-key") as client:
# Test connection
if await client.test_connection():
print("Connected!")
# Get version info
version = await client.get_version()
print(f"Unraid {version['unraid']}, API {version['api']}")
asyncio.run(main())
Usage Examples
Basic Queries
async with UnraidClient(host, api_key) as client:
# Custom GraphQL query
result = await client.query("""
query {
info {
os { hostname uptime }
cpu { name cores threads }
memory { total used }
}
}
""")
print(result["info"]["os"]["hostname"])
Docker Container Control
async with UnraidClient(host, api_key) as client:
# Start a container
await client.start_container("container:plex")
# Stop a container
await client.stop_container("container:plex")
VM Management
async with UnraidClient(host, api_key) as client:
# Start a VM
await client.start_vm("vm:windows-11")
# Stop a VM
await client.stop_vm("vm:windows-11")
Array Operations
async with UnraidClient(host, api_key) as client:
# Start/stop array
await client.start_array()
await client.stop_array()
# Parity check
await client.start_parity_check(correct=True)
await client.pause_parity_check()
await client.resume_parity_check()
await client.cancel_parity_check()
# Disk spin control
await client.spin_up_disk("disk:1")
await client.spin_down_disk("disk:1")
Session Injection (Home Assistant)
import aiohttp
from unraid_api import UnraidClient
async def setup_client(session: aiohttp.ClientSession):
"""Use shared session from Home Assistant."""
client = UnraidClient(
host="192.168.1.100",
api_key="your-api-key",
session=session, # Injected session won't be closed by client
verify_ssl=False,
)
return client
Pydantic Models
Response data can be parsed into typed models:
from unraid_api.models import DockerContainer, VmDomain, UnraidArray
# Parse container data
container = DockerContainer(**container_data)
print(f"{container.name}: {container.state}")
# Parse array data
array = UnraidArray(**array_data)
print(f"Array: {array.state}, Capacity: {array.capacity.usage_percent}%")
Exception Handling
from unraid_api import UnraidClient
from unraid_api.exceptions import (
UnraidAPIError,
UnraidAuthenticationError,
UnraidConnectionError,
UnraidTimeoutError,
)
async with UnraidClient(host, api_key) as client:
try:
await client.query("query { online }")
except UnraidAuthenticationError:
print("Invalid API key")
except UnraidConnectionError:
print("Cannot reach server")
except UnraidTimeoutError:
print("Request timed out")
except UnraidAPIError as e:
print(f"API error: {e}")
API Reference
UnraidClient
| Method | Description |
|---|---|
test_connection() |
Test if server is reachable |
get_version() |
Get Unraid and API version |
get_server_info() |
Get server info for device registration |
query(query, variables) |
Execute GraphQL query |
mutate(mutation, variables) |
Execute GraphQL mutation |
start_container(id) |
Start Docker container |
stop_container(id) |
Stop Docker container |
start_vm(id) |
Start VM |
stop_vm(id) |
Stop VM |
start_array() |
Start disk array |
stop_array() |
Stop disk array |
start_parity_check(correct) |
Start parity check |
pause_parity_check() |
Pause parity check |
resume_parity_check() |
Resume parity check |
cancel_parity_check() |
Cancel parity check |
spin_up_disk(id) |
Spin up disk |
spin_down_disk(id) |
Spin down disk |
Models
ServerInfo- Server info for HA device registrationSystemInfo- System informationUnraidArray- Array state and disksArrayDisk- Individual disk infoArrayCapacity- Capacity calculationsDockerContainer- Container detailsVmDomain- VM detailsUPSDevice- UPS statusShare- User share infoPhysicalDisk- Physical disk infoNotification- System notification
Requirements
- Python 3.11+
- Unraid 7.1.4+ with API 4.21.0+
- API key with appropriate permissions
Development
# Clone repository
git clone https://github.com/ruaan-deysel/unraid-api.git
cd unraid-api
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v --cov=src/unraid_api
# Lint and type check
ruff check .
ruff format .
mypy src/
License
MIT License - see LICENSE for details.
Contributing
Contributions welcome! Please ensure:
- Tests are written first (TDD)
- All tests pass with 80%+ coverage
- No linting errors (
ruff check . && mypy src/) - GraphQL variables used (no string interpolation)
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file unraid_api-1.2.1.tar.gz.
File metadata
- Download URL: unraid_api-1.2.1.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a5ff73117e4b6a95dc43283962194382faa05048ef752eea497aeefdfdf974d
|
|
| MD5 |
7e1f071bbb765eccab03d5716ad7d836
|
|
| BLAKE2b-256 |
85f74b561920b50d9064b8a7ade7328cb44838326decd75ce2c45ab47d671cf5
|
Provenance
The following attestation bundles were made for unraid_api-1.2.1.tar.gz:
Publisher:
publish.yml on ruaan-deysel/unraid-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
unraid_api-1.2.1.tar.gz -
Subject digest:
9a5ff73117e4b6a95dc43283962194382faa05048ef752eea497aeefdfdf974d - Sigstore transparency entry: 812958295
- Sigstore integration time:
-
Permalink:
ruaan-deysel/unraid-api@f8148f3d3b96e7d8c3ac1a03f1c84090cc6072c0 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/ruaan-deysel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f8148f3d3b96e7d8c3ac1a03f1c84090cc6072c0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file unraid_api-1.2.1-py3-none-any.whl.
File metadata
- Download URL: unraid_api-1.2.1-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1b4ce8c7a4756ae531bbde7b1ff47767ba9afc2e6cd9a329ebfbcb22556f436
|
|
| MD5 |
226050b0399f95fe860fa6722e220c41
|
|
| BLAKE2b-256 |
21894f47a8b8cfd69c7809f5ae2f6c76e778266d697cf4784effb0a900b72bc1
|
Provenance
The following attestation bundles were made for unraid_api-1.2.1-py3-none-any.whl:
Publisher:
publish.yml on ruaan-deysel/unraid-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
unraid_api-1.2.1-py3-none-any.whl -
Subject digest:
f1b4ce8c7a4756ae531bbde7b1ff47767ba9afc2e6cd9a329ebfbcb22556f436 - Sigstore transparency entry: 812958296
- Sigstore integration time:
-
Permalink:
ruaan-deysel/unraid-api@f8148f3d3b96e7d8c3ac1a03f1c84090cc6072c0 -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/ruaan-deysel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f8148f3d3b96e7d8c3ac1a03f1c84090cc6072c0 -
Trigger Event:
release
-
Statement type: