Pulsarr

Update configuration

PUT
/v1/config

Update the application configuration settings

Authorization

headerX-API-Key<token>

API key authentication using X-API-Key header

Request Body

Writable configuration fields; server-internal settings are rejected

application/json
  1. body

Writable configuration fields; server-internal settings are rejected

baseUrl?string|string
port?integer
Range1 <= value <= 65535
dbPath?string
cookieSecured?boolean
logLevel?ConfigLogLevel

How much Pulsarr writes to its log

Value in"fatal""error""warn""info""debug""trace""silent"
closeGraceDelay?number
rateLimitMax?number
queueProcessDelaySeconds?number
maintainerrEnabled?boolean
maintainerrUrl?string|string
maintainerrExclusionMode?MaintainerrExclusionMode

Exclude Maintainerr-handled media for its current watchlisters, or globally for every user

Value in"watchlisters""global"
discordWebhookUrl?string
discordBotToken?string
discordClientId?string
systemAppriseUrl?string
appriseEmailSender?string
publicContentNotifications?
plexMobileEnabled?boolean
queueWaitTime?integer
Range0 <= value <= 1800000
newEpisodeThreshold?integer
Range0 <= value <= 2592000000
notifyOnUpdate?UpdateNotifyOption

Channels an admin notification goes to

Value in"none""all""discord-only""apprise-only""webhook-only""dm-only"
notifyOnAvailability?boolean
pendingWebhookRetryInterval?number
pendingWebhookMaxAge?number
pendingWebhookCleanupInterval?number
plexTokens?array<string>

Plex authentication tokens

skipFriendSync?boolean
deleteMovie?boolean
deleteEndedShow?boolean
deleteContinuingShow?boolean
deleteFiles?boolean
respectUserSyncSetting?boolean
deleteSyncNotify?DeleteSyncNotifyOption

Channels the delete sync run summary goes to, legacy aliases included

Value in"none""message""webhook""both""all""discord-only""apprise-only""webhook-only""dm-only""discord-webhook""discord-message""discord-both"
approvalNotify?NotifyOption

Channels an admin notification goes to, legacy aliases included

Value in"none""all""discord-only""apprise-only""webhook-only""dm-only""discord-webhook""discord-message""discord-both"
watchlistCapNotify?NotifyOption

Channels an admin notification goes to, legacy aliases included

Value in"none""all""discord-only""apprise-only""webhook-only""dm-only""discord-webhook""discord-message""discord-both"
watchlistCapNotifyUser?boolean
watchlistAddNotify?NotifyOption

Channels an admin notification goes to, legacy aliases included

Value in"none""all""discord-only""apprise-only""webhook-only""dm-only""discord-webhook""discord-message""discord-both"
deleteSyncNotifyOnlyOnDeletion?boolean
maxDeletionPrevention?number
Range1 <= value <= 100
deletionMode?DeletionMode

Whether delete sync targets content off every watchlist or content carrying the removal tag

Value in"watchlist""tag-based"
removedTagPrefix?string
Match^[a-zA-Z0-9-]+$
Length1 <= length
deleteSyncRequiredTagRegex?string
Lengthlength <= 1024
deleteSyncTrackedOnly?boolean
deleteSyncCleanupApprovals?boolean
removedTagMode?RemovedTagMode

What happens to a user tag once that user drops the content

Value in"remove""keep""special-tag"
enablePlexPlaylistProtection?boolean
plexProtectionPlaylistName?string
plexServerUrl?string|string
skipIfExistsOnPlex?boolean
plexLabelSync?

Writable Plex label sync settings. Send the whole object, it replaces the stored one.

selfRss?string
friendsRss?string
_isReady?boolean
plexSessionMonitoring?
newUserDefaultCanSync?boolean
newUserDefaultRequiresApproval?boolean
newUserDefaultMovieQuotaEnabled?boolean
newUserDefaultMovieQuotaType?QuotaType

Quota window, the current day, a rolling run of days, or a monthly period from the configured reset day

Value in"daily""weekly_rolling""monthly"
newUserDefaultMovieQuotaLimit?integer
Range1 <= value <= 1000
newUserDefaultMovieBypassApproval?boolean
newUserDefaultMovieWatchlistCap?|null
newUserDefaultShowQuotaEnabled?boolean
newUserDefaultShowQuotaType?QuotaType

Quota window, the current day, a rolling run of days, or a monthly period from the configured reset day

Value in"daily""weekly_rolling""monthly"
newUserDefaultShowQuotaLimit?integer
Range1 <= value <= 1000
newUserDefaultShowBypassApproval?boolean
newUserDefaultShowWatchlistCap?|null
quotaSettings?

Writable quota settings. Send the whole object, it replaces the stored one.

approvalExpiration?

Writable approval expiry and cleanup settings. Send the whole object, it replaces the stored one.

tmdbRegion?string
Match^[A-Z]{2}$
tagUsersInSonarr?boolean
tagUsersInRadarr?boolean
cleanupOrphanedTags?boolean
tagPrefix?string
Match^[a-zA-Z0-9-]+$
Length1 <= length
tagNamingSource?UserNamingSource

Which user name a per-user tag or label is built from

Value in"username""alias"
tagMigration?

Tag format migration status per Radarr/Sonarr instance

Response Body

Default Response

application/json
  1. response

Configuration response envelope

success*boolean
config*

Complete application configuration; server-internal secrets are never included

webhooks?

Per-instance webhook outcomes for every Radarr and Sonarr

