Stats API
Cleanuparr provides a stats endpoint that exposes aggregated application statistics. This is designed for integration with dashboard tools like Homepage, Homarr, or any tool that can consume JSON APIs.
Authentication
🔑API Key
This endpoint requires authentication. You can authenticate using your API key in one of two ways:
Header (recommended):
curl -H "X-Api-Key: YOUR_API_KEY" http://localhost:11011/api/stats
Query parameter:
curl http://localhost:11011/api/stats?apikey=YOUR_API_KEY
You can find your API key in the Cleanuparr UI under Account Settings.
JWT Bearer tokens are also supported for browser-based access.
Endpoint
🔗GET /api/stats
Returns aggregated statistics including events, strikes, job runs, and health status.
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
hours | integer | 24 | Timeframe in hours (range: 1–720) |
includeEvents | integer | 0 | Number of recent events to include (range: 0–100). Omitted from response when 0. |
includeStrikes | integer | 0 | Number of recent strikes to include (range: 0–100). Omitted from response when 0. |
Examples:
# Last 24 hours (default)
curl -H "X-Api-Key: YOUR_API_KEY" http://localhost:11011/api/stats
# Last hour
curl -H "X-Api-Key: YOUR_API_KEY" http://localhost:11011/api/stats?hours=1
# Last 7 days
curl -H "X-Api-Key: YOUR_API_KEY" http://localhost:11011/api/stats?hours=168
# Include 5 recent events and 5 recent strikes
curl -H "X-Api-Key: YOUR_API_KEY" "http://localhost:11011/api/stats?includeEvents=5&includeStrikes=5"
If BASE_PATH is set, include it in the URL: http://localhost:11011/cleanuparr/api/stats
Response Reference
📝events
Event statistics within the specified timeframe.
{
"totalCount": 42,
"byType": {
"FailedImportStrike": 5,
"StalledStrike": 12,
"QueueItemDeleted": 8,
"DownloadCleaned": 6
},
"bySeverity": {
"Information": 20,
"Warning": 15,
"Error": 7
},
"timeframeHours": 24,
"recentItems": [
{
"id": "...",
"timestamp": "2025-01-15T12:00:00Z",
"eventType": "StalledStrike",
"message": "Strike issued for stalled download",
"severity": "Warning",
"data": null
}
]
}
- totalCount — Total number of events in the timeframe
- byType — Events grouped by type (only types with events are included)
- bySeverity — Events grouped by severity level
- timeframeHours — The requested timeframe
- recentItems — Recent event records (only present when
includeEvents> 0)
⚡strikes
Strike statistics within the specified timeframe.
{
"totalCount": 23,
"byType": {
"Stalled": 8,
"FailedImport": 5,
"SlowSpeed": 4,
"SlowTime": 3,
"DownloadingMetadata": 3
},
"itemsRemoved": 10,
"timeframeHours": 24,
"recentItems": [
{
"id": "...",
"type": "Stalled",
"createdAt": "2025-01-15T12:00:00Z",
"downloadId": "abc123",
"title": "Some.Download.Title"
}
]
}
- totalCount — Total number of strikes issued in the timeframe
- byType — Strikes grouped by type (only types with strikes are included)
- itemsRemoved — Number of download items removed that had strikes in the timeframe
- recentItems — Recent strike records with download info (only present when
includeStrikes> 0)
⏱️jobs
Job run statistics within the specified timeframe.
{
"byType": {
"QueueCleaner": {
"totalRuns": 48,
"completed": 46,
"failed": 2,
"lastRunAt": "2025-01-15T12:00:00Z",
"nextRunAt": "2025-01-15T12:30:00Z"
},
"MalwareBlocker": {
"totalRuns": 48,
"completed": 48,
"failed": 0,
"lastRunAt": "2025-01-15T12:00:00Z",
"nextRunAt": "2025-01-15T12:30:00Z"
}
},
"timeframeHours": 24
}
- byType — Stats per job type (QueueCleaner, MalwareBlocker, DownloadCleaner, BlacklistSynchronizer)
- totalRuns — Total executions in the timeframe
- completed / failed — Breakdown by outcome
- lastRunAt — Timestamp of the most recent run
- nextRunAt — When this job is next scheduled to run
🏥health
Current health status of all configured download clients and arr instances. Health data is cached and updated every ~5 minutes by a background service.
{
"downloadClients": [
{
"id": "...",
"name": "qBittorrent",
"type": "qBittorrent",
"isHealthy": true,
"lastChecked": "2025-01-15T12:00:00Z",
"responseTimeMs": 45.2,
"errorMessage": null
}
],
"arrInstances": [
{
"id": "...",
"name": "Sonarr",
"type": "Sonarr",
"isHealthy": true,
"lastChecked": "2025-01-15T12:00:00Z",
"errorMessage": null
}
]
}
- downloadClients — Health of each enabled download client
- arrInstances — Health of each enabled arr instance (Sonarr, Radarr, Lidarr, Readarr, Whisparr)
Health data reflects the last background check (~5 minute interval). It does not perform live checks on each request, keeping the endpoint fast for frequent polling.
Dashboard Integration
🏠Homepage Example
Homepage can use the customapi widget to display Cleanuparr stats:
- Cleanuparr:
icon: cleanuparr.png
href: http://localhost:11011
description: Arr Cleanup Service
widget:
type: customapi
url: http://localhost:11011/api/stats
headers:
X-Api-Key: YOUR_API_KEY
mappings:
- field: events.totalCount
label: Events (24h)
format: number
- field: strikes.totalCount
label: Strikes (24h)
format: number
- field: strikes.itemsRemoved
label: Removed
format: number
You can reference any field in the response using dot notation (e.g., jobs.byType.QueueCleaner.failed).
To change the timeframe, add a query parameter to the URL: http://localhost:11011/api/stats?hours=168 for a weekly view.
🔧Other Dashboard Tools
Any tool that can fetch and parse JSON can use this endpoint. The response is a flat, predictable JSON structure designed for easy field mapping.
Key fields for dashboards:
events.totalCount— Total events in timeframestrikes.totalCount— Total strikes in timeframestrikes.itemsRemoved— Downloads removedjobs.byType.<JobType>.failed— Failed job runsjobs.byType.<JobType>.nextRunAt— Next scheduled runhealth.downloadClients[0].isHealthy— First download client healthhealth.arrInstances[0].isHealthy— First arr instance health