{"openapi":"3.1.0","info":{"title":"Ignite Containers Control Plane","description":"API-only game hosting control plane. No users, no billing: API keys are the only identity. Servers carry an opaque `external_ref` for external systems.","license":{"name":"AGPL-3.0-or-later"},"version":"0.1.0"},"paths":{"/api/v1/agent/report":{"post":{"tags":["agent"],"operationId":"report","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}}}}}},"/api/v1/agent/state":{"get":{"tags":["agent"],"summary":"Returns the complete desired state for the calling node. Agents poll this on a\nfixed interval and reconcile, which makes them crash-safe and self-healing.","operationId":"state","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeState"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/allocations":{"get":{"tags":["allocations"],"operationId":"list_all","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"server_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllocationList"}}}}},"security":[{"bearer":[]}]}},"/api/v1/allocations/{id}":{"delete":{"tags":["allocations"],"operationId":"delete_allocation","parameters":[{"name":"id","in":"path","description":"Allocation id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/api-keys":{"get":{"tags":["api-keys"],"operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["api-keys"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedKey"}}}},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/api-keys/{id}":{"delete":{"tags":["api-keys"],"operationId":"revoke","parameters":[{"name":"id","in":"path","description":"API key id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/audit-events":{"get":{"tags":["audit"],"operationId":"list","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditList"}}}}},"security":[{"bearer":[]}]}},"/api/v1/database-hosts":{"get":{"tags":["databases"],"operationId":"list_hosts","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseHostList"}}}}}},"post":{"tags":["databases"],"operationId":"create_host","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDatabaseHostRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseHost"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/database-hosts/{id}":{"get":{"tags":["databases"],"operationId":"get_host","parameters":[{"name":"id","in":"path","description":"Database host id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseHost"}}}}}},"delete":{"tags":["databases"],"operationId":"delete_host","parameters":[{"name":"id","in":"path","description":"Database host id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/database-hosts/{id}/test":{"post":{"tags":["databases"],"operationId":"test_host","parameters":[{"name":"id","in":"path","description":"Database host id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseHostTest"}}}}}}},"/api/v1/me":{"get":{"tags":["auth"],"operationId":"me","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes":{"get":{"tags":["nodes"],"operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["nodes"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNodeRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeWithToken"}}}},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes/{id}":{"get":{"tags":["nodes"],"operationId":"get","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Node"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["nodes"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"patch":{"tags":["nodes"],"operationId":"update","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNodeRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Node"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes/{id}/allocations":{"get":{"tags":["allocations"],"operationId":"list_allocations","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllocationList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["allocations"],"operationId":"create_allocations","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAllocationsRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllocationResult"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes/{id}/reboot":{"post":{"tags":["nodes"],"operationId":"reboot_node","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Accepted"}}}}}}},"/api/v1/nodes/{id}/rotate-token":{"post":{"tags":["nodes"],"operationId":"rotate_token","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotatedToken"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes/{id}/state":{"get":{"tags":["nodes"],"operationId":"state","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeState"}}}}},"security":[{"bearer":[]}]}},"/api/v1/nodes/{id}/updates":{"get":{"tags":["nodes"],"operationId":"get_updates","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostUpdateStatus"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/nodes/{id}/updates/apply":{"post":{"tags":["nodes"],"operationId":"apply_updates","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyUpdatesRequest"}}},"required":true},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Accepted"}}}}}}},"/api/v1/nodes/{id}/updates/check":{"post":{"tags":["nodes"],"operationId":"check_updates","parameters":[{"name":"id","in":"path","description":"Node id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostUpdateStatus"}}}},"501":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/notifications/config":{"get":{"tags":["notifications"],"operationId":"config","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailConfig"}}}}}}},"/api/v1/notifications/email":{"post":{"tags":["notifications"],"operationId":"send","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailRequest"}}},"required":true},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailMessage"}}}},"503":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/notifications/emails":{"get":{"tags":["notifications"],"operationId":"list","parameters":[{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailList"}}}}}}},"/api/v1/notifications/emails/{id}/retry":{"post":{"tags":["notifications"],"operationId":"retry","parameters":[{"name":"id","in":"path","description":"Email id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailMessage"}}}}}}},"/api/v1/proxy/reconcile":{"post":{"tags":["proxy"],"operationId":"reconcile_now","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyReconcileResult"}}}}},"security":[{"bearer":[]}]}},"/api/v1/proxy/routes":{"get":{"tags":["proxy"],"operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyRouteList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["proxy"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProxyRoute"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyMutation"}}}},"422":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/proxy/routes/{id}":{"delete":{"tags":["proxy"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Proxy route id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyDeleteResult"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"patch":{"tags":["proxy"],"operationId":"update","parameters":[{"name":"id","in":"path","description":"Proxy route id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProxyRoute"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyMutation"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/proxy/status":{"get":{"tags":["proxy"],"operationId":"status","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyStatus"}}}}},"security":[{"bearer":[]}]}},"/api/v1/schedules/{id}":{"delete":{"tags":["schedules"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Schedule id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""}}},"patch":{"tags":["schedules"],"operationId":"update","parameters":[{"name":"id","in":"path","description":"Schedule id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScheduleRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}}}}},"/api/v1/schedules/{id}/run":{"post":{"tags":["schedules"],"operationId":"run","parameters":[{"name":"id","in":"path","description":"Schedule id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedSchedule"}}}}}}},"/api/v1/servers":{"get":{"tags":["servers"],"operationId":"list","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":["string","null"],"format":"uuid"}},{"name":"state","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"external_ref","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"name","in":"path","required":true,"schema":{"type":["string","null"]}},{"name":"limit","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}},{"name":"offset","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int64"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["servers"],"operationId":"create","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateServerRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerDetail"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/bulk/command":{"post":{"tags":["servers"],"operationId":"command","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCommandRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkResponse"}}}}}}},"/api/v1/servers/bulk/power":{"post":{"tags":["servers"],"operationId":"power","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPowerRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkResponse"}}}}}}},"/api/v1/servers/{id}":{"get":{"tags":["servers"],"operationId":"get","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerDetail"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["servers"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"patch":{"tags":["servers"],"operationId":"update","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateServerRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Server"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/allocations":{"post":{"tags":["servers"],"operationId":"attach_allocation","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachAllocationRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Allocation"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/allocations/{allocation_id}":{"delete":{"tags":["servers"],"operationId":"detach_allocation","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"allocation_id","in":"path","description":"Allocation id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/backups":{"get":{"tags":["backups"],"operationId":"list","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupList"}}}}}},"post":{"tags":["backups"],"operationId":"create","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBackupRequest"}}},"required":true},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Backup"}}}}}}},"/api/v1/servers/{id}/backups/{backup_id}":{"delete":{"tags":["backups"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"backup_id","in":"path","description":"Backup id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/servers/{id}/backups/{backup_id}/download":{"get":{"tags":["backups"],"operationId":"download","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"backup_id","in":"path","description":"Backup id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"gzip archive"}}}},"/api/v1/servers/{id}/backups/{backup_id}/restore":{"post":{"tags":["backups"],"operationId":"restore","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"backup_id","in":"path","description":"Backup id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Backup"}}}}}}},"/api/v1/servers/{id}/command":{"post":{"tags":["servers"],"operationId":"command","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{}}}},"503":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/databases":{"get":{"tags":["databases"],"operationId":"list_server_databases","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseList"}}}}}},"post":{"tags":["databases"],"operationId":"create_server_database","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateServerDatabaseRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedDatabase"}}}}}}},"/api/v1/servers/{id}/databases/{database_id}":{"delete":{"tags":["databases"],"operationId":"delete_server_database","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"database_id","in":"path","description":"Server database id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/servers/{id}/environment":{"get":{"tags":["servers"],"operationId":"environment","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerEnvironment"}}}},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/files":{"get":{"tags":["files"],"operationId":"list","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"path","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileList"}}}}}},"delete":{"tags":["files"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"path","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}}}}}},"/api/v1/servers/{id}/files/chmod":{"post":{"tags":["files"],"operationId":"chmod","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChmodRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}}}}}},"/api/v1/servers/{id}/files/compress":{"post":{"tags":["files"],"operationId":"compress","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchiveRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileEntry"}}}}}}},"/api/v1/servers/{id}/files/content":{"get":{"tags":["files"],"operationId":"read","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"path","in":"path","required":true,"schema":{"type":["string","null"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileContent"}}}}}},"put":{"tags":["files"],"operationId":"write","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteFileRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileEntry"}}}}}}},"/api/v1/servers/{id}/files/decompress":{"post":{"tags":["files"],"operationId":"decompress","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchiveRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}}}}}},"/api/v1/servers/{id}/files/mkdir":{"post":{"tags":["files"],"operationId":"mkdir","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MkdirRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}}}}}},"/api/v1/servers/{id}/files/rename":{"post":{"tags":["files"],"operationId":"rename","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OkResponse"}}}}}}},"/api/v1/servers/{id}/jobs":{"get":{"tags":["servers"],"operationId":"jobs","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobList"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/logs":{"get":{"tags":["servers"],"operationId":"logs","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"lines","in":"path","required":true,"schema":{"type":["integer","null"],"format":"int32","minimum":0}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogChunk"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/logs/stream":{"get":{"tags":["servers"],"operationId":"logs_stream","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Server-sent event stream of new log lines"}}}},"/api/v1/servers/{id}/power":{"post":{"tags":["servers"],"operationId":"power","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PowerRequest"}}},"required":true},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/reinstall":{"post":{"tags":["servers"],"operationId":"reinstall","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/resume":{"post":{"tags":["servers"],"operationId":"resume","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Server"}}}}}}},"/api/v1/servers/{id}/schedules":{"get":{"tags":["schedules"],"operationId":"list","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleList"}}}}}},"post":{"tags":["schedules"],"operationId":"create","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScheduleRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}}}}},"/api/v1/servers/{id}/sftp":{"get":{"tags":["sftp"],"operationId":"list","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SftpList"}}}}}},"post":{"tags":["sftp"],"operationId":"create","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSftpRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedSftp"}}}},"501":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/servers/{id}/sftp/{credential_id}":{"delete":{"tags":["sftp"],"operationId":"revoke","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"credential_id","in":"path","description":"SFTP credential id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/api/v1/servers/{id}/stats":{"get":{"tags":["servers"],"operationId":"stats","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStats"}}}}},"security":[{"bearer":[]}]}},"/api/v1/servers/{id}/suspend":{"post":{"tags":["servers"],"operationId":"suspend","parameters":[{"name":"id","in":"path","description":"Server id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Server"}}}}}}},"/api/v1/template-feeds":{"post":{"tags":["templates"],"operationId":"sync_feed","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedResult"}}}},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/templates":{"get":{"tags":["templates"],"operationId":"list","responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["templates"],"operationId":"import","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportEggRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}}},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]}},"/api/v1/templates/{id}":{"get":{"tags":["templates"],"operationId":"get","parameters":[{"name":"id","in":"path","description":"Template id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRecord"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"delete":{"tags":["templates"],"operationId":"delete","parameters":[{"name":"id","in":"path","description":"Template id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"409":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"security":[{"bearer":[]}]},"patch":{"tags":["templates"],"operationId":"update","parameters":[{"name":"id","in":"path","description":"Template id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateRequest"}}},"required":true},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRecord"}}}}},"security":[{"bearer":[]}]}},"/api/v1/templates/{id}/versions":{"get":{"tags":["templates"],"operationId":"versions","parameters":[{"name":"id","in":"path","description":"Template id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionList"}}}}},"security":[{"bearer":[]}]},"post":{"tags":["templates"],"operationId":"publish","parameters":[{"name":"id","in":"path","description":"Template id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishVersionRequest"}}},"required":true},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateRecord"}}}}},"security":[{"bearer":[]}]}},"/metrics":{"get":{"tags":["metrics"],"summary":"Prometheus metrics. Requires an `admin` API key so that node/server counts are\nnot exposed anonymously.","operationId":"metrics","responses":{"200":{"description":"Prometheus text format"},"403":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}},"components":{"schemas":{"Accepted":{"type":"object","required":["accepted"],"properties":{"accepted":{"type":"boolean"}}},"AcceptedSchedule":{"type":"object","required":["accepted"],"properties":{"accepted":{"type":"boolean"}}},"Allocation":{"type":"object","description":"A single TCP/UDP port on a node. Allocations are the unit of port management:\nthey are created in bulk per node, bound to exactly one server and can be moved.","required":["id","node_id","ip","port","protocol","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/AllocationId"},"ip":{"type":"string"},"label":{"type":["string","null"]},"node_id":{"$ref":"#/components/schemas/NodeId"},"port":{"type":"integer","format":"int32","minimum":0},"primary":{"type":"boolean"},"protocol":{"$ref":"#/components/schemas/PortProtocol"},"server_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ServerId"}]}}},"AllocationId":{"type":"string","description":"Port allocation identifier."},"AllocationList":{"type":"object","required":["allocations"],"properties":{"allocations":{"type":"array","items":{"$ref":"#/components/schemas/Allocation"}}}},"AllocationResult":{"type":"object","required":["created","requested","skipped"],"properties":{"created":{"type":"integer","minimum":0},"requested":{"type":"integer","minimum":0},"skipped":{"type":"integer","minimum":0}}},"ApiKey":{"type":"object","required":["id","name","prefix","scopes","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"},"id":{"$ref":"#/components/schemas/ApiKeyId"},"last_used_at":{"type":["string","null"],"format":"date-time"},"name":{"type":"string"},"prefix":{"type":"string","description":"First 12 characters of the token, shown so operators can identify a key."},"revoked_at":{"type":["string","null"],"format":"date-time"},"scopes":{"$ref":"#/components/schemas/ScopeSet"},"server_ids":{"type":"array","items":{"$ref":"#/components/schemas/ServerId"},"description":"Optional allow-list of server ids. Empty means \"all servers\"."}}},"ApiKeyId":{"type":"string","description":"API key identifier."},"ApplyUpdatesRequest":{"type":"object","properties":{"reboot":{"type":"boolean","description":"Reboot the host automatically if the upgrade requires it."}}},"ArchiveRequest":{"type":"object","required":["path"],"properties":{"path":{"type":"string"}}},"AttachAllocationRequest":{"type":"object","required":["allocation_id"],"properties":{"allocation_id":{"$ref":"#/components/schemas/AllocationId"}}},"AuditAction":{"type":"string","enum":["create","update","delete","power","command","import","revoke","login","read"]},"AuditEvent":{"type":"object","required":["id","action","resource","created_at"],"properties":{"action":{"$ref":"#/components/schemas/AuditAction"},"api_key_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ApiKeyId"}]},"client_ip_hash":{"type":["string","null"],"description":"Hash of the client IP, never the raw address."},"created_at":{"type":"string","format":"date-time"},"id":{"type":"string","format":"uuid"},"metadata":{},"resource":{"type":"string"},"resource_id":{"type":["string","null"]}}},"AuditList":{"type":"object","required":["events"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}}}},"AutoUpdate":{"type":"object","required":["enabled","channel"],"properties":{"channel":{"$ref":"#/components/schemas/Channel"},"enabled":{"type":"boolean"}}},"Backup":{"type":"object","required":["id","server_id","name","bytes","checksum","state","created_at"],"properties":{"bytes":{"type":"integer","format":"int64","minimum":0},"checksum":{"type":"string"},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"error":{"type":["string","null"]},"id":{"$ref":"#/components/schemas/BackupId"},"name":{"type":"string"},"server_id":{"$ref":"#/components/schemas/ServerId"},"state":{"$ref":"#/components/schemas/BackupState"}}},"BackupId":{"type":"string","description":"Server backup identifier."},"BackupList":{"type":"object","required":["backups"],"properties":{"backups":{"type":"array","items":{"$ref":"#/components/schemas/Backup"}}}},"BackupState":{"type":"string","enum":["creating","completed","failed","restoring"]},"BulkCommandRequest":{"type":"object","required":["server_ids","command"],"properties":{"command":{"type":"string"},"server_ids":{"type":"array","items":{"$ref":"#/components/schemas/ServerId"}}}},"BulkPowerRequest":{"type":"object","required":["server_ids","signal"],"properties":{"server_ids":{"type":"array","items":{"$ref":"#/components/schemas/ServerId"}},"signal":{"$ref":"#/components/schemas/PowerSignal"}}},"BulkResponse":{"type":"object","required":["results"],"properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/BulkResult"}}}},"BulkResult":{"type":"object","required":["server_id","success"],"properties":{"error":{"type":["string","null"]},"job_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/JobId"}]},"server_id":{"$ref":"#/components/schemas/ServerId"},"success":{"type":"boolean"}}},"Channel":{"type":"string","enum":["stable","beta","dev"]},"ChmodRequest":{"type":"object","required":["path","mode"],"properties":{"mode":{"type":"string"},"path":{"type":"string"}}},"CommandRequest":{"type":"object","required":["command"],"properties":{"command":{"type":"string"}}},"ConfigFileSpec":{"type":"object","required":["path","parser"],"properties":{"parser":{"$ref":"#/components/schemas/ConfigParser"},"path":{"type":"string"},"replacements":{"type":"object","description":"`key -> value`; values may contain `{{VARIABLE}}` placeholders.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"ConfigParser":{"type":"string","enum":["properties","yaml","json","xml","file"]},"CreateAllocationsRequest":{"type":"object","properties":{"end":{"type":["integer","null"],"format":"int32","minimum":0},"ip":{"type":["string","null"]},"label":{"type":["string","null"]},"ports":{"type":["string","null"],"description":"Port range spec, e.g. `25565-25665,27015`."},"protocol":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PortProtocol"}]},"start":{"type":["integer","null"],"format":"int32","minimum":0}}},"CreateBackupRequest":{"type":"object","properties":{"name":{"type":["string","null"]}}},"CreateDatabaseHostRequest":{"type":"object","required":["name","host","admin_user","admin_password"],"properties":{"admin_password":{"type":"string"},"admin_user":{"type":"string"},"host":{"type":"string","description":"Hostname or IP of the MariaDB/MySQL server."},"max_databases":{"type":["integer","null"],"format":"int32","description":"0 = unlimited.","minimum":0},"name":{"type":"string"},"port":{"type":["integer","null"],"format":"int32","minimum":0}}},"CreateKeyRequest":{"type":"object","required":["name","scopes"],"properties":{"expires_at":{"type":["string","null"],"format":"date-time"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes the new key receives. Must be a subset of the caller's scopes."},"server_ids":{"type":"array","items":{"$ref":"#/components/schemas/ServerId"},"description":"Optional server allow-list. Empty means all servers."}}},"CreateNodeRequest":{"type":"object","required":["name","fqdn","endpoint"],"properties":{"agent_token":{"type":["string","null"],"description":"Optional operator supplied agent token (64+ hex characters). This makes\nprovisioning idempotent: the token can be generated by configuration\nmanagement before the node exists."},"capacity":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NodeCapacity"}]},"driver":{"$ref":"#/components/schemas/NodeDriver"},"endpoint":{"type":"string","description":"Agent base URL, e.g. `https://node1.example.com:8443`."},"fqdn":{"type":"string","description":"Public hostname players connect to."},"labels":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"maintenance":{"type":"boolean"},"name":{"type":"string"}}},"CreateProxyRoute":{"type":"object","required":["domain","upstream"],"properties":{"domain":{"type":"string"},"enabled":{"type":["boolean","null"]},"tls":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProxyTls"}]},"upstream":{"type":"string"}}},"CreateScheduleRequest":{"type":"object","required":["name","cron","actions"],"properties":{"actions":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleAction"}},"cron":{"type":"string","description":"Five-field cron expression (UTC), e.g. `0 4 * * *`."},"enabled":{"type":["boolean","null"]},"name":{"type":"string"}}},"CreateServerDatabaseRequest":{"type":"object","properties":{"host_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DatabaseHostId"}]},"remote":{"type":["string","null"],"description":"MariaDB host pattern the user may connect from. Defaults to `%`."}}},"CreateServerRequest":{"type":"object","required":["node_id","template_id","name"],"properties":{"allocations":{"type":"array","items":{"$ref":"#/components/schemas/AllocationId"},"description":"Explicit allocations to bind. The first one becomes the primary port."},"auto_allocations":{"type":["integer","null"],"format":"int32","description":"Number of allocations to pick automatically when `allocations` is empty.","minimum":0},"description":{"type":"string"},"external_ref":{"type":["string","null"],"description":"Opaque reference for an external system (never interpreted by Ignite Containers)."},"idempotency_key":{"type":["string","null"],"description":"Optional idempotency key. Retries with the same key return the existing\nserver instead of provisioning a duplicate."},"image":{"type":["string","null"],"description":"Image label or full image reference."},"labels":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"limits":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Limits"}]},"name":{"type":"string"},"node_id":{"$ref":"#/components/schemas/NodeId"},"protocol":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PortProtocol"}]},"template_id":{"$ref":"#/components/schemas/TemplateId"},"template_version":{"type":["string","null"],"description":"Defaults to the template's latest published version."},"variables":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"CreateSftpRequest":{"type":"object","properties":{"ttl_seconds":{"type":["integer","null"],"format":"int64","description":"Lifetime in seconds. Defaults to `IGNITE_CONTAINERS_SFTP_DEFAULT_TTL_SECONDS`."}}},"CreatedDatabase":{"allOf":[{"$ref":"#/components/schemas/ServerDatabase"},{"type":"object","required":["password","host","port"],"properties":{"host":{"type":"string","description":"Connection details for the external panel/billing system."},"password":{"type":"string","description":"Shown exactly once."},"port":{"type":"integer","format":"int32","minimum":0}}}]},"CreatedKey":{"type":"object","required":["key","token"],"properties":{"key":{"$ref":"#/components/schemas/ApiKey"},"token":{"type":"string","description":"Shown exactly once. Store it in your secret manager."}}},"CreatedSftp":{"allOf":[{"$ref":"#/components/schemas/SftpCredential"},{"type":"object","required":["host","port","password"],"properties":{"host":{"type":"string"},"password":{"type":"string","description":"Shown exactly once."},"port":{"type":"integer","format":"int32","minimum":0}}}]},"DatabaseHost":{"type":"object","description":"A MariaDB/MySQL server that Ignite Containers may provision databases on.\nThe admin password is never part of this view.","required":["id","name","host","port","admin_user","max_databases","created_at","updated_at"],"properties":{"admin_user":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"host":{"type":"string"},"id":{"$ref":"#/components/schemas/DatabaseHostId"},"max_databases":{"type":"integer","format":"int32","description":"0 means unlimited.","minimum":0},"name":{"type":"string"},"port":{"type":"integer","format":"int32","minimum":0},"updated_at":{"type":"string","format":"date-time"}}},"DatabaseHostId":{"type":"string","description":"MariaDB/MySQL host identifier."},"DatabaseHostList":{"type":"object","required":["hosts"],"properties":{"hosts":{"type":"array","items":{"$ref":"#/components/schemas/DatabaseHost"}}}},"DatabaseHostTest":{"type":"object","required":["version"],"properties":{"version":{"type":"string"}}},"DatabaseList":{"type":"object","required":["databases"],"properties":{"databases":{"type":"array","items":{"$ref":"#/components/schemas/ServerDatabase"}}}},"DesiredPort":{"type":"object","required":["allocation_id","ip","port","protocol","primary"],"properties":{"allocation_id":{"$ref":"#/components/schemas/AllocationId"},"ip":{"type":"string"},"port":{"type":"integer","format":"int32","minimum":0},"primary":{"type":"boolean"},"protocol":{"$ref":"#/components/schemas/PortProtocol"}}},"DesiredPower":{"type":"string","description":"Desired power state, driven by the control plane and reconciled by the agent.","enum":["running","stopped"]},"DesiredServer":{"type":"object","required":["id","name","image","startup","environment","limits","ports","stop","desired_state","generation"],"properties":{"config_files":{"type":"array","items":{"$ref":"#/components/schemas/ConfigFileSpec"}},"desired_state":{"$ref":"#/components/schemas/DesiredPower"},"environment":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"generation":{"type":"integer","format":"int64","description":"Bumped whenever the agent must recreate (not just restart) the workload."},"id":{"$ref":"#/components/schemas/ServerId"},"image":{"type":"string"},"install":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InstallSpec"}]},"labels":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"limits":{"$ref":"#/components/schemas/Limits"},"name":{"type":"string"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/DesiredPort"}},"startup":{"$ref":"#/components/schemas/RenderedCommand"},"stop":{"$ref":"#/components/schemas/StopConfig"},"volumes":{"type":"array","items":{"$ref":"#/components/schemas/VolumeMount"}}}},"DetectionKind":{"type":"string","enum":["log_line","port_open","immediate"]},"EmailConfig":{"type":"object","required":["enabled","recipients"],"properties":{"enabled":{"type":"boolean"},"from":{"type":["string","null"]},"recipients":{"type":"array","items":{"type":"string"}},"tls":{"type":["string","null"]}}},"EmailId":{"type":"string","description":"Outbound email identifier."},"EmailList":{"type":"object","required":["emails"],"properties":{"emails":{"type":"array","items":{"$ref":"#/components/schemas/EmailMessage"}}}},"EmailMessage":{"type":"object","required":["id","recipients","subject","body","status","attempts","max_attempts","created_at"],"properties":{"attempts":{"type":"integer","format":"int32","minimum":0},"body":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/EmailId"},"last_error":{"type":["string","null"]},"max_attempts":{"type":"integer","format":"int32","minimum":0},"next_attempt_at":{"type":["string","null"],"format":"date-time"},"recipients":{"type":"array","items":{"type":"string"}},"sent_at":{"type":["string","null"],"format":"date-time"},"status":{"$ref":"#/components/schemas/EmailStatus"},"subject":{"type":"string"}}},"EmailStatus":{"type":"string","enum":["queued","sending","sent","failed"]},"ErrorBody":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"details":{},"message":{"type":"string"}}},"ErrorEnvelope":{"type":"object","description":"Uniform error envelope returned by every endpoint.","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"FeedPublished":{"type":"object","required":["slug","version"],"properties":{"slug":{"type":"string"},"version":{"type":"string"}}},"FeedRequest":{"type":"object","required":["feed","signature","public_key"],"properties":{"create_missing":{"type":"boolean","description":"Create templates that do not exist yet."},"feed":{"description":"Signed feed document, schema `ignite-containers.feed/v1`."},"public_key":{"type":"string"},"signature":{"type":"string"}}},"FeedResult":{"type":"object","required":["published","skipped"],"properties":{"published":{"type":"array","items":{"$ref":"#/components/schemas/FeedPublished"}},"skipped":{"type":"array","items":{"$ref":"#/components/schemas/FeedSkipped"}}}},"FeedSkipped":{"type":"object","required":["slug","reason"],"properties":{"reason":{"type":"string"},"slug":{"type":"string"}}},"FileContent":{"type":"object","required":["path","encoding","content","size"],"properties":{"content":{"type":"string"},"encoding":{"type":"string","description":"`utf8` or `base64`."},"path":{"type":"string"},"size":{"type":"integer","format":"int64","minimum":0},"truncated":{"type":"boolean"}}},"FileEntry":{"type":"object","required":["name","path","is_directory","size"],"properties":{"is_directory":{"type":"boolean"},"is_symlink":{"type":"boolean"},"mode":{"type":["integer","null"],"format":"int32","minimum":0},"modified_at":{"type":["string","null"],"format":"date-time"},"name":{"type":"string"},"path":{"type":"string"},"size":{"type":"integer","format":"int64","minimum":0}}},"FileList":{"type":"object","required":["path","entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/FileEntry"}},"path":{"type":"string"}}},"HostUpdateStatus":{"type":"object","description":"Host package/update state reported by the agent.","properties":{"applied_at":{"type":["string","null"],"format":"date-time"},"auto_reboot":{"type":"boolean"},"checked_at":{"type":["string","null"],"format":"date-time"},"last_error":{"type":["string","null"]},"reboot_required":{"type":"boolean"},"supported":{"type":"boolean","description":"False when the node has no privileged host helper (e.g. containerized agent)."},"updates_available":{"type":"integer","format":"int32","minimum":0}}},"ImportEggRequest":{"type":"object","required":["egg"],"properties":{"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Channel"}]},"egg":{"description":"A raw Pterodactyl egg (PTDL_v1/PTDL_v2) **or** a complete\n`ignite-containers.template/v1` document. For a template document the\nversion is read from `meta.version` unless `version` overrides it."},"public_key":{"type":["string","null"]},"save":{"type":"boolean","description":"When false the egg is translated but nothing is persisted."},"signature":{"type":["string","null"]},"slug":{"type":["string","null"]},"version":{"type":["string","null"],"description":"Optional version override. Required for Pterodactyl eggs, whose\n`meta.version` is the egg format (`PTDL_v2`), not a semantic version."}}},"ImportResult":{"type":"object","required":["saved","template"],"properties":{"record":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TemplateRecord"}]},"saved":{"type":"boolean"},"template":{"$ref":"#/components/schemas/Template"}}},"InstallSpec":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"},"entrypoint":{"type":["string","null"]},"image":{"type":["string","null"]},"script":{"type":["string","null"],"description":"Shell script executed *inside* the disposable installer container."},"timeout_seconds":{"type":"integer","format":"int32","minimum":0}}},"Job":{"type":"object","required":["id","node_id","kind","status","attempts","max_attempts","created_at","updated_at"],"properties":{"attempts":{"type":"integer","format":"int32","minimum":0},"completed_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/JobId"},"kind":{"$ref":"#/components/schemas/JobKind"},"last_error":{"type":["string","null"]},"max_attempts":{"type":"integer","format":"int32","minimum":0},"node_id":{"$ref":"#/components/schemas/NodeId"},"payload":{},"result":{},"server_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ServerId"}]},"status":{"$ref":"#/components/schemas/JobStatus"},"updated_at":{"type":"string","format":"date-time"}}},"JobId":{"type":"string","description":"Asynchronous task identifier."},"JobKind":{"type":"string","enum":["create","delete","start","stop","restart","kill","command","reinstall","sync","update_template"]},"JobList":{"type":"object","required":["jobs"],"properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}},"JobStatus":{"type":"string","enum":["queued","running","succeeded","failed","cancelled"]},"KeyList":{"type":"object","required":["keys"],"properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}},"Limits":{"type":"object","description":"Hard resource limits for a server. Values are absolute, never percentages of the\nnode, so a noisy neighbour can never starve a billing customer.","required":["memory_mb","disk_mb","cpu_millis","swap_mb","io_weight","pids_limit"],"properties":{"cpu_millis":{"type":"integer","format":"int64","description":"CPU in milli-cores: 1000 = one full core, 2000 = two cores.","minimum":0},"cpuset":{"type":["string","null"],"description":"Optional soft CPU pinning hint for the scheduler (`\"0-3\"`)."},"disk_mb":{"type":"integer","format":"int64","minimum":0},"io_weight":{"type":"integer","format":"int32","minimum":0},"memory_mb":{"type":"integer","format":"int64","minimum":0},"pids_limit":{"type":"integer","format":"int32","minimum":0},"swap_mb":{"type":"integer","format":"int64","minimum":0}}},"LogChunk":{"type":"object","required":["server_id","cursor","lines","truncated"],"properties":{"cursor":{"type":"string","description":"Cursor that can be passed to the next request; opaque to the caller."},"lines":{"type":"array","items":{"type":"string"}},"server_id":{"$ref":"#/components/schemas/ServerId"},"truncated":{"type":"boolean"}}},"MeResponse":{"type":"object","required":["key_id","name","scopes","server_ids"],"properties":{"expires_at":{"type":["string","null"],"format":"date-time"},"key_id":{"$ref":"#/components/schemas/ApiKeyId"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"server_ids":{"type":"array","items":{"$ref":"#/components/schemas/ServerId"}}}},"MkdirRequest":{"type":"object","required":["path"],"properties":{"path":{"type":"string"}}},"Node":{"type":"object","required":["id","name","fqdn","endpoint","driver","status","capacity","created_at","updated_at"],"properties":{"agent_version":{"type":["string","null"]},"capacity":{"$ref":"#/components/schemas/NodeCapacity"},"created_at":{"type":"string","format":"date-time"},"driver":{"$ref":"#/components/schemas/NodeDriver"},"endpoint":{"type":"string","description":"Control endpoint of the agent, e.g. `https://node1.example.com:8443`."},"fqdn":{"type":"string","description":"Public hostname clients connect to (game port host)."},"host_update_error":{"type":["string","null"]},"host_updates_auto_reboot":{"type":"boolean"},"host_updates_supported":{"type":"boolean","description":"Whether the node has the privileged host update helper installed."},"id":{"$ref":"#/components/schemas/NodeId"},"labels":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"last_heartbeat_at":{"type":["string","null"],"format":"date-time"},"last_update_apply":{"type":["string","null"],"format":"date-time"},"last_update_check":{"type":["string","null"],"format":"date-time"},"maintenance":{"type":"boolean"},"name":{"type":"string"},"reboot_required":{"type":"boolean"},"status":{"$ref":"#/components/schemas/NodeStatus"},"updated_at":{"type":"string","format":"date-time"},"updates_available":{"type":"integer","format":"int32","minimum":0}}},"NodeCapacity":{"type":"object","description":"Advertised capacity of a worker node (heartbeat reported).","required":["memory_mb","disk_mb","cpu_millis"],"properties":{"cpu_millis":{"type":"integer","format":"int64","minimum":0},"disk_mb":{"type":"integer","format":"int64","minimum":0},"memory_mb":{"type":"integer","format":"int64","minimum":0}}},"NodeDriver":{"type":"string","description":"How a node runs workloads. The API is identical, only the driver differs.","enum":["docker","kubernetes"]},"NodeId":{"type":"string","description":"Worker node identifier."},"NodeList":{"type":"object","required":["nodes"],"properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/Node"}}}},"NodeState":{"type":"object","required":["protocol_version","node_id","revision","generated_at","servers"],"properties":{"generated_at":{"type":"string","format":"date-time"},"node_id":{"$ref":"#/components/schemas/NodeId"},"protocol_version":{"type":"integer","format":"int32","minimum":0},"revision":{"type":"integer","format":"int64","description":"Monotonic revision; agents ignore state older than what they already applied."},"servers":{"type":"array","items":{"$ref":"#/components/schemas/DesiredServer"}}}},"NodeStatus":{"type":"string","enum":["pending","online","degraded","offline","maintenance"]},"NodeWithToken":{"allOf":[{"$ref":"#/components/schemas/Node"},{"type":"object","required":["agent_token"],"properties":{"agent_token":{"type":"string","description":"Agent authentication token. Returned once at creation or rotation."}}}]},"OkResponse":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"PortPolicy":{"type":"object","properties":{"default_protocol":{"$ref":"#/components/schemas/PortProtocol"},"max_additional":{"type":"integer","format":"int32","description":"How many additional allocations a server may claim.","minimum":0},"primary_env":{"type":"string","description":"Environment variable that receives the primary port."}}},"PortProtocol":{"type":"string","enum":["tcp","udp","both"]},"PowerRequest":{"type":"object","required":["signal"],"properties":{"signal":{"$ref":"#/components/schemas/PowerSignal"}}},"PowerSignal":{"type":"string","enum":["start","stop","restart","kill"]},"ProxyDeleteResult":{"type":"object","required":["deleted","applied"],"properties":{"applied":{"type":"boolean"},"deleted":{"type":"boolean"},"warning":{"type":["string","null"]}}},"ProxyMutation":{"type":"object","required":["route","applied"],"properties":{"applied":{"type":"boolean","description":"Whether the new desired state was accepted by Caddy."},"route":{"$ref":"#/components/schemas/ProxyRoute"},"warning":{"type":["string","null"]}}},"ProxyReconcileResult":{"type":"object","required":["configured","applied","routes"],"properties":{"applied":{"type":"boolean"},"caddy":{},"configured":{"type":"boolean"},"routes":{"type":"integer","minimum":0},"warning":{"type":["string","null"]}}},"ProxyRoute":{"type":"object","description":"A public hostname reverse-proxied by Caddy to an upstream HTTP service.","required":["id","domain","upstream","tls","created_at","updated_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"domain":{"type":"string","description":"Public hostname, e.g. `panel.example.com`."},"enabled":{"type":"boolean"},"id":{"type":"string","format":"uuid"},"tls":{"$ref":"#/components/schemas/ProxyTls"},"updated_at":{"type":"string","format":"date-time"},"upstream":{"type":"string","description":"Upstream URL or host:port, e.g. `http://127.0.0.1:8080`."}}},"ProxyRouteList":{"type":"object","required":["routes"],"properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/ProxyRoute"}}}},"ProxyStatus":{"type":"object","required":["configured","reachable","routes"],"properties":{"admin_url":{"type":["string","null"]},"configured":{"type":"boolean"},"error":{"type":["string","null"]},"reachable":{"type":"boolean"},"routes":{"type":"integer","minimum":0}}},"ProxyTls":{"type":"string","description":"Certificate mode for a Caddy proxy route.","enum":["auto","internal"]},"PublishVersionRequest":{"type":"object","required":["template"],"properties":{"channel":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Channel"}]},"notes":{"type":["string","null"]},"public_key":{"type":["string","null"]},"signature":{"type":["string","null"]},"template":{"$ref":"#/components/schemas/Template"}}},"RenameRequest":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"}}},"RenderedCommand":{"type":"object","required":["program","argv","command","shell"],"properties":{"argv":{"type":"array","items":{"type":"string"}},"command":{"type":"string","description":"Fully interpolated command line, useful for logs and the UI."},"program":{"type":"string"},"shell":{"type":"boolean"}}},"ReportRequest":{"type":"object","required":["capacity"],"properties":{"agent_version":{"type":"string"},"capacity":{"$ref":"#/components/schemas/NodeCapacity"},"driver":{"type":"string"},"host_updates":{"$ref":"#/components/schemas/HostUpdateStatus"},"revision":{"type":"integer","format":"int64"},"servers":{"type":"array","items":{"$ref":"#/components/schemas/ServerReport"}}}},"ReportResponse":{"type":"object","required":["ok","revision"],"properties":{"ok":{"type":"boolean"},"revision":{"type":"integer","format":"int64","description":"Current node revision; the agent applies newer state on the next poll."}}},"RotatedToken":{"type":"object","required":["id","agent_token"],"properties":{"agent_token":{"type":"string"},"id":{"$ref":"#/components/schemas/NodeId"}}},"Runtime":{"type":"object","required":["images","startup","stop","detection","install"],"properties":{"detection":{"$ref":"#/components/schemas/StartupDetection"},"images":{"type":"object","description":"Human readable image label -> OCI reference.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"install":{"$ref":"#/components/schemas/InstallSpec"},"shell":{"$ref":"#/components/schemas/ShellMode"},"startup":{"type":"string"},"stop":{"$ref":"#/components/schemas/StopConfig"}}},"Schedule":{"type":"object","required":["id","server_id","name","cron","actions","enabled","next_run_at","created_at","updated_at"],"properties":{"actions":{"type":"array","items":{"$ref":"#/components/schemas/ScheduleAction"}},"created_at":{"type":"string","format":"date-time"},"cron":{"type":"string","description":"Standard five-field cron expression (UTC)."},"enabled":{"type":"boolean"},"id":{"$ref":"#/components/schemas/ScheduleId"},"last_run_at":{"type":["string","null"],"format":"date-time"},"name":{"type":"string"},"next_run_at":{"type":"string","format":"date-time"},"server_id":{"$ref":"#/components/schemas/ServerId"},"updated_at":{"type":"string","format":"date-time"}}},"ScheduleAction":{"type":"object","required":["type"],"properties":{"command":{"type":["string","null"]},"name":{"type":["string","null"]},"signal":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PowerSignal"}]},"type":{"$ref":"#/components/schemas/ScheduleActionKind"}}},"ScheduleActionKind":{"type":"string","enum":["power","command","backup"]},"ScheduleId":{"type":"string","description":"Scheduled task identifier."},"ScheduleList":{"type":"object","required":["schedules"],"properties":{"schedules":{"type":"array","items":{"$ref":"#/components/schemas/Schedule"}}}},"ScopeSet":{"type":"array","items":{"type":"string"},"description":"An ordered, duplicate-free set of scopes."},"SendEmailRequest":{"type":"object","required":["subject","body"],"properties":{"body":{"type":"string"},"subject":{"type":"string"},"to":{"type":"array","items":{"type":"string"},"description":"Optional recipients. Defaults to `IGNITE_CONTAINERS_ALERT_EMAILS`."}}},"Server":{"type":"object","required":["id","node_id","template_id","template_version","name","image","startup","limits","state","created_at","updated_at"],"properties":{"container_id":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"description":{"type":"string"},"desired_running":{"type":"boolean","description":"Desired power state; the node agent converges towards it."},"external_ref":{"type":["string","null"],"description":"Opaque reference owned by the caller (e.g. customer id in an external\nbilling system). Ignite Containers never interprets or bills this value."},"generation":{"type":"integer","format":"int64","description":"Incremented on changes that require recreating the container."},"id":{"$ref":"#/components/schemas/ServerId"},"idempotency_key":{"type":["string","null"],"description":"Optional client supplied idempotency key for provisioning."},"image":{"type":"string"},"labels":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"last_error":{"type":["string","null"]},"limits":{"$ref":"#/components/schemas/Limits"},"name":{"type":"string"},"node_id":{"$ref":"#/components/schemas/NodeId"},"primary_allocation_id":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AllocationId"}]},"startup":{"type":"string"},"state":{"$ref":"#/components/schemas/ServerState"},"suspended":{"type":"boolean","description":"Suspended servers are stopped and reject power/console/database actions."},"template_id":{"$ref":"#/components/schemas/TemplateId"},"template_version":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}}},"ServerDatabase":{"type":"object","required":["id","server_id","host_id","database_name","username","remote","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"database_name":{"type":"string"},"host_id":{"$ref":"#/components/schemas/DatabaseHostId"},"id":{"$ref":"#/components/schemas/ServerDatabaseId"},"remote":{"type":"string","description":"MariaDB host pattern, usually `%`."},"server_id":{"$ref":"#/components/schemas/ServerId"},"username":{"type":"string"}}},"ServerDatabaseId":{"type":"string","description":"Per-server database identifier."},"ServerDetail":{"allOf":[{"$ref":"#/components/schemas/Server"},{"type":"object","required":["allocations"],"properties":{"allocations":{"type":"array","items":{"$ref":"#/components/schemas/Allocation"}}}}],"description":"Detailed server view including its allocations."},"ServerEnvironment":{"type":"object","required":["environment"],"properties":{"environment":{"type":"object","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"ServerId":{"type":"string","description":"Server identifier."},"ServerList":{"type":"object","required":["servers"],"properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/Server"}}}},"ServerReport":{"type":"object","required":["id","state"],"properties":{"container_id":{"type":["string","null"]},"id":{"$ref":"#/components/schemas/ServerId"},"message":{"type":["string","null"]},"state":{"$ref":"#/components/schemas/ServerState"}}},"ServerState":{"type":"string","enum":["installing","offline","starting","running","stopping","suspended","pending","unknown"]},"ServerStats":{"type":"object","required":["server_id","cpu_percent","memory_bytes","memory_limit_bytes","disk_bytes","disk_limit_bytes","network_rx_bytes","network_tx_bytes","pids","uptime_seconds","state","sampled_at"],"properties":{"cpu_percent":{"type":"number","format":"double"},"disk_bytes":{"type":"integer","format":"int64","minimum":0},"disk_limit_bytes":{"type":"integer","format":"int64","minimum":0},"memory_bytes":{"type":"integer","format":"int64","minimum":0},"memory_limit_bytes":{"type":"integer","format":"int64","minimum":0},"network_rx_bytes":{"type":"integer","format":"int64","minimum":0},"network_tx_bytes":{"type":"integer","format":"int64","minimum":0},"pids":{"type":"integer","format":"int64","minimum":0},"sampled_at":{"type":"string","format":"date-time"},"server_id":{"$ref":"#/components/schemas/ServerId"},"state":{"$ref":"#/components/schemas/ServerState"},"uptime_seconds":{"type":"integer","format":"int64","minimum":0}}},"SftpCredential":{"type":"object","required":["id","server_id","username","expires_at","created_at"],"properties":{"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"id":{"$ref":"#/components/schemas/SftpCredentialId"},"revoked_at":{"type":["string","null"],"format":"date-time"},"server_id":{"$ref":"#/components/schemas/ServerId"},"username":{"type":"string"}}},"SftpCredentialId":{"type":"string","description":"Temporary SFTP credential identifier."},"SftpList":{"type":"object","required":["credentials"],"properties":{"credentials":{"type":"array","items":{"$ref":"#/components/schemas/SftpCredential"}}}},"ShellMode":{"type":"string","description":"`Auto` uses a shell only when the startup line actually needs one. `Never`\nenforces argv execution (recommended). `Always` keeps full egg compatibility.","enum":["auto","never","always"]},"StartupDetection":{"type":"object","required":["kind"],"properties":{"kind":{"$ref":"#/components/schemas/DetectionKind"},"timeout_seconds":{"type":"integer","format":"int32","minimum":0},"value":{"type":["string","null"]}}},"StopConfig":{"type":"object","required":["kind","value"],"properties":{"kind":{"$ref":"#/components/schemas/StopKind"},"timeout_seconds":{"type":"integer","format":"int32","minimum":0},"value":{"type":"string"}}},"StopKind":{"type":"string","enum":["command","signal"]},"Template":{"type":"object","required":["schema","meta","runtime","ports"],"properties":{"config_files":{"type":"array","items":{"$ref":"#/components/schemas/ConfigFileSpec"}},"file_denylist":{"type":"array","items":{"type":"string"}},"meta":{"$ref":"#/components/schemas/TemplateMeta"},"ports":{"$ref":"#/components/schemas/PortPolicy"},"runtime":{"$ref":"#/components/schemas/Runtime"},"schema":{"type":"string"},"variables":{"type":"array","items":{"$ref":"#/components/schemas/TemplateVariable"}}}},"TemplateId":{"type":"string","description":"Game/app template identifier."},"TemplateList":{"type":"object","required":["templates"],"properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/TemplateRecord"}}}},"TemplateMeta":{"type":"object","required":["name","slug","version","source"],"properties":{"author":{"type":"string"},"description":{"type":"string"},"features":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"slug":{"type":"string"},"source":{"$ref":"#/components/schemas/TemplateSource"},"version":{"type":"string","description":"Semantic version of the template itself (not of the game)."}}},"TemplateOrigin":{"type":"string","enum":["egg","manual"]},"TemplateRecord":{"type":"object","description":"Template metadata plus its currently published version.","required":["id","slug","name","description","auto_update","created_at","updated_at"],"properties":{"auto_update":{"$ref":"#/components/schemas/AutoUpdate"},"created_at":{"type":"string","format":"date-time"},"description":{"type":"string"},"id":{"$ref":"#/components/schemas/TemplateId"},"latest_version":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TemplateVersionRecord"}]},"name":{"type":"string"},"slug":{"type":"string"},"updated_at":{"type":"string","format":"date-time"}}},"TemplateSource":{"type":"object","required":["origin"],"properties":{"egg_author":{"type":["string","null"]},"egg_version":{"type":["string","null"]},"imported_at":{"type":["string","null"],"format":"date-time"},"origin":{"$ref":"#/components/schemas/TemplateOrigin"},"update_url":{"type":["string","null"]}}},"TemplateVariable":{"type":"object","required":["key","label"],"properties":{"default":{"type":"string"},"description":{"type":"string"},"field_type":{"type":["string","null"]},"key":{"type":"string"},"label":{"type":"string"},"rules":{"type":"string"},"user_editable":{"type":"boolean"},"user_viewable":{"type":"boolean"}}},"TemplateVersionId":{"type":"string","description":"Immutable template version identifier."},"TemplateVersionRecord":{"type":"object","description":"A published, immutable template version.","required":["id","template_id","version","channel","template","digest","created_at"],"properties":{"channel":{"$ref":"#/components/schemas/Channel"},"created_at":{"type":"string","format":"date-time"},"digest":{"type":"string"},"id":{"$ref":"#/components/schemas/TemplateVersionId"},"notes":{"type":"string"},"public_key":{"type":["string","null"]},"signature":{"type":["string","null"]},"template":{"$ref":"#/components/schemas/Template"},"template_id":{"$ref":"#/components/schemas/TemplateId"},"version":{"type":"string"}}},"UpdateNodeRequest":{"type":"object","properties":{"driver":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NodeDriver"}]},"endpoint":{"type":["string","null"]},"fqdn":{"type":["string","null"]},"labels":{"type":["object","null"],"additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"maintenance":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdateProxyRoute":{"type":"object","properties":{"domain":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"tls":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProxyTls"}]},"upstream":{"type":["string","null"]}}},"UpdateScheduleRequest":{"type":"object","properties":{"actions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ScheduleAction"}},"cron":{"type":["string","null"]},"enabled":{"type":["boolean","null"]},"name":{"type":["string","null"]}}},"UpdateServerRequest":{"type":"object","properties":{"description":{"type":["string","null"]},"external_ref":{"type":["string","null"]},"image":{"type":["string","null"]},"labels":{"type":["object","null"],"additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}},"limits":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Limits"}]},"name":{"type":["string","null"]},"template_version":{"type":["string","null"]},"variables":{"type":["object","null"],"additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"UpdateTemplateRequest":{"type":"object","properties":{"auto_update":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/AutoUpdate"}]}}},"VersionList":{"type":"object","required":["versions"],"properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/TemplateVersionRecord"}}}},"VolumeMount":{"type":"object","required":["name","mount_path"],"properties":{"mount_path":{"type":"string"},"name":{"type":"string","description":"Volume name; the agent maps it to a docker volume or a PVC."}}},"WriteFileRequest":{"type":"object","required":["path","content"],"properties":{"content":{"type":"string"},"encoding":{"type":["string","null"],"description":"`utf8` (default) or `base64`."},"path":{"type":"string"}}}},"securitySchemes":{"api_key_header":{"type":"http","scheme":"bearer","bearerFormat":"ic_<prefix>_<secret>"},"bearer":{"type":"http","scheme":"bearer","bearerFormat":"ic_<prefix>_<secret>","description":"API key created via the API or the admin UI. Agents authenticate with HMAC-signed requests instead."}}},"tags":[{"name":"auth","description":"API key introspection"},{"name":"api-keys","description":"API key management (the only identity)"},{"name":"nodes","description":"Worker nodes and their desired state"},{"name":"allocations","description":"Port management"},{"name":"templates","description":"Egg import, template versions and signed auto-update feeds"},{"name":"servers","description":"Game servers, power, console, ports, jobs"},{"name":"databases","description":"MariaDB/MySQL hosts and per-server databases"},{"name":"files","description":"Sandboxed file manager"},{"name":"backups","description":"Server volume backups"},{"name":"schedules","description":"Cron-like scheduled actions"},{"name":"agent","description":"Node agent protocol (HMAC signed)"},{"name":"audit","description":"Security audit trail"},{"name":"metrics","description":"Prometheus metrics (admin)"},{"name":"notifications","description":"SMTP notifications and email outbox"},{"name":"sftp","description":"Temporary, chrooted SFTP credentials"}]}