# API schemas

> The 307 named request and response models in the FeatherPanel OpenAPI document, with every field, its type and the endpoints that use it.

Source: https://featherpanel.com/docs/api/schemas/

These models come from the OpenAPI annotations on the panel controllers (exported with `php backend/scripts/export-openapi.php`). Endpoint pages link here when their body or response uses a named model. A model with no fields is declared but has no documented properties.

Filter schemas

307 schemas

## Schemas

### `ActivityPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `AdminUserServer`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Server ID |
| `uuid` | `string` | Server UUID |
| `uuidShort` | `string` | Short server UUID |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `status` | `string` | Server status |
| `created_at` | `string (date-time)` | Creation timestamp |

### `Allocation`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Allocation ID |
| `node_id` | `integer` | Node ID |
| `ip` | `string` | IP address |
| `ip_alias` | `string` | IP alias |
| `port` | `integer` | Port number |
| `server_id` | `integer` | Assigned server ID |
| `notes` | `string` | Allocation notes |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `AllocationDeleteResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |
| `deleted_allocation_id` | `integer` | ID of the deleted allocation |

Used by [`DELETE /api/user/servers/{uuidShort}/allocations/{allocationId}`](https://featherpanel.com/docs/api/reference/user/server/allocations/#delete-user-servers-uuidShort-allocations-allocationId)

### `AllocationResponse`

| Field | Type | Description |
| --- | --- | --- |
| `server` | [`ServerAllocationInfo`](#schema-serverallocationinfo) |  |
| `allocations` | [`ServerAllocation[]`](#schema-serverallocation) |  |

Used by [`GET /api/user/servers/{uuidShort}/allocations`](https://featherpanel.com/docs/api/reference/user/server/allocations/#get-user-servers-uuidShort-allocations)

### `ApiClient`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | API client ID |
| `user_uuid` | `string` | User UUID |
| `name` | `string` | API client name |
| `public_key` | `string` | Public API key |
| `private_key` | `string` | Private API key (only shown on creation) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `allowed_ips` | `string` | Allowed client IPs/CIDR (newline or comma separated); empty = no restriction |
| `notify_foreign_ip` | `string` | Email owner when a non-allowed IP attempts to use this key |

Used by [`POST /api/user/api-clients`](https://featherpanel.com/docs/api/reference/user/api-clients/#post-user-api-clients), [`GET /api/user/api-clients/{id}`](https://featherpanel.com/docs/api/reference/user/api-clients/#get-user-api-clients-id), [`PUT /api/user/api-clients/{id}`](https://featherpanel.com/docs/api/reference/user/api-clients/#put-user-api-clients-id), [`POST /api/user/api-clients/{id}/regenerate`](https://featherpanel.com/docs/api/reference/user/api-clients/#post-user-api-clients-id-regenerate)

### `ApiClientActivity`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Activity ID |
| `user_uuid` | `string` | User UUID |
| `name` | `string` | Activity name |
| `context` | `string` | Activity context |
| `ip_address` | `string` | IP address |
| `created_at` | `string (date-time)` | Creation timestamp |

### `ApiClientCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | API client name |
| `allowed_ips` | `string` | Allowed IPs/CIDR (newline or comma); omit or empty for no restriction |
| `notify_foreign_ip` | `boolean` | Email when the key is used from a non-allowed IP (requires allowed\_ips) |

