# Plugins endpoints (Admin API)

> 12 FeatherPanel Admin API endpoints from admin/plugins.php: methods, paths, auth, permissions, rate limits, parameters and responses.

Source: https://featherpanel.com/docs/api/reference/admin/plugins/

Defined in [`backend/app/routes/admin/plugins.php`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php). Authentication used here: **Admin**. Read [Authentication](https://featherpanel.com/docs/api/authentication/) for how to send credentials and [Rate limits and errors](https://featherpanel.com/docs/api/rate-limits-and-errors/) for the response envelope.

Paths, methods, permissions and rate limits come from the route file. Summaries, parameters and response codes come from the OpenAPI annotations on the controllers; endpoints without annotations show only what the route file declares.

## Endpoints

### GET `/api/admin/plugins`

- Auth: Admin
- Permission: `admin.plugins.view`
- Route name: `admin-plugins`
- Controller: [`PluginsController::index`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L26)

**Get all installed plugins** Retrieve a list of all installed plugins with their configuration, status, dependencies, and missing configurations.

| Response `data` field | Type | Description |
| --- | --- | --- |
| `plugins` | object |  |

```bash
curl -X GET "$PANEL_URL/api/admin/plugins" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Plugins retrieved successfully · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `500` Internal server error - Failed to fetch plugins

### GET `/api/admin/plugins/{identifier}/config`

- Auth: Admin
- Permission: `admin.plugins.view`
- Route name: `admin-plugins-config`
- Controller: [`PluginsController::getConfig`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L36)

**Get plugin configuration** Retrieve detailed configuration information for a specific plugin including settings and configuration schema.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `config` | PluginInfo |  |
| `plugin` | PluginInfo |  |
| `settings` | object | Plugin settings key-value pairs |
| `configSchema` | object\[\] | Plugin configuration schema |

```bash
curl -X GET "$PANEL_URL/api/admin/plugins/$IDENTIFIER/config" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Plugin configuration retrieved successfully · `400` Bad request - Invalid plugin identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Plugin not found · `500` Internal server error - Failed to fetch plugin configuration

### GET `/api/admin/plugins/{identifier}/visibility`

- Auth: Admin
- Permission: `admin.plugins.view`
- Route name: `admin-plugins-visibility`
- Controller: [`PluginsController::getVisibility`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L51)

**Get plugin frontend visibility controls** List widgets, sidebar routes, public pages, and UI-pack entries that admins can hide for a plugin.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier |

```bash
curl -X GET "$PANEL_URL/api/admin/plugins/$IDENTIFIER/visibility" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Plugin visibility controls retrieved successfully · `404` Plugin not found

### POST `/api/admin/plugins/{identifier}/settings/set`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-settings-set`
- Controller: [`PluginsController::setSettings`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L66)

**Set plugin setting** Set a specific setting value for a plugin. Logs the activity and emits events for tracking.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier |

Request body: [`PluginSettingUpdate`](https://featherpanel.com/docs/api/schemas/#schema-pluginsettingupdate) (application/json)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes | Setting key |
| `value` | string | yes | Setting value |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Plugin identifier |
| `key` | string | Setting key |
| `value` | string | Setting value |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/$IDENTIFIER/settings/set" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"key":"","value":""}'
```

Plugin events: [`plugins:settings:update`](https://featherpanel.com/docs/plugins/events/plugins-settings/#plugin-setting-update)

Responses: `200` Plugin setting updated successfully · `400` Bad request - Invalid JSON, missing key/value, invalid plugin identifier, or a value that fails the conf.yml required/validation rules (PLUGIN\_SETTING\_INVALID) · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Plugin not found · `500` Internal server error - Failed to update setting

### POST `/api/admin/plugins/{identifier}/settings/remove`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-settings-remove`
- Controller: [`PluginsController::removeSettings`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L82)

**Remove plugin setting** Remove a specific setting from a plugin. Logs the activity and emits events for tracking.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier |

Request body: [`PluginSettingRemove`](https://featherpanel.com/docs/api/schemas/#schema-pluginsettingremove) (application/json)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `key` | string | yes | Setting key to remove |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Plugin identifier |
| `key` | string | Removed setting key |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/$IDENTIFIER/settings/remove" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"key":""}'
```

Plugin events: [`plugins:settings:delete`](https://featherpanel.com/docs/plugins/events/plugins-settings/#plugin-setting-delete)

Responses: `200` Plugin setting removed successfully · `400` Bad request - Invalid JSON, missing key, or invalid plugin identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Plugin not found · `500` Internal server error - Failed to remove setting

### POST `/api/admin/plugins/{identifier}/spell-restrictions`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-spell-restrictions`
- Controller: [`PluginsController::setSpellRestrictions`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L98)

**Set plugin spell restrictions for server sidebar** Configure which server spells (server types) a plugin's sidebar items should be shown on. If empty, plugin shows on all server types. If set, plugin only shows on specified spell IDs.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier |

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `allowedOnlyOnSpells` | integer\[\] | no | Array of spell IDs where this plugin should be shown. Empty array means show on all spells. |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Plugin identifier |
| `allowedOnlyOnSpells` | integer\[\] | Updated spell IDs |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/$IDENTIFIER/spell-restrictions" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"allowedOnlyOnSpells":[]}'
```

Responses: `200` Spell restrictions updated successfully · `400` Bad request - Invalid JSON or invalid plugin identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Plugin not found · `500` Internal server error - Failed to update spell restrictions

### POST `/api/admin/plugins/{identifier}/uninstall`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-uninstall`
- Controller: [`PluginsController::uninstall`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L114)

**Uninstall addon** Completely remove an addon from the system including its files, public assets, and database migrations. Calls the plugin uninstall hook if available.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Addon identifier to uninstall |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `message` | string | Success message |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/$IDENTIFIER/uninstall" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Addon uninstalled successfully · `400` Bad request - Invalid addon identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Addon not found · `500` Internal server error - Failed to uninstall addon

### GET `/api/admin/plugins/{identifier}/export`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-export`
- Controller: [`PluginsController::export`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L130)

**Export addon** Export an installed addon as a password-protected .fpa file for backup or distribution purposes.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Addon identifier to export |

```bash
curl -X GET "$PANEL_URL/api/admin/plugins/$IDENTIFIER/export" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Addon exported successfully · `400` Bad request - Invalid addon identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Addon not found · `500` Internal server error - Failed to export addon

### POST `/api/admin/plugins/upload/install`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-upload-install`
- Controller: [`PluginsController::uploadInstall`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L145)

**Install addon from uploaded file** Upload and install an addon from a .fpa file. Extracts the password-protected archive and installs the addon.

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `file` | string (binary) | yes | Addon .fpa file to upload |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Installed addon identifier |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/upload/install" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -F "file=@./file"
```

Responses: `201` Addon installed successfully · `400` Bad request - No file uploaded, file upload error, or invalid file type · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `409` Conflict - Addon already installed · `422` Unprocessable Entity - Failed to extract addon package or migrations failed · `500` Internal server error - Failed to install addon

### POST `/api/admin/plugins/upload/install-url`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-upload-install-url`
- Controller: [`PluginsController::uploadInstallFromUrl`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L156)

**Install addon from URL** Download and install an addon from a remote URL. Downloads the file and extracts the password-protected archive.

Request body: [`UrlInstall`](https://featherpanel.com/docs/api/schemas/#schema-urlinstall) (application/json)

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `url` | string (uri) | yes | URL to download addon from |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Installed addon identifier |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/upload/install-url" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"url":""}'
```

Responses: `201` Addon installed successfully · `400` Bad request - Invalid URL format · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `409` Conflict - Addon already installed · `422` Unprocessable Entity - Failed to extract addon package or migrations failed · `500` Internal server error - Failed to install addon or download file from URL

### POST `/api/admin/plugins/{identifier}/resync-symlinks`

- Auth: Admin
- Permission: `admin.plugins.manage`
- Route name: `admin-plugins-resync-symlinks`
- Controller: [`PluginsController::resyncSymlinks`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/PluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L167)

**Resync plugin symlinks** Recreate symlinks for plugin public assets and frontend components without reinstalling the plugin. Useful when symlinks are broken or missing.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `identifier` | path | string | yes | Plugin identifier to resync symlinks for |

| Response `data` field | Type | Description |
| --- | --- | --- |
| `identifier` | string | Plugin identifier |
| `public_assets` | boolean | Whether public assets symlink was created |
| `frontend_components` | boolean | Whether frontend components symlink was created |

```bash
curl -X POST "$PANEL_URL/api/admin/plugins/$IDENTIFIER/resync-symlinks" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Symlinks resynced successfully · `400` Bad request - Invalid plugin identifier · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Plugin not found · `500` Internal server error - Failed to resync symlinks

### GET `/api/admin/plugins/previously-installed`

- Auth: Admin
- Permission: `admin.plugins.view`
- Route name: `admin-plugins-previously-installed`
- Controller: [`CloudPluginsController::getPreviouslyInstalled`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/CloudPluginsController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/plugins.php#L183)

**Get previously installed plugins** Retrieve a list of plugins that were previously installed (including uninstalled ones) to help users restore them after FeatherPanel updates.

| Response `data` field | Type | Description |
| --- | --- | --- |
| `plugins` | object\[\] |  |

```bash
curl -X GET "$PANEL_URL/api/admin/plugins/previously-installed" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Previously installed plugins retrieved successfully · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `500` Internal server error
