Seerr Sync API¶
Seerr Sync provides one-way request replication from a primary Seerr instance to one or more subordinates.
It polls the primary at a configurable interval, fingerprints requests using {mediaType}:{tmdbId}:{is4k}, and persists sync state in /config/seerr_sync_state.json to survive restarts.
Endpoints¶
GET /api/seerr-sync/status¶
Summary status of the sync service.
Response (disabled):
{
"enabled": false,
"status": "disabled"
}
Response (active):
{
"enabled": true,
"status": "active",
"last_poll": "2026-01-29T21:32:46Z",
"next_poll": "2026-01-29T21:33:46Z",
"poll_interval_seconds": 60,
"total_requests_tracked": 1284,
"total_failed": 9,
"subordinates": {
"internal:Sync1": { "synced": 1280, "failed": 5 },
"internal:Sync2": { "synced": 1281, "failed": 4 }
}
}
Response (initializing):
{
"enabled": true,
"status": "initializing",
"message": "Sync state not yet created"
}
GET /api/seerr-sync/failed¶
List failed sync attempts with details.
{
"count": 9,
"failed_requests": [
{
"fingerprint": "movie:1403290:False",
"subordinate": "internal:Sync1",
"media_type": "movie",
"tmdb_id": 1403290,
"error": "[TMDB] Failed to fetch movie details: Request failed with status code 404",
"failed_at": "2026-01-29T21:29:37Z"
}
]
}
GET /api/seerr-sync/state¶
Raw sync state (debugging).
{
"last_poll_ts": "2026-01-29T21:32:46Z",
"requests": {
"movie:12345:False": {
"primary_id": 42,
"subordinates": {
"internal:Sync1": { "id": 15, "status": 2, "synced_at": "2026-01-29T21:10:00Z" }
}
}
},
"failed": {
"movie:1403290:False||internal:Sync1": {
"failed_at": "2026-01-29T21:29:37Z",
"error": "[TMDB] Failed to fetch movie details...",
"media_type": "movie",
"tmdb_id": 1403290
}
}
}
POST /api/seerr-sync/test¶
Test connectivity to a Seerr instance using a URL and API key.
Request body:
{
"url": "https://seerr.example.com",
"api_key": "your_api_key"
}
Response (success):
{
"ok": true,
"status": {
"version": "1.0.0"
}
}
Response (failure):
{
"detail": "Seerr responded with HTTP 401"
}
DELETE /api/seerr-sync/failed¶
Clear failed requests so they are retried on the next poll.
Query parameters:
fingerprint(optional) – Clear only a specific request.
Response:
{
"message": "Cleared 9 failed request(s)",
"cleared": 9
}
Notes¶
- Timestamps are ISO 8601 UTC (
YYYY-MM-DDTHH:MM:SSZ). - Failed requests are retried after the configured delay.
- Subordinate identifiers use
internal:<InstanceName>or external labels when configured.