Web Nodes endpoints (Admin API)
20 FeatherPanel Admin API endpoints from admin/web-nodes.php: methods, paths, auth, permissions, rate limits, parameters and responses.
Last synced from FeatherPanel 15b94e9 on .
On this page
Defined in backend/app/routes/admin/web-nodes.php. Authentication used here: Admin. Read Authentication for how to send credentials and 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
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) |
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}
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 |
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
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 (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) |
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
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}
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 (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) |
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
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}
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 |
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
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
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 |
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
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
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 |
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
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 |
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
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 |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes | |
file | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes | |
packageId | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes | |
packageId | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
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
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id | path | - | yes |
curl -X POST "$PANEL_URL/api/admin/web-nodes/$ID/self-update" \
-H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
-H "Accept: application/json"