# Web Nodes endpoints (Admin API)

> 20 FeatherPanel Admin API endpoints from admin/web-nodes.php: methods, paths, auth, permissions, rate limits, parameters and responses.

Source: https://featherpanel.com/docs/api/reference/admin/web-nodes/

Defined in [`backend/app/routes/admin/web-nodes.php`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.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/web-nodes`

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

**Get all FeatherQuilld web nodes** Retrieve a paginated list of all web nodes (FeatherQuilld daemons) with optional search and web-location filtering.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | integer | no | Page number for pagination |
| `limit` | query | integer | no | Number of records per page |
| `search` | query | string | no | Search term to filter web nodes by name or FQDN |
| `location_id` | query | integer | no | Location ID to filter web nodes by (must be type=web) |

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

Responses: `200` Web nodes retrieved successfully · `401` Unauthorized · `403` Forbidden - Insufficient permissions

### GET `/api/admin/web-nodes/{id}`

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

**Get web node by ID** Retrieve a specific web node by its ID.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

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

Responses: `200` Web node retrieved successfully · `400` Bad request - Invalid web node ID · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Web node not found

### PUT `/api/admin/web-nodes`

- Auth: Admin
- Permission: `admin.nodes.create`
- Route name: `admin-web-nodes-create`
- Controller: [`WebNodesController::create`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L51)

**Create new web node** Create a new web node (FeatherQuilld daemon) associated with a web hosting location. Daemon tokens are auto-generated.

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

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes | Web Node name |
| `description` | string | no | Web Node description |
| `location_id` | integer | yes | Location ID (must be type=web) |
| `fqdn` | string | yes | FeatherQuilld host FQDN or IP |
| `scheme` | string | no | Connection scheme |
| `public` | boolean | no | Whether the node is publicly visible |
| `behind_proxy` | boolean | no | Whether the node is behind a reverse proxy |
| `maintenance_mode` | boolean | no | Whether the node is in maintenance mode |
| `memory` | integer | no | Memory allocation in MB |
| `memory_overallocate` | integer | no | Memory overallocation percentage |
| `disk` | integer | no | Disk allocation in MB |
| `disk_overallocate` | integer | no | Disk overallocation percentage |
| `upload_size` | integer | no | Max upload size in MB |
| `daemonListen` | integer | no | FeatherQuilld daemon listen port |
| `daemonBase` | string | no | FeatherQuilld daemon base path |
| `websitesPath` | string | no | Path where hosted websites are stored (defaults to {daemonBase}/websites) |
| `backupsPath` | string | no | Path where website backups are stored (defaults to {daemonBase}/backups) |
| `backupsProvider` | string | no | Backup storage provider: local or s3 |
| `backupsS3Endpoint` | string | no | S3-compatible endpoint URL (empty = AWS default) |
| `backupsS3Region` | string | no | S3 region |
| `backupsS3Bucket` | string | no | S3 bucket name |
| `backupsS3AccessKey` | string | no | S3 access key |
| `backupsS3SecretKey` | string | no | S3 secret key |
| `backupsS3Prefix` | string | no | S3 object key prefix |
| `backupsS3ForcePathStyle` | boolean | no | Force path-style S3 addressing (MinIO, etc.) |
| `addonsPath` | string | no | Plugins path; only emitted in config when explicitly set |
| `quilldConfigOverrides` | string | no | Optional JSON merged into generated FeatherQuilld config |
| `remoteTimeout` | integer | no | Panel API request timeout in seconds |
| `remoteRetryLimit` | integer | no | Panel API retry limit |
| `remoteCustomHeaders` | string | no | Optional JSON object of custom HTTP headers (remote.custom\_headers) |
| `sftpEnabled` | boolean | no | Whether SFTP is enabled |
| `sftpKeyAlgorithm` | string | no | SSH key algorithm for SFTP |
| `sftpPort` | integer | no | SFTP listen port |
| `sftpDisablePasswordAuth` | boolean | no | Disable SFTP password authentication |
| `proxyEnabled` | boolean | no | Whether FeatherQuilld terminates HTTP(S) for WebSpaces |
| `proxyProvider` | string | no | Reverse proxy provider: caddy, nginx, or traefik |
| `acmeEmail` | string | no | Optional ACME fallback email (site owner account email is preferred) |
| `acmeStaging` | boolean | no | Use Let’s Encrypt staging ACME directory |
| `backendPortMin` | integer | no | Loopback backend port range start (system.proxy.backend\_port\_min) |
| `backendPortMax` | integer | no | Loopback backend port range end (system.proxy.backend\_port\_max) |
| `id` | integer | no | Optional web node ID (useful for migrations) |

```bash
curl -X PUT "$PANEL_URL/api/admin/web-nodes" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","description":"","location_id":0,"fqdn":"","scheme":"","public":false,"behind_proxy":false,"maintenance_mode":false,"memory":0,"memory_overallocate":0,"disk":0,"disk_overallocate":0,"upload_size":0,"daemonListen":0,"daemonBase":"","websitesPath":"","backupsPath":"","backupsProvider":"","backupsS3Endpoint":"","backupsS3Region":"","backupsS3Bucket":"","backupsS3AccessKey":"","backupsS3SecretKey":"","backupsS3Prefix":"","backupsS3ForcePathStyle":false,"addonsPath":"","quilldConfigOverrides":"","remoteTimeout":0,"remoteRetryLimit":0,"remoteCustomHeaders":"","sftpEnabled":false,"sftpKeyAlgorithm":"","sftpPort":0,"sftpDisablePasswordAuth":false,"proxyEnabled":false,"proxyProvider":"","acmeEmail":"","acmeStaging":false,"backendPortMin":0,"backendPortMax":0,"id":0}'
```

Plugin events: [`featherpanel:web:node:create`](https://featherpanel.com/docs/plugins/events/web-node/#web-node-created)

Responses: `201` Web node created successfully · `400` Bad request - Invalid JSON, validation errors, location not found or not web · `401` Unauthorized · `403` Forbidden - Insufficient permissions

### PATCH `/api/admin/web-nodes/{id}`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-update`
- Controller: [`WebNodesController::update`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L62)

**Update web node** Update an existing web node. Only provided fields will be updated. Validates location existence and type.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

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

| Body field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no | Web Node name |
| `description` | string | no | Web Node description |
| `location_id` | integer | no | Location ID (must be type=web) |
| `fqdn` | string | no | FeatherQuilld host FQDN or IP |
| `scheme` | string | no | Connection scheme |
| `public` | boolean | no | Whether the node is publicly visible |
| `behind_proxy` | boolean | no | Whether the node is behind a reverse proxy |
| `maintenance_mode` | boolean | no | Whether the node is in maintenance mode |
| `memory` | integer | no | Memory allocation in MB |
| `memory_overallocate` | integer | no | Memory overallocation percentage |
| `disk` | integer | no | Disk allocation in MB |
| `disk_overallocate` | integer | no | Disk overallocation percentage |
| `upload_size` | integer | no | Max upload size in MB |
| `daemonListen` | integer | no | FeatherQuilld daemon listen port |
| `daemonBase` | string | no | FeatherQuilld daemon base path |
| `websitesPath` | string | no | Volumes path (system.data); defaults to {daemonBase}/volumes |
| `backupsPath` | string | no | Backup path (system.backup\_directory); defaults to {daemonBase}/backups |
| `backupsProvider` | string | no | Backup storage provider: local or s3 |
| `backupsS3Endpoint` | string | no | S3-compatible endpoint URL (empty = AWS default) |
| `backupsS3Region` | string | no | S3 region |
| `backupsS3Bucket` | string | no | S3 bucket name |
| `backupsS3AccessKey` | string | no | S3 access key |
| `backupsS3SecretKey` | string | no | S3 secret key |
| `backupsS3Prefix` | string | no | S3 object key prefix |
| `backupsS3ForcePathStyle` | boolean | no | Force path-style S3 addressing (MinIO, etc.) |
| `addonsPath` | string | no | Plugins path; only emitted in config when explicitly set |
| `quilldConfigOverrides` | string | no | Optional JSON merged into generated FeatherQuilld config |
| `remoteTimeout` | integer | no | Panel API request timeout in seconds |
| `remoteRetryLimit` | integer | no | Panel API retry limit |
| `remoteCustomHeaders` | string | no | Optional JSON object of custom HTTP headers (remote.custom\_headers) |
| `sftpEnabled` | boolean | no | Whether SFTP is enabled |
| `sftpKeyAlgorithm` | string | no | SSH key algorithm for SFTP |
| `sftpPort` | integer | no | SFTP listen port |
| `sftpDisablePasswordAuth` | boolean | no | Disable SFTP password authentication |
| `proxyEnabled` | boolean | no | Whether FeatherQuilld terminates HTTP(S) for WebSpaces |
| `proxyProvider` | string | no | Reverse proxy provider: caddy, nginx, or traefik |
| `acmeEmail` | string | no | Optional ACME fallback email (site owner account email is preferred) |
| `acmeStaging` | boolean | no | Use Let’s Encrypt staging ACME directory |
| `backendPortMin` | integer | no | Loopback backend port range start (system.proxy.backend\_port\_min) |
| `backendPortMax` | integer | no | Loopback backend port range end (system.proxy.backend\_port\_max) |

```bash
curl -X PATCH "$PANEL_URL/api/admin/web-nodes/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","description":"","location_id":0,"fqdn":"","scheme":"","public":false,"behind_proxy":false,"maintenance_mode":false,"memory":0,"memory_overallocate":0,"disk":0,"disk_overallocate":0,"upload_size":0,"daemonListen":0,"daemonBase":"","websitesPath":"","backupsPath":"","backupsProvider":"","backupsS3Endpoint":"","backupsS3Region":"","backupsS3Bucket":"","backupsS3AccessKey":"","backupsS3SecretKey":"","backupsS3Prefix":"","backupsS3ForcePathStyle":false,"addonsPath":"","quilldConfigOverrides":"","remoteTimeout":0,"remoteRetryLimit":0,"remoteCustomHeaders":"","sftpEnabled":false,"sftpKeyAlgorithm":"","sftpPort":0,"sftpDisablePasswordAuth":false,"proxyEnabled":false,"proxyProvider":"","acmeEmail":"","acmeStaging":false,"backendPortMin":0,"backendPortMax":0}'
```

Plugin events: [`featherpanel:web:node:update`](https://featherpanel.com/docs/plugins/events/web-node/#web-node-updated)

Responses: `200` Web node updated successfully · `400` Bad request - Invalid JSON, no data provided, validation errors, location not found, or invalid location type · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Web node not found

### DELETE `/api/admin/web-nodes/{id}`

- Auth: Admin
- Permission: `admin.nodes.delete`
- Route name: `admin-web-nodes-delete`
- Controller: [`WebNodesController::delete`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L78)

**Delete web node** Permanently delete a web node from the database. This does not touch the FeatherQuilld daemon itself.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

```bash
curl -X DELETE "$PANEL_URL/api/admin/web-nodes/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Plugin events: [`featherpanel:web:node:delete`](https://featherpanel.com/docs/plugins/events/web-node/#web-node-deleted)

Responses: `200` Web node deleted successfully · `400` Bad request - Invalid web node ID · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Web node not found

### POST `/api/admin/web-nodes/{id}/reset-token`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-reset-token`
- Controller: [`WebNodesController::resetToken`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L94)

**Reset FeatherQuilld daemon token** Generate a new daemon token ID and secret for the web node. The FeatherQuilld daemon must be reconfigured with the new credentials.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

```bash
curl -X POST "$PANEL_URL/api/admin/web-nodes/$ID/reset-token" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Plugin events: [`featherpanel:web:node:key:reset`](https://featherpanel.com/docs/plugins/events/web-node/#web-node-key-reset)

Responses: `200` Daemon token reset successfully · `401` Unauthorized · `403` Forbidden - Insufficient permissions · `404` Web node not found

### GET `/api/admin/web-nodes/{id}/setup-command`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-setup-command`
- Controller: [`WebNodesController::getSetupCommand`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L110)

**Get FeatherQuilld setup command** Returns install command (step 1) and setup command (step 2) to configure the web node. Step 2 embeds full panel-generated config via join-data (Calagopus-style) or fetches from the panel.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

```bash
curl -X GET "$PANEL_URL/api/admin/web-nodes/$ID/setup-command" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

Responses: `200` Setup commands (install + config) · `401` Unauthorized · `403` Forbidden · `404` Web node not found

### GET `/api/admin/web-nodes/{id}/config`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-config`
- Controller: [`WebNodesController::getConfig`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L125)

**Get FeatherQuilld config YAML** Returns the full FeatherQuilld config.yml content for this web node (for manual copy or inspection).

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

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

Responses: `200` FeatherQuilld config YAML · `401` Unauthorized · `403` Forbidden · `404` Web node not found

### GET `/api/admin/web-nodes/{id}/health`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-health`
- Controller: [`WebNodesController::healthCheck`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L140)

**Probe FeatherQuilld daemon health** Calls GET /api/system/health on the web node daemon using its stored credentials.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | yes | Web Node ID |

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

Responses: `200` Health probe result · `401` Unauthorized · `403` Forbidden · `404` Web node not found

### GET `/api/admin/web-nodes/{id}/system`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-system`
- Controller: [`WebNodesController::systemInfo`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L155)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

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

### GET `/api/admin/web-nodes/{id}/utilization`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-utilization`
- Controller: [`WebNodesController::utilization`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L170)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

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

### GET `/api/admin/web-nodes/{id}/diagnostics`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-diagnostics`
- Controller: [`WebNodesController::diagnostics`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L185)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

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

### GET `/api/admin/web-nodes/{id}/system-logs`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-system-logs`
- Controller: [`WebNodesController::systemLogs`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L200)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

```bash
curl -X GET "$PANEL_URL/api/admin/web-nodes/$ID/system-logs" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### GET `/api/admin/web-nodes/{id}/system-logs/{file}`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-system-log-file`
- Controller: [`WebNodesController::systemLogFile`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L215)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |
| `file` | path | \- | yes |  |

```bash
curl -X GET "$PANEL_URL/api/admin/web-nodes/$ID/system-logs/$FILE" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### GET `/api/admin/web-nodes/{id}/packages`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-packages`
- Controller: [`WebNodesController::packages`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L234)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

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

### GET `/api/admin/web-nodes/{id}/packages/socket`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-packages-socket`
- Controller: [`WebNodesController::packageSocket`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L249)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

```bash
curl -X GET "$PANEL_URL/api/admin/web-nodes/$ID/packages/socket" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### POST `/api/admin/web-nodes/{id}/packages/{packageId}/install`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-packages-install`
- Controller: [`WebNodesController::installPackage`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L264)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |
| `packageId` | path | \- | yes |  |

```bash
curl -X POST "$PANEL_URL/api/admin/web-nodes/$ID/packages/$PACKAGE_ID/install" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### POST `/api/admin/web-nodes/{id}/packages/{packageId}/remove`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-packages-remove`
- Controller: [`WebNodesController::removePackage`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L284)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |
| `packageId` | path | \- | yes |  |

```bash
curl -X POST "$PANEL_URL/api/admin/web-nodes/$ID/packages/$PACKAGE_ID/remove" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### GET `/api/admin/web-nodes/{id}/version-status`

- Auth: Admin
- Permission: `admin.nodes.view`
- Route name: `admin-web-nodes-version-status`
- Controller: [`WebNodesController::versionStatus`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L304)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

```bash
curl -X GET "$PANEL_URL/api/admin/web-nodes/$ID/version-status" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```

### POST `/api/admin/web-nodes/{id}/self-update`

- Auth: Admin
- Permission: `admin.nodes.edit`
- Route name: `admin-web-nodes-self-update`
- Controller: [`WebNodesController::triggerSelfUpdate`](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/Controllers/Admin/WebNodesController.php)
- [route source](https://github.com/MythicalLTD/FeatherPanel/blob/15b94e9fc9df233123706b47c42728b81e48cb3d/backend/app/routes/admin/web-nodes.php#L319)

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | \- | yes |  |

```bash
curl -X POST "$PANEL_URL/api/admin/web-nodes/$ID/self-update" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"
```
