Skip to content

Configuration

All settings can be changed at runtime via the web UI (Settings tab) or the PUT /api/v1/settings endpoint.

Settings are persisted to config/settings.json in the data directory. They survive container rebuilds, image pulls, and process restarts. Map the config directory as a volume (-v ./config:/app/config) to retain all state (settings, API keys, logs, queue) across Docker lifecycles.

Settings Reference

FieldTypeDefaultDescription
maxConcurrentDownloadsnumber2Maximum parallel downloads
maxBandwidthnumber0Bandwidth limit in bytes/sec (0 = unlimited)
schedulesSchedule[][]Time windows when downloads are allowed
webhooksWebhook[][]URLs to POST download event notifications
incompletePathstringenv INCOMPLETE_PATHDirectory for in-progress downloads
completedPathstringenv COMPLETED_PATHRoot directory for completed media
testModebooleanfalseSkip actual downloads, mark jobs as complete

Schedules

Schedule windows restrict downloads to specific days and times. When schedules are configured and the current time is outside all windows, the queue pauses automatically.

json
{
  "schedules": [
    {
      "days": [1, 2, 3, 4, 5],
      "windows": [{ "start": "02:00", "end": "06:00" }]
    }
  ]
}
  • days: 0 = Sunday, 1 = Monday, ..., 6 = Saturday
  • windows: Time ranges in 24-hour HH:MM format. Windows can span midnight (e.g., 22:00 to 04:00).

Webhooks

Friendarr sends HTTP POST notifications to configured webhook URLs on download events.

json
{
  "webhooks": [
    {
      "id": "wh-1",
      "url": "https://hooks.example.com/friendarr",
      "events": ["download.started", "download.complete", "download.failed"],
      "secret": "optional-hmac-secret",
      "enabled": true
    }
  ]
}

Webhook Events

EventFires when
download.requestedA download is queued
download.startedA download begins processing
download.completeA download finishes successfully
download.failedA download fails

Webhook Payload

json
{
  "event": "download.complete",
  "downloadId": "uuid",
  "timestamp": "2026-01-01T00:00:00.000Z",
  "request": {
    "source": { "type": "plex", "url": "...", "authToken": "***" },
    "destination": { "title": "Movie Name", "year": 2024 }
  },
  "outputPath": "/downloads/complete/movies/Movie Name (2024)/movie.mkv"
}

The authToken is redacted to *** in webhook payloads.

Signature Verification

If secret is set, each webhook includes an X-Friendarr-Signature header containing the HMAC-SHA256 hex digest of the request body.

Test Mode

Enable testMode in settings to skip actual downloads. Jobs will be marked complete immediately with a fake output path. Useful for testing the queue, webhooks, and UI without a real media server.

Released under the MIT License.