Example Request
curl -X PUT 'http://localhost:3003/v1/config' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "success": true,  "config": {    "id": 0,    "created_at": "string",    "updated_at": "string",    "baseUrl": "string",    "port": 1,    "dbPath": "string",    "cookieSecured": true,    "logLevel": "fatal",    "closeGraceDelay": 0,    "rateLimitMax": 0,    "queueProcessDelaySeconds": 0,    "maintainerrEnabled": true,    "maintainerrUrl": "string",    "maintainerrExclusionMode": "watchlisters",    "discordWebhookUrl": "string",    "discordBotToken": "string",    "discordClientId": "string",    "enableApprise": true,    "appriseUrl": "string",    "systemAppriseUrl": "string",    "appriseEmailSender": "string",    "publicContentNotifications": {      "enabled": true,      "discordWebhookUrls": "string",      "discordWebhookUrlsMovies": "string",      "discordWebhookUrlsShows": "string",      "appriseUrls": "string",      "appriseUrlsMovies": "string",      "appriseUrlsShows": "string"    },    "plexMobileEnabled": true,    "deletionMode": "watchlist",    "queueWaitTime": 0,    "newEpisodeThreshold": 0,    "notifyOnUpdate": "none",    "notifyOnAvailability": true,    "pendingWebhookRetryInterval": 0,    "pendingWebhookMaxAge": 0,    "pendingWebhookCleanupInterval": 0,    "tmdbRegion": "string",    "plexTokens": [      "string"    ],    "skipFriendSync": true,    "plexServerUrl": "string",    "skipIfExistsOnPlex": true,    "deleteMovie": true,    "deleteEndedShow": true,    "deleteContinuingShow": true,    "deleteFiles": true,    "respectUserSyncSetting": true,    "deleteSyncNotify": "none",    "approvalNotify": "none",    "watchlistCapNotify": "none",    "watchlistCapNotifyUser": true,    "watchlistAddNotify": "none",    "deleteSyncNotifyOnlyOnDeletion": true,    "maxDeletionPrevention": 0,    "deleteSyncTrackedOnly": true,    "deleteSyncCleanupApprovals": true,    "deleteSyncRequiredTagRegex": "string",    "enablePlexPlaylistProtection": true,    "plexProtectionPlaylistName": "string",    "plexLabelSync": {      "enabled": true,      "labelPrefix": "string",      "labelNamingSource": "username",      "cleanupOrphanedLabels": true,      "removedLabelMode": "remove",      "removedLabelPrefix": "string",      "autoResetOnScheduledSync": true,      "tagSync": {        "enabled": true,        "syncRadarrTags": true,        "syncSonarrTags": true      }    },    "selfRss": "string",    "friendsRss": "string",    "tagUsersInSonarr": true,    "tagUsersInRadarr": true,    "cleanupOrphanedTags": true,    "tagPrefix": "string",    "tagNamingSource": "username",    "removedTagMode": "remove",    "removedTagPrefix": "string",    "tagMigration": {      "radarr": {        "property1": {          "completed": true,          "migratedAt": "string",          "tagsMigrated": 0,          "contentUpdated": 0        },        "property2": {          "completed": true,          "migratedAt": "string",          "tagsMigrated": 0,          "contentUpdated": 0        }      },      "sonarr": {        "property1": {          "completed": true,          "migratedAt": "string",          "tagsMigrated": 0,          "contentUpdated": 0        },        "property2": {          "completed": true,          "migratedAt": "string",          "tagsMigrated": 0,          "contentUpdated": 0        }      }    },    "plexSessionMonitoring": {      "enabled": true,      "pollingIntervalMinutes": 0,      "remainingEpisodes": 0,      "filterUsers": [        "string"      ],      "enableAutoReset": true,      "inactivityResetDays": 0,      "autoResetIntervalHours": 0,      "enableProgressiveCleanup": true    },    "newUserDefaultCanSync": true,    "newUserDefaultRequiresApproval": true,    "newUserDefaultMovieQuotaEnabled": true,    "newUserDefaultMovieQuotaType": "daily",    "newUserDefaultMovieQuotaLimit": 0,    "newUserDefaultMovieBypassApproval": true,    "newUserDefaultMovieWatchlistCap": 0,    "newUserDefaultShowQuotaEnabled": true,    "newUserDefaultShowQuotaType": "daily",    "newUserDefaultShowQuotaLimit": 0,    "newUserDefaultShowBypassApproval": true,    "newUserDefaultShowWatchlistCap": 0,    "quotaSettings": {      "cleanup": {        "enabled": true,        "retentionDays": 0      },      "weeklyRolling": {        "resetDays": 0      },      "monthly": {        "resetDay": 0,        "handleMonthEnd": "last-day"      }    },    "approvalExpiration": {      "enabled": true,      "defaultExpirationHours": 0,      "expirationAction": "expire",      "autoApproveOnQuotaAvailable": true,      "quotaExceededExpirationHours": 0,      "routerRuleExpirationHours": 0,      "manualFlagExpirationHours": 0,      "contentCriteriaExpirationHours": 0,      "cleanupExpiredDays": 0    },    "_isReady": true  },  "webhooks": {    "radarr": [      {        "instanceId": 0,        "name": "string",        "success": true,        "code": "callback_failed",        "message": "string"      }    ],    "sonarr": [      {        "instanceId": 0,        "name": "string",        "success": true,        "code": "callback_failed",        "message": "string"      }    ]  }}