--- type: reference title: Prowlarr description: "Indexer management for the *arr stack: feed routes, the sync model, the API surface, and verified live gotchas." tags: [prowlarr, arr-stack, frankbook-pro] timestamp: 2026-09-03T00:00:00Z --- # Prowlarr Prowlarr is the indexer management layer for the *arr stack. It hosts the indexer definitions and exposes them as Torznab feeds and downloads; Sonarr, Radarr, Lidarr, and Readarr query those feeds and receive results. **Host:** FrankBook-Pro (podman machine) — **Access:** direct port `9696` (no reverse-proxy vhost; the *arr stack is exempt by construction from the Anubis guard chain) — **Docs:** https://wiki.servarr.com/prowlarr ## Facts | Item | Value | |------|-------| | Image | `lscr.io/linuxserver/prowlarr:latest` (runs v2.5.2 line) | | Port | 9696 (host) → 9696 (container) | | Env | `PUID=0`, `PGID=0`, `TZ=America/Los_Angeles`, `UMASK_SET=022` | | Config root | `/Volumes/COMPLETE/prowlarr-data:/config` | | Min RAM | 256 MB | | Auth | Forms (web UI) + API key (`/api/v1/...` and feed routes) | ## Deployment (current) Quadlet unit `prowlarr.container` from this repo (`frankbook-pro/prowlarr/quadlet/`), installed inside the podman machine at `/home/core/.config/containers/systemd/prowlarr.service` by the frankbook-pro handler in `scripts/deploy-remote.sh`: ```ini [Container] ContainerName=prowlarr Image=lscr.io/linuxserver/prowlarr:latest Environment=PUID=0 Environment=PGID=0 Environment=TZ=America/Los_Angeles Environment=UMASK_SET=022 Volume=/Volumes/COMPLETE/prowlarr-data:/config PublishPort=9696:9696 [Service] TimeoutStartSec=900 Restart=always ``` ## Live wiring (verified end-to-end 2026-08-30) Indexer queries flow **through** Prowlarr; a grab hands off to the querying app's own qBittorrent download client. Feeds are per-indexer: ``` http://prowlarr:9696/{indexerId}/api?apikey={GLOBAL_KEY}&t=caps|search|tvsearch|movie|music|book&... http://prowlarr:9696/{indexerId}/download?link=...&file=... (torrent handoff) ``` | App | Indexer row | Prowlarr id | Categories | Status | |---|---|---|---|---| | Radarr | Prowlarr-YTS | 7 | [2000] | ✅ grabbed + imported 2160p Dark Knight 2026-08-30 | | Sonarr | Prowlarr-Nyaa | 4 | [5000] | ✅ connection validated (202) | | Lidarr | Prowlarr-Nyaa | 4 | [3000] | ✅ connection validated (202) | | Readarr | Prowlarr-Byrutor | 3 | [7000] | indexer valid; download client parked | The global API key is in `config.xml` (``); per-application keys are only used by Prowlarr's own sync calls, NOT by the feeds. The arr download clients authenticate to qBittorrent with the permanent WebUI password stored in `/home/dank/.qbpass` (mode 600, owner `dank`) on Dankserver — [[qBittorrent]] for why that password must be pinned in the conf file. **Readarr caveat:** Readarr is abandoned upstream; its qBittorrent client cannot authenticate against newer qB Web-API versions (`Authentication failure` on the connection test while Sonarr/Lidarr/Radarr pass with the same credentials — root cause: qB ≥ 5's 204 empty-body login success, fixed fleet- wide by pinning qB to 4.6.7). The books pipeline is parked pending a Readarr successor; the indexer row itself is healthy. ## Gotchas (verified live 2026-08-30) - **The feed route is `/{indexerId}/api`.** There is no `/torznab/{id}/feed` — that path (and any other unmatched path) hits the Forms-auth catch-all and gets `302 → /login?returnUrl=…`. An arr following the redirect parses the login HTML and fails with a cryptic `'/' is an unexpected token … Line 54` XML error that looks like an auth problem. It is a path typo. Source: `NewznabController` (`[HttpGet("{id:int}/api")]` + absolute `/api/v1/indexer/{id}/newznab`). - **The arr's Torznab joiner is `TrimEnd(baseUrl,'/') + apiPath` with NO separator.** `baseUrl="…/7/" + apiPath="api"` silently becomes `…/7api`. Either keep the leading slash on `apiPath` (`"/api"`) or end the baseUrl with `/api`. - Categories in the indexer row must be a subset of what the feed's `caps` advertises; extras log "does not support the following categories" and some feeds reject them. - **A freshly created indexer row defaults to all-off.** If `enableRss` `enableAutomaticSearch`, or `enableInteractiveSearch` aren't set, the app logs `Searching indexers for [X]. 0 active indexers` (Lidarr, verified). Search proves TV + music chains 2026-08-30: Sonarr returned 76 live releases for an anime term, Lidarr 18 for YOASOBI – THE BOOK, all via the Prowlarr-Nyaa feed. - The v1 API collection is `/api/v1/applications` (not `/api/v1/app`) GET responses carry `fields: []` — real settings values live in `prowlarr.db` → `Applications.Settings` JSON (read-only inspection). - Instance name/`InstanceName=Prowlarr` in `config.xml` does NOT prefix the API/feed routes on this build (they answer at root; the `/Prowlarr/...` prefix 302s to the SPA). - **Application auto-sync model (v2):** Applications are first-class rows in the `Applications` table; each of the four app rows (sonarr/radarr/lidarr/ readarr) carries the real baseUrl+apiKey with `SyncLevel=FullSync`. The earlier v1-era failure where `POST /api/v1/applications/test` threw `Unable to cast object of type 'NzbDrone.Core.Thing…'` (v1 could not deserialize Radarr 6.3's newer response types) is historical — it was the reason the manual Torznab rows were created in the first place. - Prowlarr runs `AuthenticationMethod=Forms` + `AuthenticationRequired=Enabled` healthily — the DryIoc crash combo was `None`+`Enabled` only (see [[radarr]] auth notes). ## See Also - [[ARR-Stack]] — full *arr stack documentation - [[Radarr]] · [[Sonarr]] · [[Lidarr]] · [[Readarr]] · [[qBittorrent]]