Used by [`POST /api/user/api-clients`](https://featherpanel.com/docs/api/reference/user/api-clients/#post-user-api-clients)

### `ApiClientList`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | API client ID |
| `user_uuid` | `string` | User UUID |
| `name` | `string` | API client name |
| `public_key` | `string` | Public API key (truncated) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `allowed_ips` | `string` | Allowed client IPs/CIDR list |
| `notify_foreign_ip` | `string` |  |

### `ApiClientPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `ApiClientSearch`

| Field | Type | Description |
| --- | --- | --- |
| `query` | `string` | Search query |
| `has_results` | `boolean` | Whether search returned results |

### `ApiClientUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | API client name |
| `allowed_ips` | `string` | Allowed IPs/CIDR; empty/null clears restriction |
| `notify_foreign_ip` | `boolean` | Email when the key is used from a off-list IP |

Used by [`PUT /api/user/api-clients/{id}`](https://featherpanel.com/docs/api/reference/user/api-clients/#put-user-api-clients-id)

### `ApiClientValidationRequest`

| Field | Type | Description |
| --- | --- | --- |
| `public_key`required | `string` | Public API key to validate |

Used by [`POST /api/user/api-clients/validate`](https://featherpanel.com/docs/api/reference/user/api-clients/#post-user-api-clients-validate)

### `ApiClientValidationResponse`

| Field | Type | Description |
| --- | --- | --- |
| `valid` | `boolean` | Whether the API client is valid |

Used by [`POST /api/user/api-clients/validate`](https://featherpanel.com/docs/api/reference/user/api-clients/#post-user-api-clients-validate)

### `AutoAllocationResponse`

| Field | Type | Description |
| --- | --- | --- |
| `assigned_allocation` | [`ServerAllocation`](#schema-serverallocation) |  |
| `message` | `string` | Success message |

Used by [`POST /api/user/servers/{uuidShort}/allocations/auto`](https://featherpanel.com/docs/api/reference/user/server/allocations/#post-user-servers-uuidShort-allocations-auto)

### `Backup`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Backup ID |
| `server_id` | `integer` | Server ID |
| `uuid` | `string` | Backup UUID |
| `name` | `string` | Backup name |
| `ignored_files` | `string` | JSON string of ignored files |
| `disk` | `string` | Storage disk type |
| `is_successful` | `integer` | Whether backup was successful (0 or 1) |
| `is_stale` | `boolean` | Incomplete backup older than 24 hours; eligible for manual interruption recovery |
| `is_locked` | `integer` | Whether backup is locked (0 or 1) |
| `created_at` | `string (date-time)` | Backup creation timestamp |
| `updated_at` | `string (date-time)` | Backup update timestamp |

Used by [`GET /api/user/servers/{uuidShort}/backups/{backupUuid}`](https://featherpanel.com/docs/api/reference/user/server/backups/#get-user-servers-uuidShort-backups-backupUuid)

### `BackupCompletion`

| Field | Type | Description |
| --- | --- | --- |
| `checksum` | `string` | Backup file checksum, required on success |
| `checksum_type` | `string` | Type of checksum algorithm, required on success |
| `size` | `integer` | Backup file size in bytes, required on success |
| `successful`required | `boolean` | Whether backup was successful |
| `upload_id` | `string` | Upload ID for multipart uploads |

Used by [`POST /api/remote/backups/{backupUuid}`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-backups-backupUuid)

### `BackupCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string` | Custom backup UUID (optional) |
| `name` | `string` | Backup name (optional) |
| `ignore` | `string` | JSON string of files to ignore (optional) |

Used by [`POST /api/user/servers/{uuidShort}/backups`](https://featherpanel.com/docs/api/reference/user/server/backups/#post-user-servers-uuidShort-backups)

### `BackupCreateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Backup ID |
| `uuid` | `string` | Backup UUID |
| `name` | `string` | Backup name |
| `adapter` | `string` | Backup adapter used |

Used by [`POST /api/user/servers/{uuidShort}/backups`](https://featherpanel.com/docs/api/reference/user/server/backups/#post-user-servers-uuidShort-backups)

### `BackupDownloadResponse`

| Field | Type | Description |
| --- | --- | --- |
| `download_url` | `string` | Backup download URL |
| `expires_in` | `integer` | Token expiration time in seconds |

Used by [`GET /api/user/servers/{uuidShort}/backups/{backupUuid}/download`](https://featherpanel.com/docs/api/reference/user/server/backups/#get-user-servers-uuidShort-backups-backupUuid-download)

### `BackupPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total` | `integer` | Total number of records |
| `last_page` | `integer` | Last page number |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `BackupRestoration`

| Field | Type | Description |
| --- | --- | --- |
| `successful`required | `boolean` | Whether restoration was successful |

Used by [`POST /api/remote/backups/{backupUuid}/restore`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-backups-backupUuid-restore)

### `BackupRestoreRequest`

| Field | Type | Description |
| --- | --- | --- |
| `truncate_directory` | `boolean` | Whether to truncate directory before restore (optional) |
| `download_url` | `string` | Download URL for restore (optional) |

Used by [`POST /api/user/servers/{uuidShort}/backups/{backupUuid}/restore`](https://featherpanel.com/docs/api/reference/user/server/backups/#post-user-servers-uuidShort-backups-backupUuid-restore)

### `BackupUploadInfo`

| Field | Type | Description |
| --- | --- | --- |
| `parts` | `string[]` | Array of upload URLs for each part |
| `part_size` | `integer` | Size of each part in bytes |

Used by [`GET /api/remote/backups/{backupUuid}`](https://featherpanel.com/docs/api/reference/wings/remote/#get-remote-backups-backupUuid)

### `BlockedEmailDomainRow`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` |  |
| `domain` | `string` |  |
| `source` | `string` |  |
| `created_at` | `string` |  |

### `BlockedIpRow`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` |  |
| `ip` | `string` |  |
| `reason` | `string` |  |
| `expires_at` | `string` | UTC datetime; null = permanent |
| `created_by_uuid` | `string` |  |
| `created_at` | `string` |  |
| `is_active` | `boolean` |  |
| `is_permanent` | `boolean` |  |

### `ChatbotRequest`

| Field | Type | Description |
| --- | --- | --- |
| `message`required | `string` | User message |
| `history` | `object[]` | Chat history |

Used by [`POST /api/user/chatbot/chat`](https://featherpanel.com/docs/api/reference/user/chatbot/#post-user-chatbot-chat)

### `ChatbotResponse`

| Field | Type | Description |
| --- | --- | --- |
| `response` | `string` | AI assistant response |

### `CompressRequest`

| Field | Type | Description |
| --- | --- | --- |
| `files`required | `string[]` | Array of file paths |
| `root`required | `string` | Root directory path |
| `name` | `string` | Archive name (optional, auto-generated if not provided) |
| `extension` | `string` | Archive type: zip, tar.gz, tgz, tar.bz2, tbz2, tar.xz, txz |

Used by [`POST /api/user/servers/{uuidShort}/compress-files`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-compress-files)

### `ConnectionTest`

| Field | Type | Description |
| --- | --- | --- |
| `database_type`required | `string` | Database type |
| `database_port`required | `integer` | Database port |
| `database_username`required | `string` | Database username |
| `database_password`required | `string` | Database password |
| `database_host`required | `string` | Database host |

Used by [`POST /api/admin/databases/test-connection`](https://featherpanel.com/docs/api/reference/admin/databases/#post-admin-databases-test-connection)

### `ConnectionTestResponse`

| Field | Type | Description |
| --- | --- | --- |
| `database_host_id` | `integer` | Database host ID |
| `healthy` | `boolean` | Connection health status |
| `message` | `string` | Connection test message |
| `response_time` | `number` | Response time in milliseconds |

Used by [`POST /api/user/servers/{uuidShort}/databases/hosts/{databaseHostId}/test`](https://featherpanel.com/docs/api/reference/user/server/databases/#post-user-servers-uuidShort-databases-hosts-databaseHostId-test)

### `CopyRequest`

| Field | Type | Description |
| --- | --- | --- |
| `files`required | `string[]` | Array of file paths to copy |
| `location`required | `string` | Destination location |
| `name` | `string` | Optional destination name (Calagopus) |
| `overwrite` | `boolean` | Overwrite existing destination (Calagopus) |

Used by [`POST /api/user/servers/{uuidShort}/copy-files`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-copy-files)

### `CountryCode`

| Field | Type | Description |
| --- | --- | --- |
| `code` | `string` | ISO 3166-1 alpha-2 country code |
| `name` | `string` | Country name |

### `CreateDirectoryRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Directory name |
| `path`required | `string` | Parent directory path |

Used by [`POST /api/user/servers/{uuidShort}/create-directory`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-create-directory)

### `Database`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Database ID |
| `name` | `string` | Database name |
| `node_id` | `integer` | Node ID (optional) |
| `database_type` | `string` | Database type |
| `database_port` | `integer` | Database port |
| `database_username` | `string` | Database username |
| `database_host` | `string` | Database host |
| `database_subdomain` | `string` | Optional custom hostname shown to users for database access (e.g. db1.node.domain.de) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `DatabaseCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Database name |
| `node_id` | `integer` | Node ID (optional) |
| `database_type`required | `string` | Database type |
| `database_port`required | `integer` | Database port |
| `database_username`required | `string` | Database username |
| `database_password`required | `string` | Database password |
| `database_host`required | `string` | Database host |
| `database_subdomain` | `string` | Optional custom hostname shown to users for database access |
| `id` | `integer` | Optional database ID (useful for migrations from other platforms) |

Used by [`PUT /api/admin/databases`](https://featherpanel.com/docs/api/reference/admin/databases/#put-admin-databases)

### `DatabaseCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `database_host_id`required | `integer` | Database host ID |
| `database_name`required | `string` | Database name (without server prefix) |
| `remote` | `string` | Remote access pattern |
| `max_connections` | `integer` | Maximum connections |

Used by [`POST /api/user/servers/{uuidShort}/databases`](https://featherpanel.com/docs/api/reference/user/server/databases/#post-user-servers-uuidShort-databases)

### `DatabaseCreateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Created database ID |
| `database_name` | `string` | Generated database name |
| `username` | `string` | Generated username |
| `password` | `string` | Generated password |
| `message` | `string` | Success message |

Used by [`POST /api/user/servers/{uuidShort}/databases`](https://featherpanel.com/docs/api/reference/user/server/databases/#post-user-servers-uuidShort-databases)

### `DatabaseHost`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Database host ID |
| `name` | `string` | Database host name |
| `database_host` | `string` | Database host address |
| `database_port` | `integer` | Database host port |
| `database_type` | `string` | Database type |
| `database_username` | `string` | Database host username |
| `node_name` | `string` | Associated node name |
| `healthy` | `boolean` | Health status |

### `DatabasePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total` | `integer` | Total number of records |
| `last_page` | `integer` | Last page number |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `DatabaseUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Database name |
| `node_id` | `integer` | Node ID |
| `database_type` | `string` | Database type |
| `database_port` | `integer` | Database port |
| `database_username` | `string` | Database username |
| `database_password` | `string` | Database password |
| `database_host` | `string` | Database host |
| `database_subdomain` | `string` | Optional custom hostname shown to users for database access |

Used by [`PATCH /api/admin/databases/{id}`](https://featherpanel.com/docs/api/reference/admin/databases/#patch-admin-databases-id)

### `DatabaseUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `remote` | `string` | Remote access pattern |
| `max_connections` | `integer` | Maximum connections |

Used by [`PATCH /api/user/servers/{uuidShort}/databases/{databaseId}`](https://featherpanel.com/docs/api/reference/user/server/databases/#patch-user-servers-uuidShort-databases-databaseId)

### `DebugInfoResponse`

| Field | Type | Description |
| --- | --- | --- |
| `ip_info` | `object` | IP detection debug information |
| `headers` | `object` | All HTTP headers |
| `server_vars` | `object` | Relevant $\_SERVER variables |

Used by [`GET /api/debug/ip`](https://featherpanel.com/docs/api/reference/system/debug/#get-debug-ip)

### `DecompressRequest`

| Field | Type | Description |
| --- | --- | --- |
| `file`required | `string` | Archive file path |
| `root`required | `string` | Root directory path |

Used by [`POST /api/user/servers/{uuidShort}/decompress-archive`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-decompress-archive)

### `DownloadProcess`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `string` | Download process ID |
| `url` | `string` | Download URL |
| `status` | `string` | Download status |
| `progress` | `number` | Download progress percentage |
| `created_at` | `string (date-time)` | Process creation time |

### `EmailLoginCodeSentResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |
| `email` | `string` | Email address where code was sent |

Used by [`POST /api/user/auth/email-login/request`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-email-login-request)

### `EmailLoginRequest`

| Field | Type | Description |
| --- | --- | --- |
| `email`required | `string (email)` | User email address |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`POST /api/user/auth/email-login/request`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-email-login-request)

### `EmailLoginVerifyRequest`

| Field | Type | Description |
| --- | --- | --- |
| `email`required | `string (email)` | User email address |
| `code`required | `string` | 6-digit login code sent to email |

Used by [`POST /api/user/auth/email-login/verify`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-email-login-verify)

### `FastDlConfig`

| Field | Type | Description |
| --- | --- | --- |
| `enabled` | `boolean` | Whether FastDL is enabled |
| `directory` | `string` | Subdirectory within server data directory (e.g., "fastdl") |
| `url` | `string` | Full FastDL URL when enabled |
| `command` | `string` | Ready-to-use sv\_downloadurl command |

### `FastDlEnableRequest`

| Field | Type | Description |
| --- | --- | --- |
| `directory` | `string` | Optional subdirectory within server data directory (e.g., "csgo") |

Used by [`POST /api/user/servers/{uuidShort}/fastdl/enable`](https://featherpanel.com/docs/api/reference/user/server/fastdl/#post-user-servers-uuidShort-fastdl-enable)

### `FastDlUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `enabled` | `boolean` | Whether FastDL is enabled |
| `directory` | `string` | Optional subdirectory within server data directory |

Used by [`PUT /api/user/servers/{uuidShort}/fastdl`](https://featherpanel.com/docs/api/reference/user/server/fastdl/#put-user-servers-uuidShort-fastdl)

### `FeatherCloudCredentialPair`

| Field | Type | Description |
| --- | --- | --- |
| `public_key` | `string` |  |
| `private_key` | `string` |  |
| `last_rotated_at` | `string (date-time)` | Timestamp when the keypair was last rotated or updated |

### `FeatherCloudCredentials`

| Field | Type | Description |
| --- | --- | --- |
| `panel_credentials` | [`FeatherCloudCredentialPair`](#schema-feathercloudcredentialpair) |  |
| `cloud_credentials` | [`FeatherCloudCredentialPair`](#schema-feathercloudcredentialpair) |  |

Used by [`GET /api/admin/cloud/credentials`](https://featherpanel.com/docs/api/reference/admin/cloud/#get-admin-cloud-credentials), [`PUT /api/admin/cloud/credentials/panel`](https://featherpanel.com/docs/api/reference/admin/cloud/#put-admin-cloud-credentials-panel), [`PUT /api/admin/cloud/credentials/cloud`](https://featherpanel.com/docs/api/reference/admin/cloud/#put-admin-cloud-credentials-cloud), [`POST /api/admin/cloud/credentials/rotate`](https://featherpanel.com/docs/api/reference/admin/cloud/#post-admin-cloud-credentials-rotate)

### `FileContent`

| Field | Type | Description |
| --- | --- | --- |
| `path` | `string` | File path |
| `content` | `string` | File content (null for binary files) |
| `isBinary` | `boolean` | Whether the file is binary |
| `mimeType` | `string` | MIME type of the file |
| `extension` | `string` | File extension |
| `size` | `integer` | File size in bytes |
| `modified` | `integer` | Last modification timestamp |

Used by [`GET /api/admin/file-manager/read`](https://featherpanel.com/docs/api/reference/admin/file-manager/#get-admin-file-manager-read)

### `FileCreate`

| Field | Type | Description |
| --- | --- | --- |
| `path`required | `string` | Path for the new file or directory |
| `isDirectory` | `boolean` | Whether to create a directory (default: false) |

Used by [`POST /api/admin/file-manager/create`](https://featherpanel.com/docs/api/reference/admin/file-manager/#post-admin-file-manager-create)

### `FileDelete`

| Field | Type | Description |
| --- | --- | --- |
| `path`required | `string` | Path of the file or directory to delete |

Used by [`POST /api/admin/file-manager/delete`](https://featherpanel.com/docs/api/reference/admin/file-manager/#post-admin-file-manager-delete)

### `FileItem`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | File or directory name |
| `path` | `string` | Relative path from project root |
| `isDirectory` | `boolean` | Whether the item is a directory |
| `size` | `integer` | File size in bytes (null for directories) |
| `modified` | `integer` | Last modification timestamp |
| `permissions` | `string` | File permissions in octal format |

### `FileOperationRequest`

| Field | Type | Description |
| --- | --- | --- |
| `files`required | `string[]` | Array of file paths |
| `root`required | `string` | Root directory path |

Used by [`DELETE /api/user/servers/{uuidShort}/delete-files`](https://featherpanel.com/docs/api/reference/user/server/files/#delete-user-servers-uuidShort-delete-files), [`POST /api/user/servers/{uuidShort}/change-permissions`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-change-permissions)

### `FileSave`

| Field | Type | Description |
| --- | --- | --- |
| `path`required | `string` | File path to save |
| `content`required | `string` | File content to write |

Used by [`POST /api/admin/file-manager/save`](https://featherpanel.com/docs/api/reference/admin/file-manager/#post-admin-file-manager-save)

### `FirewallRule`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` |  |
| `created_at` | `string (date-time)` |  |
| `updated_at` | `string (date-time)` |  |
| `server_uuid` | `string (uuid)` |  |
| `remote_ip` | `string` |  |
| `server_port` | `integer` |  |
| `priority` | `integer` |  |
| `type` | `string` |  |
| `protocol` | `string` |  |

### `FirewallRuleCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `remote_ip`required | `string` | IP address or CIDR |
| `server_port`required | `integer` | Allocated port (1-65535) |
| `priority` | `integer` | Rule priority (0-10000) |
| `type`required | `string` |  |
| `protocol` | `string` |  |

Used by [`POST /api/user/servers/{uuidShort}/firewall`](https://featherpanel.com/docs/api/reference/user/server/firewall/#post-user-servers-uuidShort-firewall)

### `FirewallRuleUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `remote_ip` | `string` | IP address or CIDR |
| `server_port` | `integer` | Allocated port (1-65535) |
| `priority` | `integer` | Rule priority (0-10000) |
| `type` | `string` |  |
| `protocol` | `string` |  |

Used by [`PUT /api/user/servers/{uuidShort}/firewall/{ruleId}`](https://featherpanel.com/docs/api/reference/user/server/firewall/#put-user-servers-uuidShort-firewall-ruleId)

### `ForgotPasswordRequest`

| Field | Type | Description |
| --- | --- | --- |
| `email`required | `string (email)` | User email address |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/forgot-password`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-forgot-password)

### `ForgotPasswordResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |

Used by [`PUT /api/user/auth/forgot-password`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-forgot-password)

### `Image`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Image ID |
| `name` | `string` | Image name |
| `url` | `string` | Image URL |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `ImageCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Image name |
| `url`required | `string` | Image URL |

Used by [`POST /api/admin/images`](https://featherpanel.com/docs/api/reference/admin/images/#post-admin-images)

### `ImagePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `ImageUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Image name |
| `url` | `string` | Image URL |

Used by [`PATCH /api/admin/images/{id}`](https://featherpanel.com/docs/api/reference/admin/images/#patch-admin-images-id)

### `ImageUpload`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Image name |
| `image` | `string (binary)` | Image file (JPG, PNG, GIF, WebP, max 10MB) |

### `InstallLogsResponse`

| Field | Type | Description |
| --- | --- | --- |
| `response` | `string[]` | Array of installation log lines from the server |

Used by [`GET /api/user/servers/{uuidShort}/install-logs`](https://featherpanel.com/docs/api/reference/user/server/logs/#get-user-servers-uuidShort-install-logs)

### `JwtResponse`

| Field | Type | Description |
| --- | --- | --- |
| `token` | `string` | JWT token |
| `expires_at` | `integer` | Token expiration timestamp |
| `server_uuid` | `string` | Server UUID |
| `user_uuid` | `string` | User UUID |
| `permissions` | `string[]` | User permissions |
| `connection_string` | `string` | WebSocket connection string |

Used by [`POST /api/user/servers/{uuidShort}/jwt`](https://featherpanel.com/docs/api/reference/user/server/core/#post-user-servers-uuidShort-jwt)

### `KnowledgebaseArticle`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Article ID |
| `category_id` | `integer` | Category ID |
| `title` | `string` | Article title |
| `slug` | `string` | Article slug |
| `icon` | `string` | Article icon/logo URL |
| `content` | `string` | Article content |
| `author_id` | `integer` | Author user ID |
| `status` | `string` | Article status |
| `pinned` | `string` | Whether article is pinned |
| `sort_order` | `integer` | Article sort order for positioning |
| `published_at` | `string (date-time)` | Publication timestamp |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `KnowledgebaseArticleCreate`

| Field | Type | Description |
| --- | --- | --- |
| `category_id`required | `integer` | Category ID |
| `title`required | `string` | Article title |
| `slug` | `string` | Article slug |
| `icon` | `string` | Article icon/logo URL |
| `content`required | `string` | Article content |
| `author_id`required | `integer` | Author user ID |
| `status` | `string` | Article status |
| `pinned` | `boolean` | Whether article is pinned |
| `sort_order` | `integer` | Article sort order for positioning |
| `published_at` | `string (date-time)` | Publication timestamp |

Used by [`PUT /api/admin/knowledgebase/articles`](https://featherpanel.com/docs/api/reference/admin/knowledgebase/#put-admin-knowledgebase-articles)

### `KnowledgebaseArticleReorder`

| Field | Type | Description |
| --- | --- | --- |
| `articles`required | `object[]` | Array of articles with their new sort orders |

Used by [`POST /api/admin/knowledgebase/articles/reorder`](https://featherpanel.com/docs/api/reference/admin/knowledgebase/#post-admin-knowledgebase-articles-reorder)

### `KnowledgebaseArticleUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `category_id` | `integer` | Category ID |
| `title` | `string` | Article title |
| `slug` | `string` | Article slug |
| `icon` | `string` | Article icon/logo URL |
| `content` | `string` | Article content |
| `author_id` | `integer` | Author user ID |
| `status` | `string` | Article status |
| `pinned` | `boolean` | Whether article is pinned |
| `sort_order` | `integer` | Article sort order for positioning |
| `published_at` | `string (date-time)` | Publication timestamp |

Used by [`PATCH /api/admin/knowledgebase/articles/{id}`](https://featherpanel.com/docs/api/reference/admin/knowledgebase/#patch-admin-knowledgebase-articles-id)

### `KnowledgebaseCategory`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Category ID |
| `name` | `string` | Category name |
| `slug` | `string` | Category slug |
| `icon` | `string` | Category icon URL |
| `description` | `string` | Category description |
| `position` | `integer` | Category position for sorting |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `KnowledgebaseCategoryCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Category name |
| `slug` | `string` | Category slug |
| `icon`required | `string` | Category icon URL |
| `description` | `string` | Category description |
| `position` | `integer` | Category position for sorting |

Used by [`PUT /api/admin/knowledgebase/categories`](https://featherpanel.com/docs/api/reference/admin/knowledgebase/#put-admin-knowledgebase-categories)

### `KnowledgebaseCategoryUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Category name |
| `slug` | `string` | Category slug |
| `icon` | `string` | Category icon URL |
| `description` | `string` | Category description |
| `position` | `integer` | Category position for sorting |

Used by [`PATCH /api/admin/knowledgebase/categories/{id}`](https://featherpanel.com/docs/api/reference/admin/knowledgebase/#patch-admin-knowledgebase-categories-id)

### `KnowledgebasePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `LanguageStat`

| Field | Type | Description |
| --- | --- | --- |
| `locale` | `string` | Locale code |
| `name` | `string` | Language name |
| `user_count` | `integer` | Number of users |
| `percentage` | `number (float)` | Percentage of total users |

### `LanguageTrend`

| Field | Type | Description |
| --- | --- | --- |
| `locale` | `string` | Locale code |
| `month` | `string` | Month (YYYY-MM) |
| `count` | `integer` | Number of new users |

### `LdapLoginRequest`

| Field | Type | Description |
| --- | --- | --- |
| `provider_uuid`required | `string` | LDAP provider UUID |
| `username`required | `string` | LDAP username |
| `password`required | `string` | LDAP password |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/ldap/login`](https://featherpanel.com/docs/api/reference/user/ldap/#put-user-auth-ldap-login)

### `LdapProvider`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` |  |
| `uuid` | `string` |  |
| `name` | `string` |  |
| `host` | `string` |  |
| `port` | `integer` |  |
| `use_tls` | `string` |  |
| `use_ssl` | `string` |  |
| `bind_dn` | `string` |  |
| `base_dn` | `string` |  |
| `user_filter` | `string` |  |
| `username_attribute` | `string` |  |
| `email_attribute` | `string` |  |
| `auto_provision` | `string` |  |
| `enabled` | `string` |  |

Used by [`PUT /api/admin/ldap/providers`](https://featherpanel.com/docs/api/reference/admin/ldap/#put-admin-ldap-providers), [`POST /api/admin/ldap/providers/{uuid}`](https://featherpanel.com/docs/api/reference/admin/ldap/#post-admin-ldap-providers-uuid)

### `Location`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Location ID |
| `name` | `string` | Location name |
| `description` | `string` | Location description |
| `flag_code` | `string` | ISO 3166-1 alpha-2 country code for flag display |
| `type` | `string` | Location purpose type (immutable after creation) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `LocationCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Location name |
| `description` | `string` | Location description |
| `flag_code` | `string` | ISO 3166-1 alpha-2 country code (e.g., "us", "ua") for flag display |
| `type`required | `string` | Location purpose: game hosting, VPS/VDS, or web hosting (immutable after creation) |
| `webhosting_alpha_accepted` | `boolean` | Required to be true when creating a Web Hosting location |
| `id` | `integer` | Optional location ID (useful for migrations from other platforms) |

Used by [`PUT /api/admin/locations`](https://featherpanel.com/docs/api/reference/admin/locations/#put-admin-locations)

### `LocationPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `LocationUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Location name |
| `description` | `string` | Location description |
| `flag_code` | `string` | ISO 3166-1 alpha-2 country code (e.g., "us", "ua") for flag display. Set to null to remove the flag. |
| `type` | `string` | Location purpose: game hosting, VPS/VDS, or web hosting (immutable after creation) |

Used by [`PATCH /api/admin/locations/{id}`](https://featherpanel.com/docs/api/reference/admin/locations/#patch-admin-locations-id)

### `LogClear`

| Field | Type | Description |
| --- | --- | --- |
| `type`required | `string` | Log type to clear |

Used by [`POST /api/admin/log-viewer/clear`](https://featherpanel.com/docs/api/reference/admin/log-viewer/#post-admin-log-viewer-clear)

### `LogContent`

| Field | Type | Description |
| --- | --- | --- |
| `logs` | `string` | Log content as string |
| `file` | `string` | Log file name |
| `type` | `string` | Log type |
| `lines_count` | `integer` | Number of lines in the log content |

Used by [`GET /api/admin/log-viewer/get`](https://featherpanel.com/docs/api/reference/admin/log-viewer/#get-admin-log-viewer-get)

### `LogFile`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Log file name |
| `size` | `integer` | File size in bytes |
| `modified` | `integer` | Last modification timestamp |
| `type` | `string` | Log type (web, app, mail, runner, unknown) |

### `LoginRequest`

| Field | Type | Description |
| --- | --- | --- |
| `username_or_email`required | `string` | User email address or username |
| `password`required | `string` | User password |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/login`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-login)

### `LoginResponse`

| Field | Type | Description |
| --- | --- | --- |
| `user` | `object` | User information |
| `preferences` | `object` | User preferences |
| `message` | `string` | Success message |

Used by [`POST /api/user/auth/email-login/verify`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-email-login-verify), [`PUT /api/user/auth/ldap/login`](https://featherpanel.com/docs/api/reference/user/ldap/#put-user-auth-ldap-login)

### `LogoutResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Logout success message |

Used by [`GET /api/user/auth/logout`](https://featherpanel.com/docs/api/reference/user/auth/#get-user-auth-logout), [`DELETE /api/user/auth/logout`](https://featherpanel.com/docs/api/reference/user/auth/#delete-user-auth-logout)

### `MailTemplate`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Mail template ID |
| `name` | `string` | Template name |
| `subject` | `string` | Email subject |
| `body` | `string` | Email body content |
| `deleted` | `string` | Soft delete status |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `MailTemplateCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Template name |
| `subject`required | `string` | Email subject |
| `body`required | `string` | Email body content |

Used by [`POST /api/admin/mail-templates`](https://featherpanel.com/docs/api/reference/admin/mail-templates/#post-admin-mail-templates)

### `MailTemplatePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `MailTemplateUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Template name |
| `subject` | `string` | Email subject |
| `body` | `string` | Email body content |

Used by [`PATCH /api/admin/mail-templates/{id}`](https://featherpanel.com/docs/api/reference/admin/mail-templates/#patch-admin-mail-templates-id)

### `MassEmail`

| Field | Type | Description |
| --- | --- | --- |
| `subject`required | `string` | Email subject |
| `body`required | `string` | Email body content |

Used by [`POST /api/admin/mail-templates/mass-email`](https://featherpanel.com/docs/api/reference/admin/mail-templates/#post-admin-mail-templates-mass-email)

### `MassEmailResult`

| Field | Type | Description |
| --- | --- | --- |
| `queued_count` | `integer` | Number of emails successfully queued |
| `failed_count` | `integer` | Number of emails that failed to queue |
| `total_users` | `integer` | Total number of valid users found |

Used by [`POST /api/admin/mail-templates/mass-email`](https://featherpanel.com/docs/api/reference/admin/mail-templates/#post-admin-mail-templates-mass-email)

### `Node`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Node ID |
| `uuid` | `string` | Node UUID |
| `name` | `string` | Node name |
| `fqdn` | `string` | Fully qualified domain name |
| `location_id` | `integer` | Location ID |
| `daemon_token_id` | `string` | Daemon token ID |
| `daemon_token` | `string` | Daemon authentication token |
| `daemon_type` | `string` | Node daemon implementation (FeatherWings or Calagopus wings-rs) |
| `capabilities` | `object` | Feature capability flags for this daemon type |
| `public_ip_v4` | `string` | Public IPv4 address reachable by clients. Required when using the subdomain manager. |
| `public_ip_v6` | `string` | Public IPv6 address reachable by clients. |
| `sftp_subdomain` | `string` | Custom subdomain for SFTP access (e.g., sftp.node.domain.de). DNS must be configured externally. |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `NodeCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Node name |
| `fqdn`required | `string` | Fully qualified domain name |
| `location_id`required | `integer` | Location ID |
| `daemon_type` | `string` | Daemon implementation for this node |
| `public_ip_v4` | `string` | Public IPv4 address reachable by clients. Set this if you plan to use the subdomain manager. |
| `public_ip_v6` | `string` | Public IPv6 address reachable by clients. |
| `sftp_subdomain` | `string` | Optional custom hostname for SFTP connections shown to users. |
| `id` | `integer` | Optional node ID (useful for migrations from other platforms) |

Used by [`PUT /api/admin/nodes`](https://featherpanel.com/docs/api/reference/admin/nodes/#put-admin-nodes)

### `NodeDockerDiskUsage`

| Field | Type | Description |
| --- | --- | --- |
| `node` | `object` | Node information |
| `dockerDiskUsage` | `object` | Docker disk usage data |

Used by [`GET /api/wings/admin/node/{id}/docker/disk`](https://featherpanel.com/docs/api/reference/wings/nodes/#get-wings-admin-node-id-docker-disk)

### `NodeDockerPrune`

| Field | Type | Description |
| --- | --- | --- |
| `node` | `object` | Node information |
| `dockerPrune` | `object` | Docker prune results |

Used by [`DELETE /api/wings/admin/node/{id}/docker/prune`](https://featherpanel.com/docs/api/reference/wings/nodes/#delete-wings-admin-node-id-docker-prune)

### `NodeIps`

| Field | Type | Description |
| --- | --- | --- |
| `node` | `object` | Node information |
| `ips` | `string[]` | Available IP addresses |

Used by [`GET /api/wings/admin/node/{id}/ips`](https://featherpanel.com/docs/api/reference/wings/nodes/#get-wings-admin-node-id-ips)

### `NodePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `NodeSystemInfo`

| Field | Type | Description |
| --- | --- | --- |
| `node` | `object` | Node information |
| `wings` | `object` | Detailed system information from Wings |

Used by [`GET /api/wings/admin/node/{id}/system`](https://featherpanel.com/docs/api/reference/wings/nodes/#get-wings-admin-node-id-system)

### `NodeUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Node name |
| `fqdn` | `string` | Fully qualified domain name |
| `location_id` | `integer` | Location ID |
| `uuid` | `string` | Node UUID (must be valid UUID format) |
| `daemon_type` | `string` | Daemon implementation for this node |
| `public_ip_v4` | `string` | Public IPv4 address reachable by clients. Set this if you plan to use the subdomain manager. |
| `public_ip_v6` | `string` | Public IPv6 address reachable by clients. |
| `sftp_subdomain` | `string` | Optional custom hostname for SFTP connections shown to users. |

Used by [`PATCH /api/admin/nodes/{id}`](https://featherpanel.com/docs/api/reference/admin/nodes/#patch-admin-nodes-id)

### `NodeUtilization`

| Field | Type | Description |
| --- | --- | --- |
| `node` | `object` | Node information |
| `utilization` | `object` | System utilization data |

Used by [`GET /api/wings/admin/node/{id}/utilization`](https://featherpanel.com/docs/api/reference/wings/nodes/#get-wings-admin-node-id-utilization)

### `Notification`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Notification ID |
| `user_id` | `integer` | Target user ID (null = global) |
| `server_id` | `integer` | Target server ID (null = account/global) |
| `title` | `string` | Notification title |
| `message_markdown` | `string` | Notification message in Markdown format |
| `type` | `string` | Notification type |
| `is_dismissible` | `boolean` | Whether the notification can be dismissed |
| `is_sticky` | `boolean` | Whether the notification stays until explicitly closed |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `NotificationCreate`

| Field | Type | Description |
| --- | --- | --- |
| `title`required | `string` | Notification title |
| `message_markdown`required | `string` | Notification message in Markdown format |
| `type`required | `string` | Notification type |
| `user_id` | `integer` | Target user ID (null = all users) |
| `server_id` | `integer` | Target server ID (optional; implies owner) |
| `send_email` | `boolean` | Also email the target user (requires user or server target) |
| `is_dismissible` | `boolean` | Whether the notification can be dismissed (default: true) |
| `is_sticky` | `boolean` | Whether the notification stays until explicitly closed (default: false) |

Used by [`PUT /api/admin/notifications`](https://featherpanel.com/docs/api/reference/admin/notifications/#put-admin-notifications)

### `NotificationPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `NotificationUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `title` | `string` | Notification title |
| `message_markdown` | `string` | Notification message in Markdown format |
| `type` | `string` | Notification type |
| `user_id` | `integer` | Target user ID (null = all users) |
| `server_id` | `integer` | Target server ID |
| `is_dismissible` | `boolean` | Whether the notification can be dismissed |
| `is_sticky` | `boolean` | Whether the notification stays until explicitly closed |

Used by [`PATCH /api/admin/notifications/{id}`](https://featherpanel.com/docs/api/reference/admin/notifications/#patch-admin-notifications-id)

### `OidcLoginState`

| Field | Type | Description |
| --- | --- | --- |
| `state` | `string` | CSRF state parameter |
| `nonce` | `string` | OIDC nonce for ID token |

### `OidcProvider`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string (uuid)` | Provider UUID |
| `name` | `string` | Display name |
| `issuer_url` | `string` | OIDC issuer URL |
| `client_id` | `string` | OIDC client ID |
| `scopes` | `string` | Space-separated scopes |
| `email_claim` | `string` | Email claim name |
| `subject_claim` | `string` | Subject claim name |
| `group_claim` | `string` | Group/role claim name |
| `group_value` | `string` | Required group/role value |
| `auto_provision` | `string` | Auto provision users |
| `require_email_verified` | `string` | Require email\_verified |
| `enabled` | `string` | Whether this provider is enabled |

Used by [`PUT /api/admin/oidc/providers`](https://featherpanel.com/docs/api/reference/admin/oidc/#put-admin-oidc-providers), [`PATCH /api/admin/oidc/providers/{uuid}`](https://featherpanel.com/docs/api/reference/admin/oidc/#patch-admin-oidc-providers-uuid)

### `OnlineAddon`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Addon ID |
| `identifier` | `string` | Addon identifier |
| `name` | `string` | Addon display name |
| `description` | `string` | Addon description |
| `icon` | `string` | Addon icon URL |
| `website` | `string` | Addon website URL |
| `author` | `string` | Addon author |
| `author_email` | `string` | Author email |
| `maintainers` | `string[]` | Addon maintainers |
| `tags` | `string[]` | Addon tags |
| `verified` | `boolean` | Whether addon is verified |
| `premium` | `integer` | Whether addon is premium (0 = free, 1 = premium) |
| `premium_link` | `string` | Purchase link for premium addon |
| `premium_price` | `string` | Price for premium addon in EUR |
| `downloads` | `integer` | Download count |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `latest_version` | `object` | Latest published version metadata when available |

### `OnlineInstall`

| Field | Type | Description |
| --- | --- | --- |
| `identifier`required | `string` | Addon identifier to install |
| `queued_identifiers` | `string[]` | Identifiers selected for the same install session; plugin= dependencies in this list are installed automatically before this addon when missing. |

Used by [`POST /api/admin/plugins/online/install`](https://featherpanel.com/docs/api/reference/admin/cloud-plugins/#post-admin-plugins-online-install)

### `OnlineSpell`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Spell ID |
| `identifier` | `string` | Spell identifier |
| `name` | `string` | Spell display name |
| `description` | `string` | Spell description |
| `icon` | `string` | Spell icon URL |
| `website` | `string` | Spell website |
| `author` | `string` | Spell author |
| `author_email` | `string` | Author email |
| `maintainers` | `string[]` | Maintainers |
| `tags` | `string[]` | Spell tags |
| `verified` | `boolean` | Verified status |
| `downloads` | `integer` | Download count |
| `created_at` | `string` | Creation timestamp |
| `updated_at` | `string` | Last update timestamp |
| `latest_version` | `object` | Latest version information |

### `OnlineSpellInstall`

| Field | Type | Description |
| --- | --- | --- |
| `identifier`required | `string` | Spell identifier |
| `realm_id`required | `integer` | Realm ID |

Used by [`POST /api/admin/spells/online/install`](https://featherpanel.com/docs/api/reference/admin/spells/#post-admin-spells-online-install)

### `Pagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` |  |
| `per_page` | `integer` |  |
| `total_records` | `integer` |  |
| `total_pages` | `integer` |  |
| `has_next` | `boolean` |  |
| `has_prev` | `boolean` |  |
| `from` | `integer` |  |
| `to` | `integer` |  |

### `Permission`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Permission ID |
| `role_id` | `integer` | Role ID |
| `permission` | `string` | Permission name |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `PermissionCreate`

| Field | Type | Description |
| --- | --- | --- |
| `role_id`required | `integer` | Role ID |
| `permission`required | `string` | Permission name |

Used by [`PUT /api/admin/permissions`](https://featherpanel.com/docs/api/reference/admin/permissions/#put-admin-permissions)

### `PermissionPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `PermissionsResponse`

| Field | Type | Description |
| --- | --- | --- |
| `permissions` | `string[]` | Array of available permissions |
| `total` | `integer` | Total number of permissions |

Used by [`GET /api/user/servers/{uuidShort}/subusers/permissions`](https://featherpanel.com/docs/api/reference/user/server/subusers/#get-user-servers-uuidShort-subusers-permissions)

### `PermissionUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `role_id` | `integer` | Role ID |
| `permission` | `string` | Permission name |

Used by [`PATCH /api/admin/permissions/{id}`](https://featherpanel.com/docs/api/reference/admin/permissions/#patch-admin-permissions-id)

### `Plugin`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Plugin name |
| `identifier` | `string` | Plugin identifier |
| `description` | `string` | Plugin description |
| `version` | `string` | Plugin version |
| `target` | `string` | Target FeatherPanel version |
| `author` | `string[]` | Plugin authors |
| `icon` | `string` | Plugin icon URL |
| `flags` | `string[]` | Plugin flags |
| `dependencies` | `string[]` | Plugin dependencies |
| `requiredConfigs` | `string[]` | Required configuration keys |
| `status` | `string` | Plugin status |
| `dependencies_met` | `boolean` | Whether dependencies are met |
| `required_configs_set` | `boolean` | Whether required configs are set |
| `settings` | `object` | Plugin settings |
| `config` | `object[]` | Plugin configuration schema |

Used by [`GET /api/admin/plugin-manager/{identifier}`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#get-admin-plugin-manager-identifier)

### `PluginCreate`

| Field | Type | Description |
| --- | --- | --- |
| `identifier`required | `string` | Plugin identifier |
| `name`required | `string` | Plugin name |
| `description` | `string` | Plugin description |
| `version` | `string` | Plugin version |
| `author` | `string[]` | Plugin authors |
| `flags` | `string[]` | Plugin flags |
| `dependencies` | `string[]` | Plugin dependencies |
| `requiredConfigs` | `string[]` | Required configuration keys |
| `configSchema` | `object[]` | Configuration schema |

Used by [`POST /api/admin/plugin-manager`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#post-admin-plugin-manager)

### `PluginCreationOptions`

| Field | Type | Description |
| --- | --- | --- |
| `migration` | `object` |  |
| `cron` | `object` |  |
| `command` | `object` |  |
| `public_file` | `object` |  |

Used by [`GET /api/admin/plugin-tools/creation-options`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#get-admin-plugin-tools-creation-options)

### `PluginFileCreate`

| Field | Type | Description |
| --- | --- | --- |
| `plugin_id`required | `string` | Plugin identifier |
| `file_type`required | `string` | File type to create |
| `name` | `string` | File name (required for migration, cron, command) |
| `description` | `string` | File description |
| `schedule` | `string` | Schedule for cron jobs |
| `file` | `string (binary)` | File to upload (for public\_file type) |

Used by [`POST /api/admin/plugin-tools/create-file`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#post-admin-plugin-tools-create-file)

### `PluginInfo`

| Field | Type | Description |
| --- | --- | --- |
| `plugin` | `object` |  |
| `configSchema` | `object[]` | Plugin configuration schema |

### `PluginSettingRemove`

| Field | Type | Description |
| --- | --- | --- |
| `key`required | `string` | Setting key to remove |

Used by [`POST /api/admin/plugins/{identifier}/settings/remove`](https://featherpanel.com/docs/api/reference/admin/plugins/#post-admin-plugins-identifier-settings-remove)

### `PluginSettingsUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `settings`required | `object` | Plugin settings key-value pairs |

Used by [`PUT /api/admin/plugin-manager/{identifier}/settings`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#put-admin-plugin-manager-identifier-settings), [`PATCH /api/admin/plugin-manager/{identifier}/settings`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#patch-admin-plugin-manager-identifier-settings)

### `PluginSettingUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `key`required | `string` | Setting key |
| `value`required | `string` | Setting value |

Used by [`POST /api/admin/plugins/{identifier}/settings/set`](https://featherpanel.com/docs/api/reference/admin/plugins/#post-admin-plugins-identifier-settings-set)

### `PluginSidebar`

| Field | Type | Description |
| --- | --- | --- |
| `sidebar` | `object` | Complete sidebar structure with plugin items |

Used by [`GET /api/system/plugin-sidebar`](https://featherpanel.com/docs/api/reference/system/plugin-sidebar/#get-system-plugin-sidebar)

### `PluginUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Plugin name |
| `description` | `string` | Plugin description |
| `version` | `string` | Plugin version |
| `target` | `string` | Target FeatherPanel version |
| `author` | `string[]` | Plugin authors |
| `flags` | `string[]` | Plugin flags |
| `dependencies` | `string[]` | Plugin dependencies |
| `requiredConfigs` | `string[]` | Required configuration keys |
| `configSchema` | `object[]` | Configuration schema |

Used by [`PUT /api/admin/plugin-manager/{identifier}`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#put-admin-plugin-manager-identifier), [`PATCH /api/admin/plugin-manager/{identifier}`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#patch-admin-plugin-manager-identifier)

### `PluginValidation`

| Field | Type | Description |
| --- | --- | --- |
| `config_valid` | `boolean` | Whether plugin configuration is valid |
| `dependencies_met` | `boolean` | Whether dependencies are met |
| `required_configs_set` | `boolean` | Whether required configs are set |
| `identifier_valid` | `boolean` | Whether identifier is valid |
| `flags_valid` | `boolean` | Whether flags are valid |
| `files_exist` | `boolean` | Whether required files exist |
| `overall_valid` | `boolean` | Overall validation status |

Used by [`GET /api/admin/plugin-manager/{identifier}/validate`](https://featherpanel.com/docs/api/reference/admin/plugin-manager/#get-admin-plugin-manager-identifier-validate)

### `PluginWidget`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `string` | Widget identifier |
| `plugin` | `string` | Plugin identifier |
| `pluginName` | `string` | Plugin display name |
| `component` | `string` | Component file path |
| `enabled` | `boolean` | Whether widget is enabled |
| `hidden` | `boolean` | Whether widget is hidden by plugin frontend visibility rules |
| `priority` | `integer` | Display priority (higher = first) |
| `page` | `string` | Target page identifier |
| `location` | `string` | Widget placement location |
| `useRawRendering` | `boolean` | Whether to render the widget without a card container and with full transparency |
| `borderless` | `boolean` | When true, skip Card/header/footer wrapper (embed iframe only; same effect as useRawRendering) |
| `title` | `string` | Optional title to display above the widget content |
| `description` | `string` | Optional description text for the widget |
| `icon` | `string` | Optional icon identifier used in the widget header |
| `size` | `string | object` | Widget size preset or explicit responsive column configuration |
| `layout` | `object` | Advanced layout overrides (columns, breakpoints, row span) |
| `card` | `object` | Card presentation options |
| `behavior` | `object` | Behavior overrides for loading and error states |
| `iframe` | `object` | Iframe attribute overrides |
| `classes` | `object` | Optional CSS class overrides |

### `PluginWidgetConfig`

| Field | Type | Description |
| --- | --- | --- |
| `id`required | `string` | Unique widget identifier |
| `component`required | `string` | Widget HTML component file path |
| `page`required | `string` | Target page identifier |
| `location`required | `string` | Widget location on page |
| `enabled` | `boolean` | Whether widget is enabled |
| `priority` | `integer` | Rendering priority (higher = first) |
| `size` | `string` | Widget size: full, half, third, or quarter |

### `PluginWidgetsResponse`

| Field | Type | Description |
| --- | --- | --- |
| `widgets` | `object` | Widgets organized by page and location |

Used by [`GET /api/system/plugin-widgets`](https://featherpanel.com/docs/api/reference/system/plugin-widgets/#get-system-plugin-widgets)

### `PowerActionResponse`

| Field | Type | Description |
| --- | --- | --- |
| `response` | `object` | Response from Wings daemon |

Used by [`POST /api/user/servers/{uuidShort}/power/{action}`](https://featherpanel.com/docs/api/reference/user/server/power/#post-user-servers-uuidShort-power-action)

### `PreferencesResponse`

| Field | Type | Description |
| --- | --- | --- |
| `preferences` | [`UserPreferences`](#schema-userpreferences) |  |

Used by [`GET /api/user/preferences`](https://featherpanel.com/docs/api/reference/user/session/#get-user-preferences)

### `PrimaryAllocationResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |
| `new_primary_allocation_id` | `integer` | ID of the new primary allocation |

Used by [`POST /api/user/servers/{uuidShort}/allocations/{allocationId}/primary`](https://featherpanel.com/docs/api/reference/user/server/allocations/#post-user-servers-uuidShort-allocations-allocationId-primary)

### `ProxyCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `domain`required | `string` | The domain name for the proxy |
| `ip`required | `string` | The target IP address to proxy to |
| `port`required | `string` | The target port to proxy to |
| `ssl`required | `boolean` | Whether to enable SSL/TLS |
| `use_lets_encrypt` | `boolean` | Whether to use Let's Encrypt for SSL |
| `client_email` | `string` | Email for Let's Encrypt registration |
| `ssl_cert` | `string` | SSL certificate content |
| `ssl_key` | `string` | SSL private key content |

Used by [`POST /api/user/servers/{uuidShort}/proxy/create`](https://featherpanel.com/docs/api/reference/user/server/proxy/#post-user-servers-uuidShort-proxy-create)

### `ProxyDeleteRequest`

| Field | Type | Description |
| --- | --- | --- |
| `domain`required | `string` | The domain name of the proxy to delete |
| `port`required | `string` | The port associated with the proxy configuration |

Used by [`POST /api/user/servers/{uuidShort}/proxy/delete`](https://featherpanel.com/docs/api/reference/user/server/proxy/#post-user-servers-uuidShort-proxy-delete)

### `PublicSettings`

| Field | Type | Description |
| --- | --- | --- |
| `settings` | `object` | Public application settings with default values |

Used by [`GET /api/system/settings`](https://featherpanel.com/docs/api/reference/system/settings/#get-system-settings)

### `PullFileRequest`

| Field | Type | Description |
| --- | --- | --- |
| `url`required | `string (uri)` | URL to download from |
| `root`required | `string` | Destination directory path |
| `fileName` | `string` | Custom filename |
| `foreground` | `boolean` | Run in foreground |
| `useHeader` | `boolean` | Use headers |

Used by [`POST /api/user/servers/{uuidShort}/pull-file`](https://featherpanel.com/docs/api/reference/user/server/files/#post-user-servers-uuidShort-pull-file)

### `RateLimitRoute`

| Field | Type | Description |
| --- | --- | --- |
| `route_name` | `string` | The route name |
| `per_second` | `integer` | Rate limit per second |
| `per_minute` | `integer` | Rate limit per minute |
| `per_hour` | `integer` | Rate limit per hour |
| `per_day` | `integer` | Rate limit per day |
| `namespace` | `string` | Namespace for rate limiting |

Used by [`GET /api/admin/rate-limits/{routeName}`](https://featherpanel.com/docs/api/reference/admin/rate-limits/#get-admin-rate-limits-routeName)

### `Realm`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Realm ID |
| `name` | `string` | Realm name |
| `description` | `string` | Realm description |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `RealmCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Realm name |
| `description` | `string` | Realm description |
| `id` | `integer` | Optional realm ID (useful for migrations from other platforms) |

Used by [`PUT /api/admin/realms`](https://featherpanel.com/docs/api/reference/admin/realms/#put-admin-realms)

### `RealmPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `RealmUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Realm name |
| `description` | `string` | Realm description |

Used by [`PATCH /api/admin/realms/{id}`](https://featherpanel.com/docs/api/reference/admin/realms/#patch-admin-realms-id)

### `RegisterRequest`

| Field | Type | Description |
| --- | --- | --- |
| `username`required | `string` | Username (alphanumeric and underscores only) |
| `email`required | `string (email)` | User email address |
| `password`required | `string` | User password |
| `first_name`required | `string` | User first name |
| `last_name`required | `string` | User last name |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/register`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-register)

### `RegisterResponse`

| Field | Type | Description |
| --- | --- | --- |
| `user` | `object` | User information |
| `preferences` | `object` | User preferences |
| `message` | `string` | Success message |

Used by [`PUT /api/user/auth/register`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-register)

### `RegistrationTrend`

| Field | Type | Description |
| --- | --- | --- |
| `date` | `string (date)` | Date |
| `count` | `integer` | Number of registrations |

### `RemoteServersResponse`

| Field | Type | Description |
| --- | --- | --- |
| `data` | [`WingsServerConfig[]`](#schema-wingsserverconfig) | Array of server configurations |
| `links` | `object` |  |
| `meta` | `object` |  |

Used by [`GET /api/remote/servers`](https://featherpanel.com/docs/api/reference/wings/remote/#get-remote-servers)

### `RenameRequest`

| Field | Type | Description |
| --- | --- | --- |
| `files`required | `object[]` | Array of rename operations |
| `root`required | `string` | Root directory path |

Used by [`PUT /api/user/servers/{uuidShort}/rename`](https://featherpanel.com/docs/api/reference/user/server/files/#put-user-servers-uuidShort-rename)

### `ResetPasswordRequest`

| Field | Type | Description |
| --- | --- | --- |
| `token`required | `string` | Password reset token from email |
| `password`required | `string` | New password |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/reset-password`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-reset-password)

### `ResetPasswordResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |

Used by [`PUT /api/user/auth/reset-password`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-reset-password)

### `Role`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Role ID |
| `name` | `string` | Role name |
| `display_name` | `string` | Role display name |
| `color` | `string` | Role color |
| `custom_badge` | `string` | Optional short label shown on user badges instead of the display name |
| `badge_icon` | `string` | Optional icon or image URL shown on role badges |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `RoleCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Role name |
| `display_name`required | `string` | Role display name |
| `color`required | `string` | Role color |
| `custom_badge` | `string` | Optional short label shown on user badges |
| `badge_icon` | `string` | Optional icon or image URL shown on role badges |

Used by [`PUT /api/admin/roles`](https://featherpanel.com/docs/api/reference/admin/roles/#put-admin-roles)

### `RoleDistribution`

| Field | Type | Description |
| --- | --- | --- |
| `role_id` | `integer` | Role ID |
| `role_name` | `string` | Role name |
| `role_display_name` | `string` | Role display name |
| `role_color` | `string` | Role color |
| `user_count` | `integer` | Number of users with this role |
| `percentage` | `number (float)` | Percentage of total users |

### `RolePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `RoleUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Role name |
| `display_name` | `string` | Role display name |
| `color` | `string` | Role color |
| `custom_badge` | `string` | Optional short label shown on user badges |
| `badge_icon` | `string` | Optional icon or image URL shown on role badges |

Used by [`PATCH /api/admin/roles/{id}`](https://featherpanel.com/docs/api/reference/admin/roles/#patch-admin-roles-id)

### `ScheduleCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Schedule name |
| `cron_day_of_week`required | `string` | Cron day of week expression |
| `cron_month`required | `string` | Cron month expression |
| `cron_day_of_month`required | `string` | Cron day of month expression |
| `cron_hour`required | `string` | Cron hour expression |
| `cron_minute`required | `string` | Cron minute expression |
| `timezone` | `string` | IANA timezone the cron expression is authored in (default: "UTC") |
| `is_active` | `boolean` | Whether schedule is active |
| `only_when_online` | `boolean` | Whether to run only when server is online |

Used by [`POST /api/user/servers/{uuidShort}/schedules`](https://featherpanel.com/docs/api/reference/user/server/schedules/#post-user-servers-uuidShort-schedules)

### `ScheduleCreateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Created schedule ID |
| `name` | `string` | Schedule name |
| `next_run_at` | `string (date-time)` | Next scheduled run time |

Used by [`POST /api/user/servers/{uuidShort}/schedules`](https://featherpanel.com/docs/api/reference/user/server/schedules/#post-user-servers-uuidShort-schedules)

### `SchedulePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total` | `integer` | Total number of records |
| `last_page` | `integer` | Last page number |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `ScheduleToggleResponse`

| Field | Type | Description |
| --- | --- | --- |
| `is_active` | `boolean` | New active status |
| `status` | `string` | Status description |

Used by [`POST /api/user/servers/{uuidShort}/schedules/{scheduleId}/toggle`](https://featherpanel.com/docs/api/reference/user/server/schedules/#post-user-servers-uuidShort-schedules-scheduleId-toggle)

### `ScheduleUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Schedule name |
| `cron_day_of_week` | `string` | Cron day of week expression |
| `cron_month` | `string` | Cron month expression |
| `cron_day_of_month` | `string` | Cron day of month expression |
| `cron_hour` | `string` | Cron hour expression |
| `cron_minute` | `string` | Cron minute expression |
| `timezone` | `string` | IANA timezone the cron expression is authored in |
| `is_active` | `boolean` | Whether schedule is active |
| `only_when_online` | `boolean` | Whether to run only when server is online |

Used by [`PUT /api/user/servers/{uuidShort}/schedules/{scheduleId}`](https://featherpanel.com/docs/api/reference/user/server/schedules/#put-user-servers-uuidShort-schedules-scheduleId)

### `SelftestResponse`

| Field | Type | Description |
| --- | --- | --- |
| `status` | `string` | Overall system status |
| `checks` | `object` | Individual check results |
| `timestamp` | `integer` | This check timestamp |
| `cached` | `boolean` | If the response is cached |

Used by [`GET /api/selftest`](https://featherpanel.com/docs/api/reference/system/selftest/#get-selftest)

### `Server`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Server ID |
| `uuid` | `string` | Server UUID |
| `uuidShort` | `string` | Short server UUID |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `startup` | `string` | Server startup command |
| `image` | `string` | Server Docker image |
| `status` | `string` | Server status |
| `node_id` | `integer` | Node ID |
| `owner_id` | `integer` | Owner user ID |
| `memory` | `integer` | Memory limit in MB |
| `swap` | `integer` | Swap limit in MB |
| `disk` | `integer` | Disk limit in MB |
| `io` | `integer` | IO limit |
| `cpu` | `integer` | CPU limit percentage |
| `allocation_id` | `integer` | Allocation ID |
| `realms_id` | `integer` | Realm ID |
| `spell_id` | `integer` | Spell ID |
| `allocation_limit` | `integer` | Allocation limit |
| `database_limit` | `integer` | Database limit |
| `backup_limit` | `integer` | Backup limit |
| `external_id` | `string` | External ID |
| `threads` | `string` | Specific CPU threads this process can run on. Single number, comma list, or ranges like 0,1,3 or 0-1,3 |
| `skip_scripts` | `boolean` | Skip scripts flag |
| `show_on_status` | `boolean` | Whether this server appears on the public status page |
| `auto_start` | `boolean` | Automatically start this server after the node reconnects (default off) |
| `auto_start_delay` | `integer` | Extra seconds to wait before auto-starting this server after reconnect |
| `manually_stopped` | `boolean` | Whether the server was intentionally stopped (auto-start skips these) |
| `oom_killer` | `boolean` | Whether the OOM killer is enabled (true) or disabled (false) |
| `suspended` | `boolean` | Suspended flag |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `ServerActivity`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Activity ID |
| `server_id` | `integer` | Server ID |
| `node_id` | `integer` | Node ID |
| `user_id` | `integer` | User ID |
| `activity_type` | `string` | Type of activity |
| `activity_description` | `string` | Activity description |
| `metadata` | `object` | Activity metadata |
| `ip_address` | `string` | IP address |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `ServerActivityPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `ServerAllocation`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Allocation ID |
| `server_id` | `integer` | Server ID |
| `node_id` | `integer` | Node ID |
| `ip` | `string` | IP address |
| `port` | `integer` | Port number |
| `notes` | `string` | Allocation notes |
| `is_primary` | `boolean` | Whether this is the primary allocation |
| `created_at` | `string (date-time)` | Allocation creation timestamp |
| `updated_at` | `string (date-time)` | Allocation update timestamp |

### `ServerAllocationInfo`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Server ID |
| `name` | `string` | Server name |
| `uuid` | `string` | Server UUID |
| `allocation_limit` | `integer` | Maximum number of allocations allowed |
| `current_allocations` | `integer` | Current number of allocations |
| `can_add_more` | `boolean` | Whether more allocations can be added |
| `primary_allocation_id` | `integer` | ID of the primary allocation |

### `ServerCreate`

| Field | Type | Description |
| --- | --- | --- |
| `node_id`required | `integer` | Node ID |
| `name`required | `string` | Server name |
| `description` | `string` | Server description (optional) |
| `owner_id`required | `integer` | Owner user ID |
| `memory`required | `integer` | Memory limit in MB |
| `swap`required | `integer` | Swap limit in MB (-1 = unlimited, 0 = disabled) |
| `disk`required | `integer` | Disk limit in MB |
| `io`required | `integer` | IO limit |
| `cpu`required | `integer` | CPU limit percentage |
| `allocation_id`required | `integer` | Allocation ID |
| `realms_id`required | `integer` | Realm ID |
| `spell_id`required | `integer` | Spell ID |
| `startup`required | `string` | Server startup command |
| `image`required | `string` | Server Docker image |
| `status` | `string` | Server status |
| `allocation_limit` | `integer` | Allocation limit |
| `database_limit` | `integer` | Database limit |
| `backup_limit` | `integer` | Backup limit |
| `external_id` | `string` | External ID |
| `threads` | `string` | Specific CPU threads this process can run on. Single number, comma list, or ranges like 0,1,3 or 0-1,3 |
| `skip_scripts` | `boolean` | Skip scripts flag |
| `show_on_status` | `boolean` | Whether this server appears on the public status page |
| `auto_start` | `boolean` | Automatically start this server after the node reconnects (default off) |
| `auto_start_delay` | `integer` | Extra seconds to wait before auto-starting this server after reconnect |
| `oom_disabled` | `boolean` | OOM disabled flag |
| `variables` | `object` | Server variables as key-value pairs |
| `mount_ids` | `integer[]` | Optional: Wings bind mounts to attach (validated against node/spell rules) |

Used by [`PUT /api/admin/servers`](https://featherpanel.com/docs/api/reference/admin/servers/#put-admin-servers)

### `ServerDatabase`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Database ID |
| `server_id` | `integer` | Server ID |
| `database_host_id` | `integer` | Database host ID |
| `database` | `string` | Database name |
| `username` | `string` | Database username |
| `password` | `string` | Database password |
| `remote` | `string` | Remote access pattern |
| `max_connections` | `integer` | Maximum connections |
| `database_host_name` | `string` | Database host name |
| `database_host` | `string` | Database host address |
| `database_port` | `integer` | Database host port |
| `database_type` | `string` | Database type |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

Used by [`GET /api/user/servers/{uuidShort}/databases/{databaseId}`](https://featherpanel.com/docs/api/reference/user/server/databases/#get-user-servers-uuidShort-databases-databaseId)

### `ServerDetail`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Server ID |
| `uuid` | `string` | Server UUID |
| `uuidShort` | `string` | Server short UUID |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `status` | `string` | Server status |
| `memory` | `integer` | Memory limit in MB |
| `disk` | `integer` | Disk limit in MB |
| `cpu` | `integer` | CPU limit percentage |
| `swap` | `integer` | Swap limit in MB |
| `io` | `integer` | IO limit |
| `node` | `object` | Node information |
| `realm` | `object` | Realm information |
| `spell` | `object` | Spell information |
| `allocation` | `object` | Allocation information |
| `location` | `object` | Location information |
| `sftp` | `object` |  |
| `variables` | `object[]` | Server variables |

Used by [`GET /api/user/servers/{uuidShort}`](https://featherpanel.com/docs/api/reference/user/server/core/#get-user-servers-uuidShort)

### `ServerFileItem`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | File or directory name |
| `type` | `string` | Item type |
| `size` | `integer` | File size in bytes (directory entry size for folders) |
| `directory_size` | `integer` | Recursive size of folder contents in bytes (only when requested from Wings) |
| `permissions` | `string` | File permissions |
| `modified_at` | `string (date-time)` | Last modified timestamp |
| `path` | `string` | Full file path |

### `ServerImportRequest`

| Field | Type | Description |
| --- | --- | --- |
| `user`required | `string` | Username for SFTP/FTP authentication |
| `password`required | `string` | Password for SFTP/FTP authentication |
| `hote`required | `string` | Hostname or IP address of the remote server |
| `port`required | `integer` | Port number (1-65535). Typically 22 for SFTP, 21 for FTP |
| `srclocation`required | `string` | Source path on the remote server (absolute path) |
| `dstlocation`required | `string` | Destination path on the local server (relative to server root) |
| `wipe` | `boolean` | If true, clears the destination directory before importing |
| `type`required | `string` | Connection type |

Used by [`POST /api/user/servers/{uuidShort}/import`](https://featherpanel.com/docs/api/reference/user/server/import/#post-user-servers-uuidShort-import)

### `ServerInstallCompletion`

| Field | Type | Description |
| --- | --- | --- |
| `successful`required | `boolean` | Whether installation was successful |
| `reinstall` | `boolean` | Whether this was a reinstall |

Used by [`POST /api/remote/servers/{uuid}/install`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-servers-uuid-install)

### `ServerInstallConfig`

| Field | Type | Description |
| --- | --- | --- |
| `container_image` | `string` | Docker container image |
| `entrypoint` | `string` | Container entrypoint |
| `script` | `string` | Installation script |

Used by [`GET /api/remote/servers/{uuid}/install`](https://featherpanel.com/docs/api/reference/wings/remote/#get-remote-servers-uuid-install)

### `ServerLogsResponse`

| Field | Type | Description |
| --- | --- | --- |
| `response` | `string[]` | Array of log lines from the server |

Used by [`GET /api/user/servers/{uuidShort}/logs`](https://featherpanel.com/docs/api/reference/user/server/logs/#get-user-servers-uuidShort-logs)

### `ServerPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `ServerSchedule`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Schedule ID |
| `server_id` | `integer` | Server ID |
| `name` | `string` | Schedule name |
| `cron_day_of_week` | `string` | Cron day of week expression |
| `cron_month` | `string` | Cron month expression |
| `cron_day_of_month` | `string` | Cron day of month expression |
| `cron_hour` | `string` | Cron hour expression |
| `cron_minute` | `string` | Cron minute expression |
| `timezone` | `string` | IANA timezone the cron expression is authored in (e.g. "Europe/Paris", "UTC") |
| `is_active` | `boolean` | Whether schedule is active |
| `is_processing` | `boolean` | Whether schedule is currently processing |
| `only_when_online` | `boolean` | Whether to run only when server is online |
| `next_run_at` | `string (date-time)` | Next scheduled run time |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

Used by [`GET /api/user/servers/{uuidShort}/schedules/{scheduleId}`](https://featherpanel.com/docs/api/reference/user/server/schedules/#get-user-servers-uuidShort-schedules-scheduleId)

### `ServerSearch`

| Field | Type | Description |
| --- | --- | --- |
| `query` | `string` | Search query |
| `has_results` | `boolean` | Whether search returned results |

### `ServerSFTP`

| Field | Type | Description |
| --- | --- | --- |
| `host` | `string` | SFTP host |
| `port` | `integer` | SFTP port |
| `username` | `string` | SFTP username |
| `password` | `string` | SFTP password placeholder |
| `url` | `string` | SFTP connection URL |

### `ServersResetResponse`

| Field | Type | Description |
| --- | --- | --- |
| `success` | `boolean` | Whether the reset was successful |
| `message` | `string` | Success message |

Used by [`POST /api/remote/servers/reset`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-servers-reset)

### `ServerStatusResponse`

| Field | Type | Description |
| --- | --- | --- |
| `state` | `string` | Current server state |
| `server_uuid` | `string` | Server UUID |
| `node_id` | `integer` | Node ID |

### `ServerStatusUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `data` | `object` |  |
| `state` | `string` | Server state (fallback format) |

Used by [`POST /api/remote/servers/{uuid}/container/status`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-servers-uuid-container-status)

### `ServerStatusUpdateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |
| `state` | `string` | Updated server state |
| `server_uuid` | `string` | Server UUID |

Used by [`POST /api/remote/servers/{uuid}/container/status`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-servers-uuid-container-status)

### `ServerSubdomainAvailableDomain`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string` |  |
| `domain` | `string` |  |
| `protocol_service` | `string` |  |
| `protocol_type` | `string` |  |
| `priority` | `integer` |  |
| `weight` | `integer` |  |
| `ttl` | `integer` |  |

### `ServerSubdomainEntry`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string` |  |
| `domain` | `string` |  |
| `subdomain` | `string` |  |
| `record_type` | `string` |  |
| `port` | `integer` |  |
| `created_at` | `string` |  |

### `ServerSubdomainOverview`

| Field | Type | Description |
| --- | --- | --- |
| `max_allowed` | `integer` |  |
| `current_total` | `integer` |  |
| `domains` | [`ServerSubdomainAvailableDomain[]`](#schema-serversubdomainavailabledomain) |  |
| `subdomains` | [`ServerSubdomainEntry[]`](#schema-serversubdomainentry) |  |

### `ServerUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `node_id` | `integer` | Node ID |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `owner_id` | `integer` | Owner user ID |
| `memory` | `integer` | Memory limit in MB |
| `swap` | `integer` | Swap limit in MB (-1 = unlimited, 0 = disabled) |
| `disk` | `integer` | Disk limit in MB |
| `io` | `integer` | IO limit |
| `cpu` | `integer` | CPU limit percentage |
| `allocation_id` | `integer` | Allocation ID |
| `realms_id` | `integer` | Realm ID |
| `spell_id` | `integer` | Spell ID |
| `startup` | `string` | Server startup command |
| `image` | `string` | Server Docker image |
| `status` | `string` | Server status |
| `allocation_limit` | `integer` | Allocation limit |
| `database_limit` | `integer` | Database limit |
| `backup_limit` | `integer` | Backup limit |
| `external_id` | `string` | External ID |
| `threads` | `string` | Specific CPU threads this process can run on. Single number, comma list, or ranges like 0,1,3 or 0-1,3 |
| `skip_scripts` | `boolean` | Skip scripts flag |
| `show_on_status` | `boolean` | Whether this server appears on the public status page |
| `auto_start` | `boolean` | Automatically start this server after the node reconnects (default off) |
| `auto_start_delay` | `integer` | Extra seconds to wait before auto-starting this server after reconnect |
| `oom_disabled` | `boolean` | OOM disabled flag |
| `variables` | `object` | Server variables as key-value pairs |
| `mount_ids` | `integer[]` | Optional: replace Wings bind mounts for this server |

Used by [`PATCH /api/admin/servers/{id}`](https://featherpanel.com/docs/api/reference/admin/servers/#patch-admin-servers-id)

### `ServerUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `startup` | `string` | Startup command |
| `image` | `string` | Docker image |
| `spell_id` | `integer` | Spell ID to change server spell |
| `wipe_files` | `boolean` | Whether to delete all server files before reinstalling (only applies when changing spell\_id) |
| `auto_start` | `boolean` | Start automatically after node reboot/reconnect |
| `auto_start_delay` | `integer` | Extra delay in seconds before auto-start |
| `variables` | `object[]` | Server variables |

Used by [`PUT /api/user/servers/{uuidShort}`](https://featherpanel.com/docs/api/reference/user/server/core/#put-user-servers-uuidShort)

### `ServerUpdateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `server` | `object` |  |

Used by [`PUT /api/user/servers/{uuidShort}`](https://featherpanel.com/docs/api/reference/user/server/core/#put-user-servers-uuidShort)

### `ServerVariable`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Variable ID |
| `server_id` | `integer` | Server ID |
| `variable_id` | `integer` | Spell variable ID |
| `variable_value` | `string` | Variable value |
| `name` | `string` | Variable name |
| `description` | `string` | Variable description |
| `env_variable` | `string` | Environment variable name |
| `default_value` | `string` | Default value |
| `user_viewable` | `boolean` | User viewable flag |
| `user_editable` | `boolean` | User editable flag |
| `rules` | `string` | Validation rules |
| `field_type` | `string` | Field type |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `SessionResponse`

| Field | Type | Description |
| --- | --- | --- |
| `user_info` | `object` | User information |
| `permissions` | `string[]` | User permissions |
| `preferences` | [`UserPreferences`](#schema-userpreferences) |  |

Used by [`GET /api/user/session`](https://featherpanel.com/docs/api/reference/user/session/#get-user-session)

### `SessionUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `username` | `string` | Username (alphanumeric and underscores only) |
| `email` | `string (email)` | User email address |
| `first_name` | `string` | User first name |
| `last_name` | `string` | User last name |
| `password` | `string` | User password |
| `avatar` | `string (uri)` | Avatar URL (must start with https://) |
| `ticket_signature` | `string` | Ticket signature (supports Markdown) |
| `two_fa_enabled` | `boolean` | Two-factor authentication enabled status |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PATCH /api/user/session`](https://featherpanel.com/docs/api/reference/user/session/#patch-user-session)

### `SessionUpdateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |

Used by [`PATCH /api/user/session`](https://featherpanel.com/docs/api/reference/user/session/#patch-user-session)

### `Setting`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Setting name/key |
| `value` | `string` | Current setting value |
| `description` | `string` | Setting description |
| `type` | `string` | Setting input type |
| `required` | `boolean` | Whether the setting is required |
| `placeholder` | `string` | Placeholder text for the input |
| `validation` | `string` | Validation rules |
| `options` | `string[]` | Available options for select fields |
| `category` | `string` | Setting category |

### `SettingCategory`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `string` | Category ID |
| `name` | `string` | Category name |
| `description` | `string` | Category description |
| `icon` | `string` | Category icon |
| `settings_count` | `integer` | Number of settings in this category |

### `SftpAuthErrorResponse`

| Field | Type | Description |
| --- | --- | --- |
| `error` | `string` | Error message |

### `SftpAuthRequest`

| Field | Type | Description |
| --- | --- | --- |
| `type`required | `string` | Authentication type |
| `username`required | `string` | Username in format username.serverid |
| `password`required | `string` | Password or public key content |
| `ip`required | `string` | Client IP address |
| `session_id` | `string` | Session ID |
| `client_version` | `string` | SFTP client version |

Used by [`POST /api/remote/sftp/auth`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-sftp-auth)

### `SftpAuthSuccessResponse`

| Field | Type | Description |
| --- | --- | --- |
| `server` | `string` | Server UUID |
| `user` | `string` | User UUID |
| `permissions` | `string[]` | File permissions |

Used by [`POST /api/remote/sftp/auth`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-sftp-auth)

### `SidebarItem`

| Field | Type | Description |
| --- | --- | --- |
| `plugin` | `string` | Plugin identifier |
| `pluginName` | `string` | Plugin display name |
| `title` | `string` | Sidebar item title |
| `url` | `string` | Sidebar item URL |
| `icon` | `string` | Sidebar item icon (emoji or URL). Used as fallback if lucideIcon is not provided. |
| `lucideIcon` | `string` | Lucide icon name (e.g., "camera", "search"). If provided, this will be used instead of the icon field. See https://lucide.dev/icons/ for available icons. |
| `permission` | `string` | Required permission for this item |
| `group` | `string` | Group name for organizing items (e.g., "Minecraft Java Edition"). Items with the same group name will be grouped together. |
| `priority` | `integer` | Sort order within the sidebar group. Lower numbers render first. |
| `hidden` | `boolean` | Hide this sidebar route when true or when a visibility setting evaluates true. |

### `SignApiKeyRequest`

| Field | Type | Description |
| --- | --- | --- |
| `api_key` | `string` | API key to sign |

Used by [`POST /api/user/sign-api-key`](https://featherpanel.com/docs/api/reference/user/session/#post-user-sign-api-key)

### `SignApiKeyResponse`

| Field | Type | Description |
| --- | --- | --- |
| `signature` | `string` | Signature |
| `api_key` | `string` | API key |

Used by [`POST /api/user/sign-api-key`](https://featherpanel.com/docs/api/reference/user/session/#post-user-sign-api-key)

### `Spell`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Spell ID |
| `uuid` | `string` | Spell UUID |
| `realm_id` | `integer` | Realm ID |
| `author` | `string` | Spell author |
| `name` | `string` | Spell name |
| `description` | `string` | Spell description |
| `features` | `string` | Spell features (JSON) |
| `docker_images` | `string` | Docker images (JSON) |
| `default_docker_image` | `string` | Default Docker image used on new server installs |
| `file_denylist` | `string` | File denylist (JSON) |
| `update_url` | `string` | Update URL |
| `config_files` | `string` | Config files |
| `config_startup` | `string` | Config startup |
| `config_logs` | `string` | Config logs |
| `config_stop` | `string` | Config stop |
| `startup` | `string` | Startup command |
| `script_container` | `string` | Script container |
| `script_entry` | `string` | Script entry point |
| `script_is_privileged` | `boolean` | Script is privileged |
| `script_install` | `string` | Installation script |
| `force_outgoing_ip` | `boolean` | Force outgoing IP |
| `config_from` | `integer` | Config from spell ID |
| `copy_script_from` | `integer` | Copy script from spell ID |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `SpellCreate`

| Field | Type | Description |
| --- | --- | --- |
| `realm_id`required | `integer` | Realm ID |
| `author`required | `string` | Spell author |
| `name`required | `string` | Spell name |
| `description` | `string` | Spell description |
| `features` | `string` | Spell features (JSON) |
| `docker_images` | `string` | Docker images (JSON) |
| `default_docker_image` | `string` | Default Docker image used on new server installs |
| `file_denylist` | `string` | File denylist (JSON) |
| `update_url` | `string` | Update URL |
| `config_files` | `string` | Config files |
| `config_startup` | `string` | Config startup |
| `config_logs` | `string` | Config logs |
| `config_stop` | `string` | Config stop |
| `startup` | `string` | Startup command |
| `script_container` | `string` | Script container |
| `script_entry` | `string` | Script entry point |
| `script_is_privileged` | `boolean` | Script is privileged |
| `script_install` | `string` | Installation script |
| `force_outgoing_ip` | `boolean` | Force outgoing IP |
| `config_from` | `integer` | Config from spell ID |
| `copy_script_from` | `integer` | Copy script from spell ID |
| `uuid` | `string` | Spell UUID (auto-generated if not provided) |
| `id` | `integer` | Optional spell ID (useful for migrations from other platforms) |

Used by [`PUT /api/admin/spells`](https://featherpanel.com/docs/api/reference/admin/spells/#put-admin-spells)

### `SpellImport`

| Field | Type | Description |
| --- | --- | --- |
| `realm_id`required | `integer` | Realm ID |
| `file` | `string (binary)` | Spell JSON file |

Used by [`POST /api/admin/spells/import`](https://featherpanel.com/docs/api/reference/admin/spells/#post-admin-spells-import)

### `SpellPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `SpellUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `realm_id` | `integer` | Realm ID |
| `author` | `string` | Spell author |
| `name` | `string` | Spell name |
| `description` | `string` | Spell description |
| `features` | `string` | Spell features (JSON) |
| `docker_images` | `string` | Docker images (JSON) |
| `default_docker_image` | `string` | Default Docker image used on new server installs |
| `file_denylist` | `string` | File denylist (JSON) |
| `update_url` | `string` | Update URL |
| `config_files` | `string` | Config files |
| `config_startup` | `string` | Config startup |
| `config_logs` | `string` | Config logs |
| `config_stop` | `string` | Config stop |
| `startup` | `string` | Startup command |
| `script_container` | `string` | Script container |
| `script_entry` | `string` | Script entry point |
| `script_is_privileged` | `boolean` | Script is privileged |
| `script_install` | `string` | Installation script |
| `force_outgoing_ip` | `boolean` | Force outgoing IP |
| `config_from` | `integer` | Config from spell ID |
| `copy_script_from` | `integer` | Copy script from spell ID |
| `uuid` | `string` | Spell UUID |

Used by [`PATCH /api/admin/spells/{id}`](https://featherpanel.com/docs/api/reference/admin/spells/#patch-admin-spells-id)

### `SpellVariable`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Variable ID |
| `spell_id` | `integer` | Spell ID |
| `name` | `string` | Variable name |
| `description` | `string` | Variable description |
| `env_variable` | `string` | Environment variable name |
| `default_value` | `string` | Default value |
| `user_viewable` | `boolean` | User viewable flag |
| `user_editable` | `boolean` | User editable flag |
| `rules` | `string` | Validation rules |
| `field_type` | `string` | Field type |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `SpellVariableCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Variable name |
| `env_variable`required | `string` | Environment variable name |
| `description`required | `string` | Variable description |
| `default_value`required | `string` | Default value |
| `user_viewable` | `boolean` | User viewable flag |
| `user_editable` | `boolean` | User editable flag |
| `rules` | `string` | Validation rules |
| `field_type` | `string` | Field type |

Used by [`POST /api/admin/spells/{spellId}/variables`](https://featherpanel.com/docs/api/reference/admin/spells/#post-admin-spells-spellId-variables)

### `SpellVariableUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Variable name |
| `env_variable` | `string` | Environment variable name |
| `description` | `string` | Variable description |
| `default_value` | `string` | Default value |
| `user_viewable` | `boolean` | User viewable flag |
| `user_editable` | `boolean` | User editable flag |
| `rules` | `string` | Validation rules |
| `field_type` | `string` | Field type |

Used by [`PATCH /api/admin/spell-variables/{id}`](https://featherpanel.com/docs/api/reference/admin/spells/#patch-admin-spell-variables-id)

### `SshKeyActivity`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Activity ID |
| `user_uuid` | `string` | User UUID |
| `name` | `string` | Activity name |
| `context` | `string` | Activity context |
| `ip_address` | `string` | IP address |
| `created_at` | `string (date-time)` | Creation timestamp |

### `SshKeyCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | SSH key name |
| `public_key`required | `string` | SSH public key |

Used by [`POST /api/user/ssh-keys`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#post-user-ssh-keys)

### `SshKeyFingerprintRequest`

| Field | Type | Description |
| --- | --- | --- |
| `public_key`required | `string` | SSH public key to generate fingerprint for |

Used by [`POST /api/user/ssh-keys/generate-fingerprint`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#post-user-ssh-keys-generate-fingerprint)

### `SshKeyFingerprintResponse`

| Field | Type | Description |
| --- | --- | --- |
| `fingerprint` | `string` | Generated fingerprint |
| `public_key` | `string` | Original public key |

Used by [`POST /api/user/ssh-keys/generate-fingerprint`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#post-user-ssh-keys-generate-fingerprint)

### `SshKeyPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `SshKeySearch`

| Field | Type | Description |
| --- | --- | --- |
| `query` | `string` | Search query |
| `has_results` | `boolean` | Whether search returned results |

### `SshKeyUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | SSH key name |
| `public_key` | `string` | SSH public key |

Used by [`PUT /api/user/ssh-keys/{id}`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#put-user-ssh-keys-id)

### `SubdomainManagerDomain`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string` |  |
| `domain` | `string` |  |
| `description` | `string` |  |
| `is_active` | `integer` |  |
| `cloudflare_zone_id` | `string` |  |
| `cloudflare_account_id` | `string` |  |
| `subdomain_count` | `integer` |  |
| `spells` | [`SubdomainManagerSpellMapping[]`](#schema-subdomainmanagerspellmapping) |  |
| `created_at` | `string` |  |
| `updated_at` | `string` |  |

### `SubdomainManagerSpellMapping`

| Field | Type | Description |
| --- | --- | --- |
| `spell_id` | `integer` |  |
| `protocol_service` | `string` |  |
| `protocol_type` | `string` |  |
| `priority` | `integer` |  |
| `weight` | `integer` |  |
| `ttl` | `integer` |  |
| `spell` | `object` |  |

### `SubdomainManagerSubdomain`

| Field | Type | Description |
| --- | --- | --- |
| `uuid` | `string` |  |
| `subdomain` | `string` |  |
| `record_type` | `string` |  |
| `port` | `integer` |  |
| `server_id` | `integer` |  |
| `spell_id` | `integer` |  |
| `cloudflare_record_id` | `string` |  |
| `created_at` | `string` |  |

### `Subuser`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Subuser ID |
| `user_id` | `integer` | User ID |
| `server_id` | `integer` | Server ID |
| `permissions` | `string[]` | Array of permission strings |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

Used by [`GET /api/user/servers/{uuidShort}/subusers/{subuserId}`](https://featherpanel.com/docs/api/reference/user/server/subusers/#get-user-servers-uuidShort-subusers-subuserId)

### `SubuserCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `email`required | `string (email)` | Email address of user to add as subuser |

Used by [`POST /api/user/servers/{uuidShort}/subusers`](https://featherpanel.com/docs/api/reference/user/server/subusers/#post-user-servers-uuidShort-subusers)

### `SubuserPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total` | `integer` | Total number of records |
| `last_page` | `integer` | Last page number |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `SubuserUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `permissions` | `string[]` | Array of permission strings |

### `SubuserWithDetails`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Subuser ID |
| `user_id` | `integer` | User ID |
| `server_id` | `integer` | Server ID |
| `permissions` | `string[]` | Array of permission strings |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `username` | `string` | User username |
| `email` | `string (email)` | User email |
| `first_name` | `string` | User first name |
| `last_name` | `string` | User last name |
| `uuid` | `string` | User UUID |

Used by [`POST /api/user/servers/{uuidShort}/subusers`](https://featherpanel.com/docs/api/reference/user/server/subusers/#post-user-servers-uuidShort-subusers), [`GET /api/user/servers/{uuidShort}/subusers/{subuserId}/details`](https://featherpanel.com/docs/api/reference/user/server/subusers/#get-user-servers-uuidShort-subusers-subuserId-details)

### `Task`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Task ID |
| `schedule_id` | `integer` | Schedule ID |
| `sequence_id` | `integer` | Task sequence order |
| `action` | `string` | Task action type |
| `payload` | `string` | Task payload data |
| `time_offset` | `integer` | Time offset in seconds |
| `is_queued` | `boolean` | Whether task is queued |
| `continue_on_failure` | `boolean` | Whether to continue on failure |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

Used by [`GET /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks/{taskId}`](https://featherpanel.com/docs/api/reference/user/server/tasks/#get-user-servers-uuidShort-schedules-scheduleId-tasks-taskId)

### `TaskCreateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `action`required | `string` | Task action type |
| `payload` | `string` | Task payload data |
| `time_offset` | `integer` | Time offset in seconds |
| `continue_on_failure` | `boolean` | Whether to continue on failure |

Used by [`POST /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks`](https://featherpanel.com/docs/api/reference/user/server/tasks/#post-user-servers-uuidShort-schedules-scheduleId-tasks)

### `TaskCreateResponse`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Created task ID |
| `action` | `string` | Task action type |
| `sequence_id` | `integer` | Task sequence order |

Used by [`POST /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks`](https://featherpanel.com/docs/api/reference/user/server/tasks/#post-user-servers-uuidShort-schedules-scheduleId-tasks)

### `TaskPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total` | `integer` | Total number of records |
| `last_page` | `integer` | Last page number |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `TaskSequenceUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `sequence_id`required | `integer` | New sequence order for the task |

Used by [`PUT /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks/{taskId}/sequence`](https://featherpanel.com/docs/api/reference/user/server/tasks/#put-user-servers-uuidShort-schedules-scheduleId-tasks-taskId-sequence)

### `TaskStatusToggleResponse`

| Field | Type | Description |
| --- | --- | --- |
| `is_queued` | `integer` | New queued status |
| `status` | `string` | Status description |

Used by [`PUT /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks/{taskId}/queue`](https://featherpanel.com/docs/api/reference/user/server/tasks/#put-user-servers-uuidShort-schedules-scheduleId-tasks-taskId-queue)

### `TaskUpdateRequest`

| Field | Type | Description |
| --- | --- | --- |
| `action` | `string` | Task action type |
| `payload` | `string` | Task payload data |
| `time_offset` | `integer` | Time offset in seconds |
| `continue_on_failure` | `boolean` | Whether to continue on failure |

Used by [`PUT /api/user/servers/{uuidShort}/schedules/{scheduleId}/tasks/{taskId}`](https://featherpanel.com/docs/api/reference/user/server/tasks/#put-user-servers-uuidShort-schedules-scheduleId-tasks-taskId)

### `Ticket`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Ticket ID |
| `uuid` | `string (uuid)` | Ticket UUID |
| `user_uuid` | `string (uuid)` | User UUID who created the ticket |
| `server_id` | `integer` | Server ID if ticket is related to a server |
| `category_id` | `integer` | Category ID |
| `priority_id` | `integer` | Priority ID |
| `status_id` | `integer` | Status ID |
| `title` | `string` | Ticket title |
| `description` | `string` | Ticket description |
| `closed_at` | `string (date-time)` | Ticket closed timestamp |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketAttachment`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Attachment ID |
| `ticket_id` | `integer` | Ticket ID |
| `message_id` | `integer` | Message ID |
| `file_name` | `string` | Stored file name |
| `file_path` | `string` | Relative file path |
| `file_size` | `integer` | File size in bytes |
| `file_type` | `string` | MIME type |
| `user_downloadable` | `boolean` | Whether users can download this file |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketCategory`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Category ID |
| `name` | `string` | Category name |
| `icon` | `string` | Category icon |
| `color` | `string` | Category color |
| `support_email` | `string` | Support email for this category |
| `open_hours` | `string` | Open hours |
| `description` | `string` | Category description |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketCategoryCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Category name |
| `icon` | `string` | Category icon |
| `color` | `string` | Category color |
| `support_email` | `string` | Support email for this category |
| `open_hours` | `string` | Open hours |
| `description` | `string` | Category description |

Used by [`PUT /api/admin/tickets/categories`](https://featherpanel.com/docs/api/reference/admin/tickets/#put-admin-tickets-categories)

### `TicketCategoryPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `TicketCategoryUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Category name |
| `icon` | `string` | Category icon |
| `color` | `string` | Category color |
| `support_email` | `string` | Support email for this category |
| `open_hours` | `string` | Open hours |
| `description` | `string` | Category description |

Used by [`PATCH /api/admin/tickets/categories/{id}`](https://featherpanel.com/docs/api/reference/admin/tickets/#patch-admin-tickets-categories-id)

### `TicketCreate`

| Field | Type | Description |
| --- | --- | --- |
| `user_uuid`required | `string (uuid)` | User UUID who is creating the ticket |
| `server_id` | `integer` | Server ID if ticket is related to a server |
| `category_id`required | `integer` | Category ID |
| `priority_id`required | `integer` | Priority ID |
| `status_id`required | `integer` | Status ID |
| `title`required | `string` | Ticket title |
| `description`required | `string` | Ticket description |

Used by [`PUT /api/admin/tickets`](https://featherpanel.com/docs/api/reference/admin/tickets/#put-admin-tickets)

### `TicketMessage`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Message ID |
| `ticket_id` | `integer` | Ticket ID |
| `user_uuid` | `string (uuid)` | User UUID who sent the message |
| `message` | `string` | Message content |
| `is_internal` | `boolean` | Whether this is an internal note (staff only) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketMessageCreate`

| Field | Type | Description |
| --- | --- | --- |
| `message`required | `string` | Message content |
| `is_internal` | `boolean` | Whether this is an internal note (staff only) |

Used by [`POST /api/admin/tickets/{uuid}/messages`](https://featherpanel.com/docs/api/reference/admin/tickets/#post-admin-tickets-uuid-messages)

### `TicketMessageUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Message content |
| `is_internal` | `boolean` | Whether this is an internal note (staff only) |

Used by [`PATCH /api/admin/tickets/{uuid}/messages/{id}`](https://featherpanel.com/docs/api/reference/admin/tickets/#patch-admin-tickets-uuid-messages-id)

### `TicketPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `TicketPriority`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Priority ID |
| `name` | `string` | Priority name |
| `color` | `string` | Priority color |
| `sort_order` | `integer` | Display order (lower appears first) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketPriorityCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Priority name |
| `color` | `string` | Priority color |
| `sort_order` | `integer` | Display order (lower appears first) |

Used by [`PUT /api/admin/tickets/priorities`](https://featherpanel.com/docs/api/reference/admin/tickets/#put-admin-tickets-priorities)

### `TicketPriorityPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `TicketPriorityUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Priority name |
| `color` | `string` | Priority color |
| `sort_order` | `integer` | Display order (lower appears first) |

Used by [`PATCH /api/admin/tickets/priorities/{id}`](https://featherpanel.com/docs/api/reference/admin/tickets/#patch-admin-tickets-priorities-id)

### `TicketReply`

| Field | Type | Description |
| --- | --- | --- |
| `message`required | `string` | Reply message |
| `is_internal` | `boolean` | Whether this is an internal note (staff only) |

Used by [`POST /api/admin/tickets/{uuid}/reply`](https://featherpanel.com/docs/api/reference/admin/tickets/#post-admin-tickets-uuid-reply)

### `TicketStatus`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Status ID |
| `name` | `string` | Status name |
| `color` | `string` | Status color |
| `sort_order` | `integer` | Display order (lower appears first) |
| `is_default` | `integer` | Whether new tickets use this status (0 or 1) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `TicketStatusCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | Status name |
| `color` | `string` | Status color |
| `sort_order` | `integer` | Display order (lower appears first) |
| `is_default` | `boolean` | Assign this status to newly created tickets |

Used by [`PUT /api/admin/tickets/statuses`](https://featherpanel.com/docs/api/reference/admin/tickets/#put-admin-tickets-statuses)

### `TicketStatusPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `TicketStatusUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Status name |
| `color` | `string` | Status color |
| `sort_order` | `integer` | Display order (lower appears first) |
| `is_default` | `boolean` | Assign this status to newly created tickets |

Used by [`PATCH /api/admin/tickets/statuses/{id}`](https://featherpanel.com/docs/api/reference/admin/tickets/#patch-admin-tickets-statuses-id)

### `TicketUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `server_id` | `integer` | Server ID if ticket is related to a server |
| `category_id` | `integer` | Category ID |
| `priority_id` | `integer` | Priority ID |
| `status_id` | `integer` | Status ID |
| `title` | `string` | Ticket title |
| `description` | `string` | Ticket description |
| `closed_at` | `string (date-time)` | Ticket closed timestamp |

Used by [`PATCH /api/admin/tickets/{uuid}`](https://featherpanel.com/docs/api/reference/admin/tickets/#patch-admin-tickets-uuid)

### `TokenValidationResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Token validation message |
| `token` | `string` | Validated token |

Used by [`GET /api/user/auth/reset-password`](https://featherpanel.com/docs/api/reference/user/auth/#get-user-auth-reset-password)

### `TopUser`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | User ID |
| `uuid` | `string` | User UUID |
| `username` | `string` | Username |
| `email` | `string` | Email address |
| `first_name` | `string` | First name |
| `last_name` | `string` | Last name |
| `server_count` | `integer` | Number of servers owned |

### `TranslationFile`

| Field | Type | Description |
| --- | --- | --- |
| `code` | `string` |  |
| `name` | `string` |  |
| `file` | `string` |  |
| `size` | `integer` |  |
| `modified` | `string` |  |

### `TwoFactorEnableRequest`

| Field | Type | Description |
| --- | --- | --- |
| `code`required | `string` | 6-digit TOTP code |
| `secret`required | `string` | 16-character secret key |
| `turnstile_token` | `string` | CloudFlare Turnstile token (required if Turnstile is enabled) |

Used by [`PUT /api/user/auth/two-factor`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-two-factor)

### `TwoFactorEnableResponse`

| Field | Type | Description |
| --- | --- | --- |
| `user` | `object` | User information |
| `message` | `string` | Success message |

Used by [`PUT /api/user/auth/two-factor`](https://featherpanel.com/docs/api/reference/user/auth/#put-user-auth-two-factor)

### `TwoFactorRequiredResponse`

| Field | Type | Description |
| --- | --- | --- |
| `email` | `string` | User email address |
| `challenge` | `string` | Short-lived token proving password auth succeeded; required for /two-factor |
| `message` | `string` | 2FA required message |

### `TwoFactorSetupResponse`

| Field | Type | Description |
| --- | --- | --- |
| `qr_code_url` | `string` | QR code URL for authenticator app |
| `secret` | `string` | Secret key for manual entry |
| `message` | `string` | Success message |

Used by [`GET /api/user/auth/two-factor`](https://featherpanel.com/docs/api/reference/user/auth/#get-user-auth-two-factor)

### `TwoFactorVerifyRequest`

| Field | Type | Description |
| --- | --- | --- |
| `email`required | `string (email)` | User email address |
| `code`required | `string` | 6-digit TOTP code |
| `challenge`required | `string` | Challenge token from the password authentication step (TWO\_FACTOR\_REQUIRED) |

Used by [`POST /api/user/auth/two-factor`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-two-factor)

### `TwoFactorVerifyResponse`

| Field | Type | Description |
| --- | --- | --- |
| `user` | `object` | User information |
| `message` | `string` | Success message |

Used by [`POST /api/user/auth/two-factor`](https://featherpanel.com/docs/api/reference/user/auth/#post-user-auth-two-factor)

### `UrlInstall`

| Field | Type | Description |
| --- | --- | --- |
| `url`required | `string (uri)` | URL to download addon from |

Used by [`POST /api/admin/plugins/upload/install-url`](https://featherpanel.com/docs/api/reference/admin/plugins/#post-admin-plugins-upload-install-url)

### `User`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | User ID |
| `uuid` | `string` | User UUID |
| `username` | `string` | Username |
| `first_name` | `string` | First name |
| `last_name` | `string` | Last name |
| `email` | `string (email)` | Email address |
| `email_verified` | `boolean` | Whether the user email is verified |
| `avatar` | `string (uri)` | Avatar URL |
| `last_seen` | `string (date-time)` | Last seen timestamp |
| `banned` | `boolean` | Banned status |
| `two_fa_enabled` | `boolean` | Two-factor authentication enabled |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `role` | `object` | User role information |
| `activities` | `object[]` | User activities |
| `mails` | `object[]` | User mail history |

### `UserActivity`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Activity name |
| `context` | `string` | Activity context |
| `ip_address` | `string` | IP address |
| `created_at` | `string (date-time)` | Activity timestamp |

### `UserAnalyticsOverview`

| Field | Type | Description |
| --- | --- | --- |
| `total` | `integer` | Total user count |
| `active` | `integer` | Active users (not banned) |
| `banned` | `integer` | Banned users |
| `verified` | `integer` | Email verified users |
| `two_fa_enabled` | `integer` | Users with 2FA enabled |
| `unverified` | `integer` | Unverified users |
| `percentage_verified` | `number (float)` | Percentage of verified users |
| `percentage_banned` | `number (float)` | Percentage of banned users |
| `percentage_two_fa` | `number (float)` | Percentage of users with 2FA |

Used by [`GET /api/admin/analytics/users/overview`](https://featherpanel.com/docs/api/reference/admin/kpi/analytics/#get-admin-analytics-users-overview)

### `UserCreate`

| Field | Type | Description |
| --- | --- | --- |
| `username`required | `string` | Username |
| `first_name`required | `string` | First name |
| `last_name`required | `string` | Last name |
| `email`required | `string (email)` | Email address |
| `password`required | `string` | Password |
| `avatar` | `string (uri)` | Avatar URL |
| `role_id` | `integer` | Role ID (defaults to 1) |

Used by [`PUT /api/admin/users`](https://featherpanel.com/docs/api/reference/admin/users/#put-admin-users)

### `UserMail`

| Field | Type | Description |
| --- | --- | --- |
| `subject` | `string` | Mail subject |
| `template` | `string` | Mail template |
| `data` | `object` | Mail data |
| `status` | `string` | Mail status |
| `created_at` | `string (date-time)` | Mail timestamp |

### `UserNotification`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Notification ID |
| `user_id` | `integer` | Target user ID (null = global) |
| `server_id` | `integer` | Target server ID (null = account/global) |
| `title` | `string` | Notification title |
| `message_markdown` | `string` | Notification message in Markdown format |
| `type` | `string` | Notification type |
| `is_dismissible` | `boolean` | Whether the notification can be dismissed |
| `is_sticky` | `boolean` | Whether the notification stays until explicitly closed |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `UserPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `UserPreferences`

User preferences stored as localStorage key-value pairs

| Field | Type | Description |
| --- | --- | --- |
| `timezone` | `string` | IANA timezone identifier used for date rendering; null means browser default |
| `favorite_server_uuids` | `string (uuid)[]` | Pinned server UUIDs (max 50) |
| `hide_server_ips` | `boolean` | Mask server IP addresses in the panel UI for this account only |

Used by [`PATCH /api/user/preferences`](https://featherpanel.com/docs/api/reference/user/session/#patch-user-preferences)

### `UserSearchResponse`

| Field | Type | Description |
| --- | --- | --- |
| `users` | [`UserSearchResult[]`](#schema-usersearchresult) |  |
| `total` | `integer` | Total number of users found |

Used by [`GET /api/user/servers/{uuidShort}/subusers/search-users`](https://featherpanel.com/docs/api/reference/user/server/subusers/#get-user-servers-uuidShort-subusers-search-users)

### `UserSearchResult`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | User ID |
| `username` | `string` | Username |
| `email` | `string (email)` | Email address |
| `uuid` | `string` | User UUID |
| `first_name` | `string` | First name |
| `last_name` | `string` | Last name |

### `UserServer`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Server ID |
| `uuid` | `string` | Server UUID |
| `uuidShort` | `string` | Server short UUID |
| `name` | `string` | Server name |
| `description` | `string` | Server description |
| `status` | `string` | Server status |
| `memory` | `integer` | Memory limit in MB |
| `disk` | `integer` | Disk limit in MB |
| `cpu` | `integer` | CPU limit percentage |
| `swap` | `integer` | Swap limit in MB |
| `io` | `integer` | IO limit |
| `is_subuser` | `boolean` | Whether user is a subuser |
| `subuser_permissions` | `string[]` | Subuser permissions |
| `subuser_id` | `integer` | Subuser ID if applicable |
| `node` | `object` |  |
| `location` | `object` |  |
| `realm` | `object` |  |
| `spell` | `object` |  |
| `allocation` | `object` |  |

### `UserServerActivity`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | Activity ID |
| `server_id` | `integer` | Server ID |
| `node_id` | `integer` | Node ID |
| `user_id` | `integer` | User ID (null for daemon events) |
| `event` | `string` | Activity event name |
| `metadata` | `object` | Activity metadata (parsed from JSON) |
| `ip` | `string` | IP address |
| `timestamp` | `string (date-time)` | Activity timestamp |
| `created_at` | `string (date-time)` | Created timestamp |
| `updated_at` | `string (date-time)` | Updated timestamp |
| `user` | `object` | User information (null for daemon events) |

### `UserServerPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `UserSshKey`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | SSH key ID |
| `user_id` | `integer` | User ID |
| `name` | `string` | SSH key name |
| `public_key` | `string` | SSH public key |
| `fingerprint` | `string` | SSH key fingerprint |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `deleted_at` | `string (date-time)` | Deletion timestamp |

Used by [`POST /api/user/ssh-keys`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#post-user-ssh-keys), [`GET /api/user/ssh-keys/{id}`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#get-user-ssh-keys-id), [`PUT /api/user/ssh-keys/{id}`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#put-user-ssh-keys-id), [`POST /api/user/ssh-keys/{id}/restore`](https://featherpanel.com/docs/api/reference/user/ssh-keys/#post-user-ssh-keys-id-restore)

### `UserSshKeyList`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | SSH key ID |
| `user_id` | `integer` | User ID |
| `name` | `string` | SSH key name |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |
| `deleted_at` | `string (date-time)` | Deletion timestamp |

### `UserUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `username` | `string` | Username |
| `first_name` | `string` | First name |
| `last_name` | `string` | Last name |
| `email` | `string (email)` | Email address |
| `password` | `string` | Password |
| `avatar` | `string (uri)` | Avatar URL |
| `role_id` | `integer` | Role ID |
| `banned` | `boolean` | Banned status |

Used by [`PATCH /api/admin/users/{uuid}`](https://featherpanel.com/docs/api/reference/admin/users/#patch-admin-users-uuid)

### `UserVmInstanceActivity`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | User-facing VM instance activity log (separate table, like ServerActivityController for servers). |
| `vm_instance_id` | `integer` |  |
| `vm_node_id` | `integer` |  |
| `user_id` | `integer` |  |
| `event` | `string` |  |
| `metadata` | `object` |  |
| `ip` | `string` |  |
| `timestamp` | `string (date-time)` |  |
| `user` | `object` |  |

### `VdsChatbotRequest`

| Field | Type | Description |
| --- | --- | --- |
| `message`required | `string` | User message |
| `history` | `object[]` | Chat history |

Used by [`POST /api/user/vds-chatbot/chat`](https://featherpanel.com/docs/api/reference/user/vds/chatbot/#post-user-vds-chatbot-chat)

### `VdsChatbotResponse`

| Field | Type | Description |
| --- | --- | --- |
| `response` | `string` | VDS AI assistant response |

### `VmInstance`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | VM Instance ID |
| `vmid` | `integer` | Proxmox VMID |
| `vm_node_id` | `integer` | VM Node ID |
| `user_uuid` | `string` | User UUID |
| `pve_node` | `string` | Proxmox node name |
| `plan_id` | `integer` | Plan ID |
| `template_id` | `integer` | Template ID |
| `vm_type` | `string` | VM Type |
| `hostname` | `string` | Hostname |
| `status` | `string` | VM Status |
| `ip_address` | `string` | IP Address |
| `subnet_mask` | `string` | Subnet Mask |
| `gateway` | `string` | Gateway |
| `vm_ip_id` | `integer` | VM IP ID |
| `notes` | `string` | Notes |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `VmInstanceActivityPagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` |  |
| `per_page` | `integer` |  |
| `total` | `integer` |  |
| `last_page` | `integer` |  |
| `from` | `integer` |  |
| `to` | `integer` |  |

### `VmInstanceCreate`

| Field | Type | Description |
| --- | --- | --- |
| `vm_node_id`required | `integer` | VM Node ID |
| `template_id`required | `integer` | Template ID |
| `pve_node` | `string` | Explicit Proxmox cluster node to place the VM on |
| `memory` | `integer` | Memory in MB |
| `cpus` | `integer` | Number of CPU sockets |
| `cores` | `integer` | Number of CPU cores per socket |
| `disk` | `integer` | Disk size in GB |
| `storage` | `string` | Storage name |
| `bridge` | `string` | Network bridge |
| `on_boot` | `integer` | Start on boot |
| `hostname` | `string` | Hostname |
| `vm_ip_id` | `integer` | Specific IP ID to assign |
| `networks` | `object[]` | List of network IP assignments for this VM |
| `user_uuid` | `string` | User UUID |
| `notes` | `string` | Notes |
| `ci_user` | `string` | Cloud-init user (required for KVM/QEMU) |
| `ci_password` | `string` | Cloud-init password (required for KVM/QEMU). Not used for LXC. |

Used by [`PUT /api/admin/vm-instances`](https://featherpanel.com/docs/api/reference/admin/vm-instances/#put-admin-vm-instances)

### `VmInstancePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |

### `VmInstanceUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `hostname` | `string` | Hostname |
| `notes` | `string` | Notes |
| `user_uuid` | `string` | User UUID |
| `vm_ip_id` | `integer` | VM IP ID |
| `memory` | `integer` | Memory in MB |
| `cpus` | `integer` | Number of CPUs |
| `cores` | `integer` | Number of Cores |
| `on_boot` | `boolean` | Start on boot |
| `networks` | `object[]` | List of networks (LXC) |
| `nameserver` | `string` | Nameserver (LXC) |
| `searchdomain` | `string` | Search domain (LXC) |
| `bios` | `string` | QEMU BIOS mode: seabios or ovmf (EFI) |
| `efi_enabled` | `boolean` | Enable EFI disk (QEMU only) |
| `efi_storage` | `string` | Storage for EFI disk (QEMU only) |
| `tpm_enabled` | `boolean` | Enable TPM state disk (QEMU only) |
| `tpm_storage` | `string` | Storage for TPM state disk (QEMU only) |

Used by [`PATCH /api/admin/vm-instances/{id}`](https://featherpanel.com/docs/api/reference/admin/vm-instances/#patch-admin-vm-instances-id)

### `VmNode`

| Field | Type | Description |
| --- | --- | --- |
| `id` | `integer` | VM Node ID |
| `name` | `string` | VM Node name |
| `description` | `string` | VM Node description |
| `location_id` | `integer` | Location ID (must be type=vps) |
| `fqdn` | `string` | Proxmox host FQDN or IP |
| `scheme` | `string` | Connection scheme |
| `port` | `integer` | Proxmox API port |
| `user` | `string` | Proxmox API user (e.g. root@pam) |
| `token_id` | `string` | Proxmox API token ID |
| `secret` | `string` | Proxmox API token secret |
| `tls_no_verify` | `string` | Skip TLS verification |
| `timeout` | `integer` | Timeout in seconds |
| `addional_headers` | `string` | Additional HTTP headers (JSON encoded, optional) |
| `additional_params` | `string` | Additional query parameters (JSON encoded, optional) |
| `created_at` | `string (date-time)` | Creation timestamp |
| `updated_at` | `string (date-time)` | Last update timestamp |

### `VmNodeCreate`

| Field | Type | Description |
| --- | --- | --- |
| `name`required | `string` | VM Node name |
| `description` | `string` | VM Node description |
| `location_id`required | `integer` | Location ID (must be type=vps) |
| `fqdn`required | `string` | Proxmox host FQDN or IP |
| `scheme` | `string` | Connection scheme |
| `port` | `integer` | Proxmox API port |
| `user`required | `string` | Proxmox API user (e.g. root@pam) |
| `token_id`required | `string` | Proxmox API token ID |
| `secret`required | `string` | Proxmox API token secret |
| `tls_no_verify` | `string` | Skip TLS verification |
| `timeout` | `integer` | Timeout in seconds |
| `addional_headers` | `string` | Additional HTTP headers (JSON encoded, optional) |
| `additional_params` | `string` | Additional query parameters (JSON encoded, optional) |
| `id` | `integer` | Optional VM node ID (useful for migrations) |

Used by [`PUT /api/admin/vm-nodes`](https://featherpanel.com/docs/api/reference/admin/vm-nodes/#put-admin-vm-nodes)

### `VmNodePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `VmNodeUpdate`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | VM Node name |
| `description` | `string` | VM Node description |
| `location_id` | `integer` | Location ID (must be type=vps) |
| `fqdn` | `string` | Proxmox host FQDN or IP |
| `scheme` | `string` | Connection scheme |
| `port` | `integer` | Proxmox API port |
| `user` | `string` | Proxmox API user (e.g. root@pam) |
| `token_id` | `string` | Proxmox API token ID |
| `secret` | `string` | Proxmox API token secret |
| `tls_no_verify` | `string` | Skip TLS verification |
| `timeout` | `integer` | Timeout in seconds |
| `addional_headers` | `string` | Additional HTTP headers (JSON encoded, optional) |
| `additional_params` | `string` | Additional query parameters (JSON encoded, optional) |

Used by [`PATCH /api/admin/vm-nodes/{id}`](https://featherpanel.com/docs/api/reference/admin/vm-nodes/#patch-admin-vm-nodes-id)

### `WebAppManifest`

| Field | Type | Description |
| --- | --- | --- |
| `name` | `string` | Webapp name |
| `short_name` | `string` | Webapp short name |
| `description` | `string` | Webapp description |
| `icons` | `object[]` |  |
| `start_url` | `string` |  |
| `scope` | `string` |  |
| `display` | `string` |  |
| `theme_color` | `string` |  |
| `background_color` | `string` |  |

### `WebNode`

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

### `WebNodeCreate`

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

Used by [`PUT /api/admin/web-nodes`](https://featherpanel.com/docs/api/reference/admin/web-nodes/#put-admin-web-nodes)

### `WebNodePagination`

| Field | Type | Description |
| --- | --- | --- |
| `current_page` | `integer` | Current page number |
| `per_page` | `integer` | Records per page |
| `total_records` | `integer` | Total number of records |
| `total_pages` | `integer` | Total number of pages |
| `has_next` | `boolean` | Whether there is a next page |
| `has_prev` | `boolean` | Whether there is a previous page |
| `from` | `integer` | Starting record number |
| `to` | `integer` | Ending record number |

### `WebNodeUpdate`

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

Used by [`PATCH /api/admin/web-nodes/{id}`](https://featherpanel.com/docs/api/reference/admin/web-nodes/#patch-admin-web-nodes-id)

### `WingsActivityErrorResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Error message |
| `processed_count` | `integer` | Number of activities processed successfully |
| `error_count` | `integer` | Number of activities that failed |
| `errors` | `string[]` | Array of error messages |

### `WingsActivityLog`

| Field | Type | Description |
| --- | --- | --- |
| `user` | `string (uuid)` | User UUID (nullable) |
| `server`required | `string (uuid)` | Server UUID |
| `event`required | `string` | Activity event name |
| `metadata` | `object` | Additional activity metadata |
| `ip` | `string` | IP address of the user |
| `timestamp` | `string (date-time)` | Activity timestamp |

### `WingsActivityRequest`

| Field | Type | Description |
| --- | --- | --- |
| `data`required | [`WingsActivityLog[]`](#schema-wingsactivitylog) | Array of activity logs |

Used by [`POST /api/remote/activity`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-activity)

### `WingsActivityResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Success message |
| `processed_count` | `integer` | Number of activities processed successfully |

Used by [`POST /api/remote/activity`](https://featherpanel.com/docs/api/reference/wings/remote/#post-remote-activity)

### `WingsAdminResponse`

| Field | Type | Description |
| --- | --- | --- |
| `message` | `string` | Welcome message |

Used by [`GET /api/wings/admin`](https://featherpanel.com/docs/api/reference/wings/nodes/#get-wings-admin)

### `WingsServerConfig`

| Field | Type | Description |
| --- | --- | --- |
| `settings` | `object` |  |
| `process_configuration` | `object` |  |

Used by [`GET /api/remote/servers/{uuid}`](https://featherpanel.com/docs/api/reference/wings/remote/#get-remote-servers-uuid)
