{"openapi":"3.1.0","info":{"title":"TatNet Public API","description":"TatNet public REST API.\n\n**Authentication** — send your API key as a bearer token:\n\n```\nAuthorization: Bearer tn_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n```\n\nKeys are scoped to a single account and carry a subset of that account's\npermissions (and, optionally, a project allowlist). Mint and revoke keys from\nthe dashboard. The account is implicit from the key — endpoints never take an\n`account_id`.\n\n**Rate limit** — fixed window per key. On 429 the response includes a\n`Retry-After` header (seconds).\n\n**Errors** — non-2xx responses use the shape\n`{\"error\": {\"code\": \"...\", \"message\": \"...\"}}`.","version":"1.0.0"},"servers":[{"url":"https://api.tatnet.ru/v1"}],"paths":{"/account":{"get":{"tags":["account"],"summary":"Identify the calling API key","description":"Returns the account the API key belongs to, the key id, and the key's policy (the actions and resources it is allowed to act on).","operationId":"account_whoami","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoAmIResponse"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/account/balance":{"get":{"tags":["account"],"summary":"Read the account balance","description":"The balance of the account the key belongs to, as the billing service sees it at the moment of the request. Requires `billing:read`, which is governed by `account:view_billing` — held by the account owner only. `503 billing_unavailable` means the balance could not be read; it is never reported as zero.","operationId":"account_get_balance","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Balance"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/projects":{"get":{"tags":["projects"],"summary":"List projects","operationId":"projects_list_projects","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Project_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}":{"get":{"tags":["projects"],"summary":"Get a project","operationId":"projects_get_project","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms":{"get":{"tags":["vms"],"summary":"List VMs in a project","operationId":"vms_list_vms","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1VM_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["vms"],"summary":"Create a VM","operationId":"vms_create_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VMCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VM"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}":{"get":{"tags":["vms"],"summary":"Get a VM","operationId":"vms_get_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VM"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["vms"],"summary":"Delete a VM","description":"202, and the body says which of the two things happened.\n\nA VM that was never provisioned is gone when this returns (``deleted``).\nA provisioned one is moved to ``deleting`` and a region tears it down over\nthe following minutes — it stays visible in ``GET …/vms`` until then, so a\nscript that deletes and immediately re-creates by name has to wait.\n\nThis used to answer 204, which could not express the difference; the\nservice's own return value cannot either (it reports ``success`` for both\nand puts the distinction in a human-readable message).","operationId":"vms_delete_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}/start":{"post":{"tags":["vms"],"summary":"Start a VM","operationId":"vms_start_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VMStartRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}/stop":{"post":{"tags":["vms"],"summary":"Stop a VM","operationId":"vms_stop_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}/restart":{"post":{"tags":["vms"],"summary":"Restart a VM","operationId":"vms_restart_vm","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}/backups":{"get":{"tags":["vms"],"summary":"List VM backups","operationId":"vms_list_backups","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Backup_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["vms"],"summary":"Create a VM backup","operationId":"vms_create_backup","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BackupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Backup"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/vms/{vm_id}/backups/{backup_id}":{"delete":{"tags":["vms"],"summary":"Delete a VM backup","operationId":"vms_delete_backup","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"string","title":"Backup Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dns/zones":{"get":{"tags":["dns"],"summary":"List DNS zones","operationId":"dns_list_zones","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Zone_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dns"],"summary":"Create a DNS zone","operationId":"dns_create_zone","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ZoneCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dns/zones/{zone_id}":{"get":{"tags":["dns"],"summary":"Get a DNS zone","operationId":"dns_get_zone","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["dns"],"summary":"Update a DNS zone","operationId":"dns_update_zone","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ZoneUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dns"],"summary":"Delete a DNS zone","operationId":"dns_delete_zone","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dns/zones/{zone_id}/verify":{"post":{"tags":["dns"],"summary":"Verify NS delegation","operationId":"dns_verify_zone","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Zone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dns/zones/{zone_id}/dns_records":{"get":{"tags":["dns"],"summary":"List DNS records","operationId":"dns_list_dns_records","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1DNSRecord_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dns"],"summary":"Create a DNS record","operationId":"dns_create_dns_record","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DNSRecordCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DNSRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dns/zones/{zone_id}/dns_records/{record_id}":{"get":{"tags":["dns"],"summary":"Get a DNS record","operationId":"dns_get_dns_record","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"record_id","in":"path","required":true,"schema":{"type":"string","title":"Record Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DNSRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["dns"],"summary":"Update a DNS record","operationId":"dns_update_dns_record","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"record_id","in":"path","required":true,"schema":{"type":"string","title":"Record Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DNSRecordUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DNSRecord"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dns"],"summary":"Delete a DNS record","operationId":"dns_delete_dns_record","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","title":"Zone Id"}},{"name":"record_id","in":"path","required":true,"schema":{"type":"string","title":"Record Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vpcs":{"get":{"tags":["networking"],"summary":"List VPCs","operationId":"networking_list_vpcs","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Vpc_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["networking"],"summary":"Create a VPC","operationId":"networking_create_vpc","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VpcCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Vpc"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vpcs/{vpc_id}":{"get":{"tags":["networking"],"summary":"Get a VPC","operationId":"networking_get_vpc","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Vpc"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["networking"],"summary":"Delete a VPC","operationId":"networking_delete_vpc","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vpcs/{vpc_id}/nat-gateway":{"post":{"tags":["networking"],"summary":"Enable the VPC's NAT gateway","description":"Allocate (or reuse) a floating IP and SNAT the whole VPC subnet through\nit, so VMs without an address of their own reach the internet. One gateway\nper VPC (`409 nat_gateway_exists`). Asynchronous: poll the VPC's\n`nat_gateway.status` until `attached`.\n\nWithout `fip_id` this orders a NEW address and goes through the same\nbalance check as allocating one (`402 insufficient_balance`,\n`503 billing_unavailable`); reusing an address you already hold does not.","operationId":"networking_enable_nat_gateway","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/V1NatGatewayEnable"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1NatGateway"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["networking"],"summary":"Disable the VPC's NAT gateway","description":"Remove the SNAT; the gateway's address is released automatically once\nthe region confirms (`202`, `status: detaching`).","operationId":"networking_disable_nat_gateway","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1NatGateway"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vpcs/{vpc_id}/reserved-ips":{"post":{"tags":["networking"],"summary":"Reserve an IP in a VPC","operationId":"networking_create_reserved_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ReservedIpCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ReservedIp"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vpcs/{vpc_id}/reserved-ips/{ip_id}":{"delete":{"tags":["networking"],"summary":"Release a reserved IP","operationId":"networking_delete_reserved_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vpc_id","in":"path","required":true,"schema":{"type":"string","title":"Vpc Id"}},{"name":"ip_id","in":"path","required":true,"schema":{"type":"string","title":"Ip Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/floating-ips":{"get":{"tags":["networking"],"summary":"List floating IPs","operationId":"networking_list_floating_ips","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1FloatingIP_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["networking"],"summary":"Allocate a floating IP","description":"Allocating an address needs a funded balance, the same as creating a VM:\n402 ``insufficient_balance`` when the balance is below the address's monthly\nprice, 503 ``billing_unavailable`` when the balance could not be read.","operationId":"networking_create_floating_ip","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIPCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIP"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/floating-ips/{fip_id}":{"get":{"tags":["networking"],"summary":"Get a floating IP","operationId":"networking_get_floating_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"fip_id","in":"path","required":true,"schema":{"type":"string","title":"Fip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIP"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["networking"],"summary":"Rename a floating IP","operationId":"networking_update_floating_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"fip_id","in":"path","required":true,"schema":{"type":"string","title":"Fip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIPUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIP"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["networking"],"summary":"Release a floating IP","operationId":"networking_delete_floating_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"fip_id","in":"path","required":true,"schema":{"type":"string","title":"Fip Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/floating-ips/{fip_id}/attach":{"post":{"tags":["networking"],"summary":"Attach to a VM interface","operationId":"networking_attach_floating_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"fip_id","in":"path","required":true,"schema":{"type":"string","title":"Fip Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIPAttach"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIP"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/floating-ips/{fip_id}/detach":{"post":{"tags":["networking"],"summary":"Detach from its VM","operationId":"networking_detach_floating_ip","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"fip_id","in":"path","required":true,"schema":{"type":"string","title":"Fip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FloatingIP"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ssh-keys":{"get":{"tags":["ssh-keys"],"summary":"List SSH keys","operationId":"ssh_keys_list_ssh_keys","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1SshKey_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ssh-keys"],"summary":"Add an SSH key","operationId":"ssh_keys_create_ssh_key","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1SshKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1SshKey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ssh-keys/{key_id}":{"delete":{"tags":["ssh-keys"],"summary":"Delete an SSH key","operationId":"ssh_keys_delete_ssh_key","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/certificates":{"get":{"tags":["certificates"],"summary":"List certificates","operationId":"certificates_list_certificates","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Certificate_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps":{"get":{"tags":["apps"],"summary":"List apps","operationId":"apps_list_apps","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1App_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Create an app","operationId":"apps_create_app","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}":{"get":{"tags":["apps"],"summary":"Get an app","operationId":"apps_get_app","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["apps"],"summary":"Update an app (scale / resources / image)","description":"Scale (replica_count) and resize (replica_vcpu / replica_memory_mb) an\napp, or point a Docker-image app at a new image (docker_image). Billing/plan\ngates are shared with the panel route; a resource change creates a\nresource-only revision so app-deployer rolls running replicas to the new\nsize right away. A new image is built on the next deploy.","operationId":"apps_update_app_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["apps"],"summary":"Delete an app","operationId":"apps_delete_app_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/deploy":{"post":{"tags":["apps"],"summary":"Trigger a build & deploy","operationId":"apps_deploy_app","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DeployRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/deployments":{"post":{"tags":["apps"],"summary":"Deploy sources from a folder","description":"Deploy an app from a local folder: the request body IS the source.\n\nFor apps with ``source_type=upload`` — no repository, no git provider. The\nbody is a gzip-compressed tar of the folder; it is stored as the source of\nexactly this build, so a later rebuild of that build still means the same\nsources.","operationId":"apps_create_deployment","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/gzip":{"schema":{"type":"string","format":"binary"}}},"description":"gzip-compressed tar archive of the project folder"}}},"/projects/{project_id}/apps/{app_id}/builds":{"get":{"tags":["apps"],"summary":"List builds","operationId":"apps_list_builds","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Build_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/builds/{build_id}/logs":{"get":{"tags":["apps"],"summary":"Stream build logs","description":"Stream the log of one build, live while it runs.\n\nSame generator the dashboard uses — deliberately, not a second\nimplementation: it already knows the difference between a finished build\n(full history) and a running one (live tail), and two copies of that would\ndrift.\n\nThe stream ends with an explicit ``done`` event. Plain text would end with\nEOF, and EOF cannot tell \"the log is over\" from \"the connection dropped\" —\na client would report a truncated build as a finished one.","operationId":"apps_stream_build_logs","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"build_id","in":"path","required":true,"schema":{"type":"string","title":"Build Id"}}],"responses":{"200":{"description":"Server-sent events: one `data:` event per log line, terminated by an `event: done`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/env":{"get":{"tags":["apps"],"summary":"List environment variables","operationId":"apps_list_env_vars","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1EnvVar_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Create or set an environment variable","operationId":"apps_add_env_var","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVar"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/env/{env_var_id}":{"delete":{"tags":["apps"],"summary":"Delete an environment variable","operationId":"apps_delete_env_var_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"env_var_id","in":"path","required":true,"schema":{"type":"string","title":"Env Var Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/domains":{"get":{"tags":["apps"],"summary":"List domains","operationId":"apps_list_domains","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1AppDomain_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Add a custom domain","operationId":"apps_add_domain","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DomainCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDomain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/domains/{domain_id}":{"delete":{"tags":["apps"],"summary":"Remove a domain","operationId":"apps_remove_domain","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/jobs":{"get":{"tags":["app-jobs"],"summary":"List app jobs","operationId":"app_jobs_v1_list_jobs","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AppJobResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["app-jobs"],"summary":"Create an app job","operationId":"app_jobs_v1_create_job","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/jobs/{job_id}":{"patch":{"tags":["app-jobs"],"summary":"Update an app job","operationId":"app_jobs_v1_update_job","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["app-jobs"],"summary":"Delete an app job","operationId":"app_jobs_v1_delete_job","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/jobs/{job_id}/run":{"post":{"tags":["app-jobs"],"summary":"Run an app job now","operationId":"app_jobs_v1_run_job","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/job-runs":{"get":{"tags":["app-jobs"],"summary":"List job runs","operationId":"app_jobs_v1_list_runs","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AppJobRunResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/apps/{app_id}/job-runs/{run_id}":{"get":{"tags":["app-jobs"],"summary":"Get a job run","operationId":"app_jobs_v1_get_run","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps":{"get":{"tags":["apps"],"summary":"List apps across the account","description":"Все приложения аккаунта ключа, отфильтрованные его политикой — как\nпанельный ``/account-inventory?kind=apps``, но в контракте.","operationId":"apps_list_apps_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only apps of this project (optional)","title":"Project Id"},"description":"Only apps of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1App_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}":{"get":{"tags":["apps"],"summary":"Get an app","operationId":"apps_get_app_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["apps"],"summary":"Update an app (scale / resources / image)","operationId":"apps_update_app_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["apps"],"summary":"Delete an app","operationId":"apps_delete_app_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/deploy":{"post":{"tags":["apps"],"summary":"Trigger a build & deploy","operationId":"apps_deploy_app_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DeployRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/deployments":{"post":{"tags":["apps"],"summary":"Deploy sources from a folder","operationId":"apps_create_deployment_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/gzip":{"schema":{"type":"string","format":"binary"}}},"description":"gzip-compressed tar archive of the project folder"}}},"/apps/{app_id}/builds":{"get":{"tags":["apps"],"summary":"List builds","operationId":"apps_list_builds_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Build_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/builds/{build_id}/logs":{"get":{"tags":["apps"],"summary":"Stream build logs","operationId":"apps_stream_build_logs_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"build_id","in":"path","required":true,"schema":{"type":"string","title":"Build Id"}}],"responses":{"200":{"description":"Server-sent events: one `data:` event per log line, terminated by an `event: done`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/env":{"get":{"tags":["apps"],"summary":"List environment variables","operationId":"apps_list_env_vars_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1EnvVar_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Create or set an environment variable","operationId":"apps_add_env_var_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVar"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/env/{env_var_id}":{"delete":{"tags":["apps"],"summary":"Delete an environment variable","operationId":"apps_delete_env_var_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"env_var_id","in":"path","required":true,"schema":{"type":"string","title":"Env Var Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/domains":{"get":{"tags":["apps"],"summary":"List domains","operationId":"apps_list_domains_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1AppDomain_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Add a custom domain","operationId":"apps_add_domain_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1DomainCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AppDomain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/domains/{domain_id}":{"delete":{"tags":["apps"],"summary":"Remove a domain","operationId":"apps_remove_domain_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/jobs":{"get":{"tags":["apps"],"summary":"List app jobs","operationId":"apps_list_jobs_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AppJobResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Create an app job","operationId":"apps_create_job_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/jobs/{job_id}":{"patch":{"tags":["apps"],"summary":"Update an app job","operationId":"apps_update_job_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["apps"],"summary":"Delete an app job","operationId":"apps_delete_job_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/jobs/{job_id}/run":{"post":{"tags":["apps"],"summary":"Run an app job now","operationId":"apps_run_job_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/job-runs":{"get":{"tags":["apps"],"summary":"List job runs","operationId":"apps_list_runs_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"job_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AppJobRunResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/job-runs/{run_id}":{"get":{"tags":["apps"],"summary":"Get a job run","operationId":"apps_get_run_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppJobRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/functions":{"get":{"tags":["functions"],"summary":"List functions","operationId":"functions_list_functions","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Function_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["functions"],"summary":"Create a function","operationId":"functions_create_function_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FunctionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Function"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/functions/{function_id}":{"get":{"tags":["functions"],"summary":"Get a function","operationId":"functions_get_function_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Function"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["functions"],"summary":"Update a function (code and/or configuration)","description":"AWS-parity update (UpdateFunctionCode + UpdateFunctionConfiguration):\nPATCH the file map / handler / runtime / name / vpc_id, then POST\n…/deploy to build and roll the new code (the \"publish\" analogue).","operationId":"functions_update_function_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FunctionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Function"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["functions"],"summary":"Delete a function","operationId":"functions_delete_function_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/functions/{function_id}/deploy":{"post":{"tags":["functions"],"summary":"Build & deploy a function","operationId":"functions_deploy_function_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FunctionDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/functions/{function_id}/env":{"get":{"tags":["functions"],"summary":"List environment variables","operationId":"functions_list_env_vars","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1EnvVar_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["functions"],"summary":"Create or set an environment variable","operationId":"functions_add_env_var","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVar"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/functions/{function_id}/env/{env_var_id}":{"delete":{"tags":["functions"],"summary":"Delete an environment variable","operationId":"functions_delete_env_var_route","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}},{"name":"env_var_id","in":"path","required":true,"schema":{"type":"string","title":"Env Var Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters":{"get":{"tags":["kubernetes"],"summary":"List Kubernetes clusters in a project","operationId":"kubernetes_list_clusters","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1K8sCluster_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["kubernetes"],"summary":"Create a Kubernetes cluster","operationId":"kubernetes_create_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sClusterCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters/{cluster_id}":{"get":{"tags":["kubernetes"],"summary":"Get a Kubernetes cluster","operationId":"kubernetes_get_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["kubernetes"],"summary":"Delete a Kubernetes cluster","operationId":"kubernetes_delete_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters/{cluster_id}/nodes":{"get":{"tags":["kubernetes"],"summary":"List the cluster's nodes and their backing VMs","description":"Кто есть кто: нода Kubernetes ↔ машина TatNet.\n\nНужен CSI-драйверу, у которого нет другого способа это узнать. Общего имени\nу ноды и машины нет (Kubernetes зовёт ноду `talos-b25-9uq`, мы — своим\nhostname), а положить идентичность в машинный конфиг нельзя: Talos не\nпринимает `machine.files` в immediate-режиме, и попытка доставить их так\nроняет ЛЮБУЮ конвергенцию конфига живой ноды. Поэтому связка — ЗАПРОС по\nадресу, а не снимок, розданный заранее: ноды добавляются и уезжают, и ответ\nобязан пересчитываться.","operationId":"kubernetes_list_cluster_nodes","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1K8sNode"},"title":"Response Kubernetes List Cluster Nodes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters/{cluster_id}/kubeconfig":{"get":{"tags":["kubernetes"],"summary":"Download the cluster-admin kubeconfig","operationId":"kubernetes_get_kubeconfig","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Kubeconfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters/{cluster_id}/node-pools/{pool_id}/scale":{"post":{"tags":["kubernetes"],"summary":"Scale a worker node pool","operationId":"kubernetes_scale_node_pool","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sScale"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sNodePool"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/kubernetes-clusters/{cluster_id}/upgrade":{"post":{"tags":["kubernetes"],"summary":"Upgrade the Kubernetes version","description":"Bump the desired Kubernetes version; nodes are rolled one at a time\n(control plane first) by the platform. Track progress via ``upgrading``\non the cluster resource.","operationId":"kubernetes_upgrade_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sUpgrade"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes/regions":{"get":{"tags":["kubernetes"],"summary":"Kubernetes regions and offered versions","operationId":"kubernetes_list_regions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sRegions"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/projects/{project_id}/load-balancers":{"get":{"tags":["load-balancers"],"summary":"List load balancers","operationId":"load_balancers_list_lbs","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_LoadBalancerResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["load-balancers"],"summary":"Create a load balancer","description":"`config` in the body keeps the shortest path a single call (POST with\ntarget_groups + listeners = a serving LB).","operationId":"load_balancers_create_lb","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadBalancerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}":{"get":{"tags":["load-balancers"],"summary":"Get a load balancer","operationId":"load_balancers_get_lb","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadBalancerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["load-balancers"],"summary":"Update a load balancer","description":"node_count only — listeners/rules/groups/targets live under /config and\nthe granular sub-resources (the legacy flat body 422s in the schema).","operationId":"load_balancers_update_lb","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadBalancerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a load balancer","description":"Flips the INTENT (desired_state='deleting'); the api reconciler removes\nthe node VMs and stamps nodes_released_at, the region tears down OVN.","operationId":"load_balancers_delete_lb","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/config":{"get":{"tags":["load-balancers"],"summary":"Get the LB config document","description":"The whole document; CCM-owned objects are included and marked\nmanaged_by='ccm' (read-only for the user PUT).","operationId":"load_balancers_get_lb_config","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["load-balancers"],"summary":"Replace the user-owned LB config","description":"Declarative replacement of the USER-owned scope (§5.3 write order);\nCCM-owned objects are untouched.","operationId":"load_balancers_put_lb_config","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/managed-config":{"put":{"tags":["load-balancers"],"summary":"Replace the CCM-owned LB config (cloud-controller-manager)","description":"The ONLY write path of the managed_by='ccm' scope: the in-cluster CCM\nreconciles Services through it; user-owned objects are untouched (the\nCCM's blast radius stays its own scope).","operationId":"load_balancers_put_lb_managed_config","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/listeners":{"post":{"tags":["load-balancers"],"summary":"Add a listener","operationId":"load_balancers_create_listener","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/listeners/{listener_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a listener","description":"protocol never changes here (extra='forbid' in the schema → 422): the\ngenerated `mode` column anchors the composite FKs — a protocol change is\ndelete+recreate through PUT /config.","operationId":"load_balancers_patch_listener","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a listener","operationId":"load_balancers_delete_listener","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/listeners/{listener_id}/certificates":{"put":{"tags":["load-balancers"],"summary":"Replace a listener's certificates","operationId":"load_balancers_put_listener_certificates","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerCertificatesPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/listeners/{listener_id}/rules":{"post":{"tags":["load-balancers"],"summary":"Add a rule","operationId":"load_balancers_create_listener_rule","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["load-balancers"],"summary":"Replace the rule set","description":"Replace the prioritized rule set; the listener's default_action row is\nkept (it belongs to the listener, PATCH it there).","operationId":"load_balancers_put_listener_rules","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBRulesPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/listeners/{listener_id}/rules/{rule_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a rule","operationId":"load_balancers_patch_listener_rule","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBRulePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a rule","operationId":"load_balancers_delete_listener_rule","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/target-groups":{"post":{"tags":["load-balancers"],"summary":"Add a target group","operationId":"load_balancers_create_target_group","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/target-groups/{tg_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a target group","description":"protocol / target_type never change here (extra='forbid' → 422): both\ndefine the row's identity (generated `mode` anchors the composite FKs).","operationId":"load_balancers_patch_target_group","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a target group","operationId":"load_balancers_delete_target_group","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/target-groups/{tg_id}/targets":{"put":{"tags":["load-balancers"],"summary":"Replace the target set","operationId":"load_balancers_put_targets","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetsPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["load-balancers"],"summary":"Add a target","operationId":"load_balancers_add_target","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/load-balancers/{lb_id}/target-groups/{tg_id}/targets/{target_id}":{"delete":{"tags":["load-balancers"],"summary":"Remove a target","operationId":"load_balancers_delete_target","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/regions":{"get":{"tags":["load-balancers"],"summary":"Load-balancer regions","operationId":"load_balancers_list_regions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBRegions"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/load-balancers/certificates":{"get":{"tags":["load-balancers"],"summary":"List LB certificates","operationId":"load_balancers_list_lb_certificates","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LBCertificateResponse"},"type":"array","title":"Response Load Balancers List Lb Certificates"}}}}},"security":[{"TatNetAPIKey":[]}]},"post":{"tags":["load-balancers"],"summary":"Upload an LB certificate (BYO PEM)","description":"The PEM is validated and handed to control-plane for the keystore write\n(00117); the row starts 'pending' and flips 'active' when CP confirms.","operationId":"load_balancers_create_lb_uploaded_certificate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBUploadedCertCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBCertificateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/load-balancers/certificates/letsencrypt":{"post":{"tags":["load-balancers"],"summary":"Auto-issue a Let's Encrypt LB certificate (DNS-01)","operationId":"load_balancers_create_lb_le_certificate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBLetsEncryptCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBCertificateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/load-balancers/certificates/{certificate_id}":{"delete":{"tags":["load-balancers"],"summary":"Delete an LB certificate","operationId":"load_balancers_delete_lb_certificate","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"certificate_id","in":"path","required":true,"schema":{"type":"string","title":"Certificate Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/volumes":{"get":{"tags":["volumes"],"summary":"List block volumes in a project","operationId":"volumes_list_volumes","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Volume_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["volumes"],"summary":"Create a block volume","operationId":"volumes_create_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VolumeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/volumes/{volume_id}":{"get":{"tags":["volumes"],"summary":"Get a block volume","operationId":"volumes_get_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["volumes"],"summary":"Grow a block volume","operationId":"volumes_resize_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VolumeResize"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["volumes"],"summary":"Delete a block volume","operationId":"volumes_delete_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/volumes/{volume_id}/attach":{"post":{"tags":["volumes"],"summary":"Attach a volume to a VM","operationId":"volumes_attach_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VolumeAttach"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/volumes/{volume_id}/detach":{"post":{"tags":["volumes"],"summary":"Detach a volume from its VM","operationId":"volumes_detach_volume","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/V1VolumeDetach"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets":{"get":{"tags":["object-storage"],"summary":"List buckets","operationId":"object_storage_list_buckets","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Bucket_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["object-storage"],"summary":"Create a bucket","operationId":"object_storage_create_bucket","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BucketCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets/{bucket_id}":{"get":{"tags":["object-storage"],"summary":"Get a bucket","operationId":"object_storage_get_bucket","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["object-storage"],"summary":"Update a bucket","operationId":"object_storage_update_bucket","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BucketUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["object-storage"],"summary":"Delete a bucket","operationId":"object_storage_delete_bucket","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Also purge every object, version and delete marker. Without it a non-empty bucket is refused (409). Irreversible","default":false,"title":"Force"},"description":"Also purge every object, version and delete marker. Without it a non-empty bucket is refused (409). Irreversible"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets/{bucket_id}/objects":{"get":{"tags":["object-storage"],"summary":"List objects","operationId":"object_storage_list_objects","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}},{"name":"prefix","in":"query","required":false,"schema":{"type":"string","description":"Only keys under this prefix","default":"","title":"Prefix"},"description":"Only keys under this prefix"},{"name":"continuation_token","in":"query","required":false,"schema":{"type":"string","description":"`next_continuation_token` from the previous page","default":"","title":"Continuation Token"},"description":"`next_continuation_token` from the previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ObjectList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets/{bucket_id}/objects/presign":{"post":{"tags":["object-storage"],"summary":"Pre-sign an object URL","description":"Download (GET) or upload (PUT) a single object without an S3 access key.\n\nGET needs ``bucket:read``, PUT needs ``bucket:update`` — the URL carries the\nplatform's own credential, so the action gate is the only thing standing\nbetween the caller and the object.","operationId":"object_storage_presign_object","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Presign"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PresignResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets/{bucket_id}/objects/delete":{"post":{"tags":["object-storage"],"summary":"Delete an object","operationId":"object_storage_delete_object","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ObjectKey"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/buckets/{bucket_id}/folders":{"post":{"tags":["object-storage"],"summary":"Create a folder","description":"S3 has no directories; this writes the empty marker object browsers and\nthe dashboard's file manager render as a folder.","operationId":"object_storage_create_folder","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FolderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FolderCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/usage":{"get":{"tags":["object-storage"],"summary":"Storage usage per bucket","description":"Last measured size of each bucket. ``snapshot_at`` is null for a bucket\nthe platform has not measured yet — that is \"not known\", not \"empty\".","operationId":"object_storage_get_usage","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Usage"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/object-storage/connection-info":{"get":{"tags":["object-storage"],"summary":"S3 endpoint and region","description":"What to put in an S3 client's configuration. Pair it with an access key.","operationId":"object_storage_get_connection_info","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ConnectionInfo"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/object-storage/access-keys":{"get":{"tags":["object-storage"],"summary":"List S3 access keys","operationId":"object_storage_list_access_keys","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1AccessKey_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["object-storage"],"summary":"Create an S3 access key","description":"Mint a SigV4 credential for S3 clients.\n\n``secret_access_key`` is in this response and nowhere else — only a hash is\nkept. The key is an independent credential: revoking the ``tn_live_`` key\nthat created it does **not** revoke it.\n\nA new key starts in ``provisioning`` and flips to ``active`` once the secret\nreaches the keystore (seconds). Requests signed with it fail until then.","operationId":"object_storage_create_access_key","security":[{"TatNetAPIKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AccessKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AccessKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/object-storage/access-keys/{key_id}":{"patch":{"tags":["object-storage"],"summary":"Replace an access key's bucket scope","description":"The new scope replaces the old one; it takes effect after replication to\nthe gateway's read replica plus its key-cache TTL, not instantly.","operationId":"object_storage_update_access_key","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AccessKeyScope"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AccessKey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["object-storage"],"summary":"Delete an S3 access key","operationId":"object_storage_delete_access_key","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains":{"get":{"tags":["domains"],"summary":"List registered domains","operationId":"domains_list_domains","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1RegisteredDomain_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/domains/{domain_id}":{"get":{"tags":["domains"],"summary":"Get a registered domain","operationId":"domains_get_domain","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RegisteredDomain"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters":{"get":{"tags":["postgres"],"summary":"List Postgres clusters in a project","operationId":"postgres_list_clusters","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PgClusterResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["postgres"],"summary":"Create a Postgres cluster","description":"``role_password`` in this response is the only time the starter role's\npassword is visible: api does not store it (the keystore does, written by\ncontrol-plane) and no endpoint can return it again. Use\n``POST …/roles/{role}/password`` to issue a new one.\n\nThe cluster comes back in ``provisioning``; the region builds it over the\nnext minutes. Restoring into a new cluster is part of *this* call —\n``restore_from`` — not a separate endpoint, because a restore always\nproduces a new cluster.","operationId":"postgres_create_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePgClusterRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}":{"get":{"tags":["postgres"],"summary":"Get a Postgres cluster","operationId":"postgres_get_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["postgres"],"summary":"Delete a Postgres cluster","description":"202: the row goes to ``deleting`` and the region tears the cluster down.\nThe backup repository outlives it by 14 days, so a restore is still possible\nafter this call.","operationId":"postgres_delete_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/allowlist":{"put":{"tags":["postgres"],"summary":"Replace the allowed IP list","description":"Public clusters only — a cluster in a VPC has no public address (422).\nFor a public cluster the allowlist is the whole network filter: an empty\nlist means nobody can connect.","operationId":"postgres_update_allowlist","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePgAllowlistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/plan":{"put":{"tags":["postgres"],"summary":"Change the node plan","description":"Upwards only: memory, vCPU and disk of the new plan must be at least the\ncurrent ones. Nodes are resized one at a time, replicas first and the leader\nlast — a single-node cluster is down for about a minute, an ha one fails\nover once. Watch ``plan_change_pending``.","operationId":"postgres_change_plan","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePgPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/topology":{"put":{"tags":["postgres"],"summary":"Change the topology (single ↔ ha)","description":"Growing to ha adds nodes without downtime; shrinking switches the leader\noff any node being removed first. Price follows immediately (plan × nodes).\nWatch ``topology_change_pending``.","operationId":"postgres_change_topology","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePgTopologyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/replace-nodes":{"post":{"tags":["postgres"],"summary":"Replace outdated nodes with the newest image","description":"Marks every live node whose VM is not on the newest ready image build in\nthe region. Replacements run one at a time — replicas, leader, witness — and\nthe database stays reachable throughout. ``requested: 0`` means every node\nis already current.","operationId":"postgres_replace_outdated_nodes","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/nodes/{ordinal}/replace":{"post":{"tags":["postgres"],"summary":"Replace one node","description":"Re-create one node, current image or not — the ops escape hatch.","operationId":"postgres_replace_node","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"ordinal","in":"path","required":true,"schema":{"type":"integer","title":"Ordinal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/parameters":{"get":{"tags":["postgres"],"summary":"Server parameters and their catalog","description":"``parameters`` is the intent, ``applied_parameters`` is what the region\nconfirmed reached the cluster, and ``catalog`` carries the allowed range of\neach parameter already computed for this cluster's plan.","operationId":"postgres_get_parameters","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["postgres"],"summary":"Replace server parameters","description":"A full replacement, not a merge: a parameter absent from the request is\ncleared. Parameters marked ``restart`` in the catalog only take effect after\n``POST …/restart``.","operationId":"postgres_update_parameters","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePgParametersRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/restart":{"post":{"tags":["postgres"],"summary":"Request a restart","description":"Restarts nodes to apply postmaster-level parameters — replicas first,\nleader last. ``restart_pending_ack`` stays true until the region confirms.","operationId":"postgres_restart_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/roles/{role}/password":{"post":{"tags":["postgres"],"summary":"Issue a new password for a role","description":"The new password is in this response and nowhere else.\n\n``applied: false`` means the region has not run ``ALTER ROLE`` yet — **the\ndatabase still accepts the old password until it does.** Do not treat the\n200 as the moment the old one stopped working.","operationId":"postgres_reset_role_password","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgRolePasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/ca":{"get":{"tags":["postgres"],"summary":"Download the cluster CA certificate","description":"Per-cluster CA, for connecting with ``sslmode=verify-full``.\n``ready: false`` while the region has not issued it yet.","operationId":"postgres_get_cluster_ca","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgCaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/backups":{"get":{"tags":["postgres"],"summary":"List backups and the PITR window","description":"``pitr_window`` spans the oldest completed backup to the last archived\nWAL. Either bound being null means there is no window — restore is not\npossible yet, which is not the same as \"no backups\".","operationId":"postgres_list_backups","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgBackupsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["postgres"],"summary":"Request a manual backup","description":"Manual backups never expire, so at most 5 live ones per cluster — they\nwould otherwise eat the repository quota the nightly automatic backups need.\nThe row starts ``requested``; the node takes it from there.","operationId":"postgres_create_backup","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePgBackupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgBackupsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/pg-clusters/{cluster_id}/backups/{backup_id}":{"delete":{"tags":["postgres"],"summary":"Delete a backup","description":"202: the row goes to ``deleting`` and the region expires it. The newest\ncompleted backup cannot be deleted — the region never expires it, so the\nrequest would hang forever.","operationId":"postgres_delete_backup","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"string","title":"Backup Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/postgres/regions":{"get":{"tags":["postgres"],"summary":"Postgres regions, versions, plans and topologies","description":"Everything a create call needs to pick from. Versions are per-region: a\nversion appears only where a ready node image is laid out on every node of\nthat region, so the same list is not valid everywhere.","operationId":"postgres_list_regions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgRegionsListResponse"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/projects/{project_id}/valkey-clusters":{"get":{"tags":["valkey"],"summary":"List Valkey clusters in a project","operationId":"valkey_list_clusters","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ValkeyClusterResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["valkey"],"summary":"Create a Valkey cluster","description":"``password`` in this response is the only time the ``default`` user's\npassword is visible — api does not store it, the keystore does. Issue a new\none with ``POST …/password``.\n\nThe cluster is TLS-only: connect with ``rediss://`` and the per-cluster CA\nfrom ``GET …/ca``.","operationId":"valkey_create_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateValkeyClusterRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}":{"get":{"tags":["valkey"],"summary":"Get a Valkey cluster","operationId":"valkey_get_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["valkey"],"summary":"Delete a Valkey cluster","description":"202: the row goes to ``deleting`` and the region tears it down. A cache\nhas no backups — the data is gone.","operationId":"valkey_delete_cluster","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/allowlist":{"put":{"tags":["valkey"],"summary":"Replace the allowed IP list","description":"For a public cluster this list **is** the network filter — there is no\nsecond layer behind it. An empty list means no client can connect.","operationId":"valkey_update_allowlist","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateValkeyAllowlistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/plan":{"put":{"tags":["valkey"],"summary":"Change the node plan","description":"Upgrade only: memory, vCPU and disk of the new plan must not be below\nthe current ones. Nodes are resized one at a time (each reboots); the\nmemory and connection limits rise once every node is on the new plan.\n`plan_change_pending` on the cluster shows the change is still in\nprogress.","operationId":"valkey_change_plan","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeValkeyPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/topology":{"put":{"tags":["valkey"],"summary":"Change the topology","description":"single ↔ ha. Growing adds a replica and a read endpoint without\ndowntime; shrinking removes the replica and the read endpoint at once\n(a switchover happens if the primary is on the replica).\n`topology_change_pending` on the cluster shows the change is still in\nprogress.","operationId":"valkey_change_topology","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeValkeyTopologyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/params":{"put":{"tags":["valkey"],"summary":"Update cache parameters","description":"maxmemory, eviction policy, max clients and persistence. The region\napplies them to the running server, so no restart is needed.","operationId":"valkey_update_params","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateValkeyParamsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/password":{"post":{"tags":["valkey"],"summary":"Issue a new password","description":"The new password is in this response and nowhere else. ``applied:\nfalse`` means the region has not pushed it to the server yet — **the old\npassword still works until it does.**","operationId":"valkey_reset_password","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyPasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/ca":{"get":{"tags":["valkey"],"summary":"Download the cluster CA certificate","description":"The cluster is TLS-only; this CA is what a ``rediss://`` client verifies\nagainst. ``ready: false`` while the region has not issued it — the same\nshape as the Postgres CA and the Kubernetes kubeconfig.","operationId":"valkey_get_cluster_ca","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyCaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/replace-nodes":{"post":{"tags":["valkey"],"summary":"Replace outdated nodes with the newest image","description":"One node at a time, replicas before the leader. ``requested: 0`` means\nevery node is already on the newest image build in the region.","operationId":"valkey_replace_outdated_nodes","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{project_id}/valkey-clusters/{cluster_id}/nodes/{ordinal}/replace":{"post":{"tags":["valkey"],"summary":"Replace one node","description":"Re-create one node, current image or not — the ops escape hatch.","operationId":"valkey_replace_node","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"ordinal","in":"path","required":true,"schema":{"type":"integer","title":"Ordinal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey/regions":{"get":{"tags":["valkey"],"summary":"Valkey regions, versions, plans and cache modes","description":"Versions are per-region: one is offered only where a ready node image is\nlaid out on every node of that region.","operationId":"valkey_list_regions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyRegionsListResponse"}}}}},"security":[{"TatNetAPIKey":[]}]}},"/vms/{vm_id}":{"get":{"tags":["vms"],"summary":"Get a VM","operationId":"vms_get_vm_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VM"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["vms"],"summary":"Delete a VM","description":"202, and the body says which of the two things happened.\n\nA VM that was never provisioned is gone when this returns (``deleted``).\nA provisioned one is moved to ``deleting`` and a region tears it down over\nthe following minutes — it stays visible in ``GET …/vms`` until then, so a\nscript that deletes and immediately re-creates by name has to wait.\n\nThis used to answer 204, which could not express the difference; the\nservice's own return value cannot either (it reports ``success`` for both\nand puts the distinction in a human-readable message).","operationId":"vms_delete_vm_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms/{vm_id}/start":{"post":{"tags":["vms"],"summary":"Start a VM","operationId":"vms_start_vm_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VMStartRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms/{vm_id}/stop":{"post":{"tags":["vms"],"summary":"Stop a VM","operationId":"vms_stop_vm_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms/{vm_id}/restart":{"post":{"tags":["vms"],"summary":"Restart a VM","operationId":"vms_restart_vm_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PowerActionResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms/{vm_id}/backups":{"get":{"tags":["vms"],"summary":"List VM backups","operationId":"vms_list_backups_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Backup_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["vms"],"summary":"Create a VM backup","operationId":"vms_create_backup_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BackupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Backup"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms/{vm_id}/backups/{backup_id}":{"delete":{"tags":["vms"],"summary":"Delete a VM backup","operationId":"vms_delete_backup_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"vm_id","in":"path","required":true,"schema":{"type":"string","title":"Vm Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"string","title":"Backup Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/vms":{"get":{"tags":["vms"],"summary":"List VMs in a project","operationId":"vms_list_vms_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1VM_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/functions/{function_id}":{"get":{"tags":["functions"],"summary":"Get a function","operationId":"functions_get_function_route_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Function"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["functions"],"summary":"Update a function (code and/or configuration)","description":"AWS-parity update (UpdateFunctionCode + UpdateFunctionConfiguration):\nPATCH the file map / handler / runtime / name / vpc_id, then POST\n…/deploy to build and roll the new code (the \"publish\" analogue).","operationId":"functions_update_function_route_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FunctionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Function"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["functions"],"summary":"Delete a function","operationId":"functions_delete_function_route_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/functions/{function_id}/deploy":{"post":{"tags":["functions"],"summary":"Build & deploy a function","operationId":"functions_deploy_function_route_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FunctionDeployResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/functions/{function_id}/env":{"get":{"tags":["functions"],"summary":"List environment variables","operationId":"functions_list_env_vars_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1EnvVar_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["functions"],"summary":"Create or set an environment variable","operationId":"functions_add_env_var_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EnvVar"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/functions/{function_id}/env/{env_var_id}":{"delete":{"tags":["functions"],"summary":"Delete an environment variable","operationId":"functions_delete_env_var_route_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"function_id","in":"path","required":true,"schema":{"type":"string","title":"Function Id"}},{"name":"env_var_id","in":"path","required":true,"schema":{"type":"string","title":"Env Var Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/functions":{"get":{"tags":["functions"],"summary":"List functions","operationId":"functions_list_functions_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Function_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/volumes/{volume_id}":{"get":{"tags":["volumes"],"summary":"Get a block volume","operationId":"volumes_get_volume_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["volumes"],"summary":"Grow a block volume","operationId":"volumes_resize_volume_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VolumeResize"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["volumes"],"summary":"Delete a block volume","operationId":"volumes_delete_volume_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/volumes/{volume_id}/attach":{"post":{"tags":["volumes"],"summary":"Attach a volume to a VM","operationId":"volumes_attach_volume_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1VolumeAttach"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/volumes/{volume_id}/detach":{"post":{"tags":["volumes"],"summary":"Detach a volume from its VM","operationId":"volumes_detach_volume_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"volume_id","in":"path","required":true,"schema":{"type":"string","title":"Volume Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/V1VolumeDetach"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Volume"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/volumes":{"get":{"tags":["volumes"],"summary":"List block volumes in a project","operationId":"volumes_list_volumes_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1Volume_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}":{"get":{"tags":["postgres"],"summary":"Get a Postgres cluster","operationId":"postgres_get_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["postgres"],"summary":"Delete a Postgres cluster","description":"202: the row goes to ``deleting`` and the region tears the cluster down.\nThe backup repository outlives it by 14 days, so a restore is still possible\nafter this call.","operationId":"postgres_delete_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/allowlist":{"put":{"tags":["postgres"],"summary":"Replace the allowed IP list","description":"Public clusters only — a cluster in a VPC has no public address (422).\nFor a public cluster the allowlist is the whole network filter: an empty\nlist means nobody can connect.","operationId":"postgres_update_allowlist_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePgAllowlistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/plan":{"put":{"tags":["postgres"],"summary":"Change the node plan","description":"Upwards only: memory, vCPU and disk of the new plan must be at least the\ncurrent ones. Nodes are resized one at a time, replicas first and the leader\nlast — a single-node cluster is down for about a minute, an ha one fails\nover once. Watch ``plan_change_pending``.","operationId":"postgres_change_plan_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePgPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/topology":{"put":{"tags":["postgres"],"summary":"Change the topology (single ↔ ha)","description":"Growing to ha adds nodes without downtime; shrinking switches the leader\noff any node being removed first. Price follows immediately (plan × nodes).\nWatch ``topology_change_pending``.","operationId":"postgres_change_topology_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePgTopologyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/replace-nodes":{"post":{"tags":["postgres"],"summary":"Replace outdated nodes with the newest image","description":"Marks every live node whose VM is not on the newest ready image build in\nthe region. Replacements run one at a time — replicas, leader, witness — and\nthe database stays reachable throughout. ``requested: 0`` means every node\nis already current.","operationId":"postgres_replace_outdated_nodes_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/nodes/{ordinal}/replace":{"post":{"tags":["postgres"],"summary":"Replace one node","description":"Re-create one node, current image or not — the ops escape hatch.","operationId":"postgres_replace_node_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"ordinal","in":"path","required":true,"schema":{"type":"integer","title":"Ordinal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/parameters":{"get":{"tags":["postgres"],"summary":"Server parameters and their catalog","description":"``parameters`` is the intent, ``applied_parameters`` is what the region\nconfirmed reached the cluster, and ``catalog`` carries the allowed range of\neach parameter already computed for this cluster's plan.","operationId":"postgres_get_parameters_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["postgres"],"summary":"Replace server parameters","description":"A full replacement, not a merge: a parameter absent from the request is\ncleared. Parameters marked ``restart`` in the catalog only take effect after\n``POST …/restart``.","operationId":"postgres_update_parameters_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePgParametersRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/restart":{"post":{"tags":["postgres"],"summary":"Request a restart","description":"Restarts nodes to apply postmaster-level parameters — replicas first,\nleader last. ``restart_pending_ack`` stays true until the region confirms.","operationId":"postgres_restart_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgParametersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/roles/{role}/password":{"post":{"tags":["postgres"],"summary":"Issue a new password for a role","description":"The new password is in this response and nowhere else.\n\n``applied: false`` means the region has not run ``ALTER ROLE`` yet — **the\ndatabase still accepts the old password until it does.** Do not treat the\n200 as the moment the old one stopped working.","operationId":"postgres_reset_role_password_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgRolePasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/ca":{"get":{"tags":["postgres"],"summary":"Download the cluster CA certificate","description":"Per-cluster CA, for connecting with ``sslmode=verify-full``.\n``ready: false`` while the region has not issued it yet.","operationId":"postgres_get_cluster_ca_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgCaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/backups":{"get":{"tags":["postgres"],"summary":"List backups and the PITR window","description":"``pitr_window`` spans the oldest completed backup to the last archived\nWAL. Either bound being null means there is no window — restore is not\npossible yet, which is not the same as \"no backups\".","operationId":"postgres_list_backups_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgBackupsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["postgres"],"summary":"Request a manual backup","description":"Manual backups never expire, so at most 5 live ones per cluster — they\nwould otherwise eat the repository quota the nightly automatic backups need.\nThe row starts ``requested``; the node takes it from there.","operationId":"postgres_create_backup_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePgBackupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgBackupsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters/{cluster_id}/backups/{backup_id}":{"delete":{"tags":["postgres"],"summary":"Delete a backup","description":"202: the row goes to ``deleting`` and the region expires it. The newest\ncompleted backup cannot be deleted — the region never expires it, so the\nrequest would hang forever.","operationId":"postgres_delete_backup_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"backup_id","in":"path","required":true,"schema":{"type":"string","title":"Backup Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pg-clusters":{"get":{"tags":["postgres"],"summary":"List Postgres clusters in a project","operationId":"postgres_list_clusters_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PgClusterResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}":{"get":{"tags":["valkey"],"summary":"Get a Valkey cluster","operationId":"valkey_get_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["valkey"],"summary":"Delete a Valkey cluster","description":"202: the row goes to ``deleting`` and the region tears it down. A cache\nhas no backups — the data is gone.","operationId":"valkey_delete_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/allowlist":{"put":{"tags":["valkey"],"summary":"Replace the allowed IP list","description":"For a public cluster this list **is** the network filter — there is no\nsecond layer behind it. An empty list means no client can connect.","operationId":"valkey_update_allowlist_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateValkeyAllowlistRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/plan":{"put":{"tags":["valkey"],"summary":"Change the node plan","description":"Upgrade only: memory, vCPU and disk of the new plan must not be below\nthe current ones. Nodes are resized one at a time (each reboots); the\nmemory and connection limits rise once every node is on the new plan.\n`plan_change_pending` on the cluster shows the change is still in\nprogress.","operationId":"valkey_change_plan_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeValkeyPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/topology":{"put":{"tags":["valkey"],"summary":"Change the topology","description":"single ↔ ha. Growing adds a replica and a read endpoint without\ndowntime; shrinking removes the replica and the read endpoint at once\n(a switchover happens if the primary is on the replica).\n`topology_change_pending` on the cluster shows the change is still in\nprogress.","operationId":"valkey_change_topology_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeValkeyTopologyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/params":{"put":{"tags":["valkey"],"summary":"Update cache parameters","description":"maxmemory, eviction policy, max clients and persistence. The region\napplies them to the running server, so no restart is needed.","operationId":"valkey_update_params_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateValkeyParamsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyClusterDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/password":{"post":{"tags":["valkey"],"summary":"Issue a new password","description":"The new password is in this response and nowhere else. ``applied:\nfalse`` means the region has not pushed it to the server yet — **the old\npassword still works until it does.**","operationId":"valkey_reset_password_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyPasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/ca":{"get":{"tags":["valkey"],"summary":"Download the cluster CA certificate","description":"The cluster is TLS-only; this CA is what a ``rediss://`` client verifies\nagainst. ``ready: false`` while the region has not issued it — the same\nshape as the Postgres CA and the Kubernetes kubeconfig.","operationId":"valkey_get_cluster_ca_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyCaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/replace-nodes":{"post":{"tags":["valkey"],"summary":"Replace outdated nodes with the newest image","description":"One node at a time, replicas before the leader. ``requested: 0`` means\nevery node is already on the newest image build in the region.","operationId":"valkey_replace_outdated_nodes_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters/{cluster_id}/nodes/{ordinal}/replace":{"post":{"tags":["valkey"],"summary":"Replace one node","description":"Re-create one node, current image or not — the ops escape hatch.","operationId":"valkey_replace_node_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"ordinal","in":"path","required":true,"schema":{"type":"integer","title":"Ordinal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValkeyReplaceNodesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/valkey-clusters":{"get":{"tags":["valkey"],"summary":"List Valkey clusters in a project","operationId":"valkey_list_clusters_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ValkeyClusterResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters/{cluster_id}":{"get":{"tags":["kubernetes"],"summary":"Get a Kubernetes cluster","operationId":"kubernetes_get_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["kubernetes"],"summary":"Delete a Kubernetes cluster","operationId":"kubernetes_delete_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters/{cluster_id}/nodes":{"get":{"tags":["kubernetes"],"summary":"List the cluster's nodes and their backing VMs","description":"Кто есть кто: нода Kubernetes ↔ машина TatNet.\n\nНужен CSI-драйверу, у которого нет другого способа это узнать. Общего имени\nу ноды и машины нет (Kubernetes зовёт ноду `talos-b25-9uq`, мы — своим\nhostname), а положить идентичность в машинный конфиг нельзя: Talos не\nпринимает `machine.files` в immediate-режиме, и попытка доставить их так\nроняет ЛЮБУЮ конвергенцию конфига живой ноды. Поэтому связка — ЗАПРОС по\nадресу, а не снимок, розданный заранее: ноды добавляются и уезжают, и ответ\nобязан пересчитываться.","operationId":"kubernetes_list_cluster_nodes_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1K8sNode"},"title":"Response Kubernetes List Cluster Nodes By Id"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters/{cluster_id}/kubeconfig":{"get":{"tags":["kubernetes"],"summary":"Download the cluster-admin kubeconfig","operationId":"kubernetes_get_kubeconfig_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Kubeconfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters/{cluster_id}/node-pools/{pool_id}/scale":{"post":{"tags":["kubernetes"],"summary":"Scale a worker node pool","operationId":"kubernetes_scale_node_pool_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}},{"name":"pool_id","in":"path","required":true,"schema":{"type":"string","title":"Pool Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sScale"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sNodePool"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters/{cluster_id}/upgrade":{"post":{"tags":["kubernetes"],"summary":"Upgrade the Kubernetes version","description":"Bump the desired Kubernetes version; nodes are rolled one at a time\n(control plane first) by the platform. Track progress via ``upgrading``\non the cluster resource.","operationId":"kubernetes_upgrade_cluster_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sUpgrade"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1K8sCluster"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/kubernetes-clusters":{"get":{"tags":["kubernetes"],"summary":"List Kubernetes clusters in a project","operationId":"kubernetes_list_clusters_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_V1K8sCluster_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}":{"get":{"tags":["load-balancers"],"summary":"Get a load balancer","operationId":"load_balancers_get_lb_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadBalancerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["load-balancers"],"summary":"Update a load balancer","description":"node_count only — listeners/rules/groups/targets live under /config and\nthe granular sub-resources (the legacy flat body 422s in the schema).","operationId":"load_balancers_update_lb_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1LBUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadBalancerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a load balancer","description":"Flips the INTENT (desired_state='deleting'); the api reconciler removes\nthe node VMs and stamps nodes_released_at, the region tears down OVN.","operationId":"load_balancers_delete_lb_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/config":{"get":{"tags":["load-balancers"],"summary":"Get the LB config document","description":"The whole document; CCM-owned objects are included and marked\nmanaged_by='ccm' (read-only for the user PUT).","operationId":"load_balancers_get_lb_config_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["load-balancers"],"summary":"Replace the user-owned LB config","description":"Declarative replacement of the USER-owned scope (§5.3 write order);\nCCM-owned objects are untouched.","operationId":"load_balancers_put_lb_config_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/managed-config":{"put":{"tags":["load-balancers"],"summary":"Replace the CCM-owned LB config (cloud-controller-manager)","description":"The ONLY write path of the managed_by='ccm' scope: the in-cluster CCM\nreconciles Services through it; user-owned objects are untouched (the\nCCM's blast radius stays its own scope).","operationId":"load_balancers_put_lb_managed_config_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigSpec"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/listeners":{"post":{"tags":["load-balancers"],"summary":"Add a listener","operationId":"load_balancers_create_listener_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/listeners/{listener_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a listener","description":"protocol never changes here (extra='forbid' in the schema → 422): the\ngenerated `mode` column anchors the composite FKs — a protocol change is\ndelete+recreate through PUT /config.","operationId":"load_balancers_patch_listener_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a listener","operationId":"load_balancers_delete_listener_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/listeners/{listener_id}/certificates":{"put":{"tags":["load-balancers"],"summary":"Replace a listener's certificates","operationId":"load_balancers_put_listener_certificates_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerCertificatesPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/listeners/{listener_id}/rules":{"post":{"tags":["load-balancers"],"summary":"Add a rule","operationId":"load_balancers_create_listener_rule_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["load-balancers"],"summary":"Replace the rule set","description":"Replace the prioritized rule set; the listener's default_action row is\nkept (it belongs to the listener, PATCH it there).","operationId":"load_balancers_put_listener_rules_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBRulesPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/listeners/{listener_id}/rules/{rule_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a rule","operationId":"load_balancers_patch_listener_rule_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBRulePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBListenerRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a rule","operationId":"load_balancers_delete_listener_rule_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"listener_id","in":"path","required":true,"schema":{"type":"string","title":"Listener Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/target-groups":{"post":{"tags":["load-balancers"],"summary":"Add a target group","operationId":"load_balancers_create_target_group_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/target-groups/{tg_id}":{"patch":{"tags":["load-balancers"],"summary":"Update a target group","description":"protocol / target_type never change here (extra='forbid' → 422): both\ndefine the row's identity (generated `mode` anchors the composite FKs).","operationId":"load_balancers_patch_target_group_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["load-balancers"],"summary":"Delete a target group","operationId":"load_balancers_delete_target_group_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/target-groups/{tg_id}/targets":{"put":{"tags":["load-balancers"],"summary":"Replace the target set","operationId":"load_balancers_put_targets_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetsPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["load-balancers"],"summary":"Add a target","operationId":"load_balancers_add_target_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetSpec"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LBTargetGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers/{lb_id}/target-groups/{tg_id}/targets/{target_id}":{"delete":{"tags":["load-balancers"],"summary":"Remove a target","operationId":"load_balancers_delete_target_by_id","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"lb_id","in":"path","required":true,"schema":{"type":"string","title":"Lb Id"}},{"name":"tg_id","in":"path","required":true,"schema":{"type":"string","title":"Tg Id"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/load-balancers":{"get":{"tags":["load-balancers"],"summary":"List load balancers","operationId":"load_balancers_list_lbs_by_account","security":[{"TatNetAPIKey":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only resources of this project (optional)","title":"Project Id"},"description":"Only resources of this project (optional)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_LoadBalancerResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AppJobCreateRequest":{"properties":{"name":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$","title":"Name","description":"Имя задачи, уникально в аппе"},"command":{"type":"string","title":"Command","description":"Shell-команда в VM из текущего образа аппа"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule","description":"cron из 5 полей, UTC; пусто — только вручную"},"timeout_seconds":{"type":"integer","maximum":3600.0,"minimum":10.0,"title":"Timeout Seconds","default":900},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name","command"],"title":"AppJobCreateRequest"},"AppJobResponse":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"name":{"type":"string","title":"Name"},"command":{"type":"string","title":"Command"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds"},"enabled":{"type":"boolean","title":"Enabled"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"last_run":{"anyOf":[{"$ref":"#/components/schemas/AppJobRunResponse"},{"type":"null"}]}},"type":"object","required":["id","app_id","name","command","schedule","timeout_seconds","enabled","created_at","updated_at"],"title":"AppJobResponse"},"AppJobRunResponse":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"kind":{"type":"string","title":"Kind"},"command":{"type":"string","title":"Command"},"status":{"type":"string","title":"Status"},"exit_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exit Code"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"log_tail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Tail"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"triggered_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Triggered By"},"scheduled_for":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled For"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","app_id","job_id","build_id","kind","command","status","exit_code","started_at","finished_at","duration_ms","log_tail","error","triggered_by","scheduled_for","created_at"],"title":"AppJobRunResponse"},"AppJobUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$"},{"type":"null"}],"title":"Name"},"command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"timeout_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":10.0},{"type":"null"}],"title":"Timeout Seconds"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"AppJobUpdateRequest"},"ChangePgPlanRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id"}},"type":"object","required":["plan_id"],"title":"ChangePgPlanRequest","description":"Смена тарифа: только вверх (память, vCPU и диск не меньше текущих).\nУзлы перезагружаются по одному — у одиночного кластера это простой на\nвремя перезагрузки VM."},"ChangePgTopologyRequest":{"properties":{"topology":{"type":"string","title":"Topology"}},"type":"object","required":["topology"],"title":"ChangePgTopologyRequest","description":"Смена топологии: single ↔ ha. Рост — без простоя (реплика и witness\nдобавляются к живому кластеру), сжатие — с переключением лидера, если\nон сидит на выводимой реплике."},"ChangeValkeyPlanRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id"}},"type":"object","required":["plan_id"],"title":"ChangeValkeyPlanRequest","description":"Смена тарифа: только вверх (память, vCPU и диск не меньше текущих).\nУзлы ресайзятся по одному с перезагрузкой; продаваемые пределы\n(maxmemory/maxclients) поднимаются, когда все узлы на новых ресурсах."},"ChangeValkeyTopologyRequest":{"properties":{"topology":{"type":"string","title":"Topology"}},"type":"object","required":["topology"],"title":"ChangeValkeyTopologyRequest","description":"Смена топологии: single ↔ ha. Рост — без простоя (реплика присоединяется\nк живому инстансу, появляется read-endpoint), сжатие — с переключением\nпервичного, если он сидит на выводимой реплике; read-endpoint исчезает."},"CreatePgBackupRequest":{"properties":{"label":{"type":"string","maxLength":255,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"CreatePgBackupRequest"},"CreatePgClusterRequest":{"properties":{"name":{"type":"string","maxLength":63,"minLength":1,"title":"Name"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"pg_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pg Version"},"plan_id":{"type":"string","title":"Plan Id"},"topology":{"type":"string","title":"Topology","default":"single"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"database":{"type":"string","title":"Database","default":"app"},"db_user":{"type":"string","title":"Db User","default":"app"},"restore_from":{"anyOf":[{"$ref":"#/components/schemas/PgRestoreFromRequest"},{"type":"null"}]}},"type":"object","required":["name","plan_id"],"title":"CreatePgClusterRequest"},"CreateValkeyClusterRequest":{"properties":{"name":{"type":"string","maxLength":63,"minLength":1,"title":"Name"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"valkey_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valkey Version"},"plan_id":{"type":"string","title":"Plan Id"},"topology":{"type":"string","title":"Topology","default":"single"},"eviction_policy":{"type":"string","title":"Eviction Policy","default":"allkeys-lru"},"persistence":{"type":"string","title":"Persistence","default":"none"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"}},"type":"object","required":["name","plan_id"],"title":"CreateValkeyClusterRequest"},"DeleteAccepted":{"properties":{"status":{"type":"string","title":"Status","description":"Lifecycle state the resource was moved to, e.g. \"deleting\""}},"type":"object","required":["status"],"title":"DeleteAccepted","description":"The body of a 202 delete: the row is marked and a region tears the\nresource down over the next minutes.\n\nOne shape for every asynchronous delete in /v1. It was defined twice (in the\nKubernetes and load-balancer modules) while four other 202 deletes declared\nno model at all and returned this exact object anyway — so a generated\nclient got an untyped blob for half of them."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LBCertificateResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"source":{"type":"string","title":"Source","default":"uploaded"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"status":{"type":"string","title":"Status","default":"active"},"not_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not After"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"in_use":{"type":"boolean","title":"In Use","default":false},"used_by":{"items":{"$ref":"#/components/schemas/LBCertificateUsage"},"type":"array","title":"Used By"}},"type":"object","required":["id","name"],"title":"LBCertificateResponse"},"LBCertificateUsage":{"properties":{"lb_id":{"type":"string","title":"Lb Id"},"port":{"type":"integer","title":"Port"}},"type":"object","required":["lb_id","port"],"title":"LBCertificateUsage","description":"One listener still using a certificate — payload of the 409 on delete."},"LBConfigResponse":{"properties":{"target_groups":{"items":{"$ref":"#/components/schemas/LBTargetGroupResponse"},"type":"array","title":"Target Groups"},"listeners":{"items":{"$ref":"#/components/schemas/LBListenerResponse"},"type":"array","title":"Listeners"}},"type":"object","title":"LBConfigResponse"},"LBConfigSpec":{"properties":{"target_groups":{"items":{"$ref":"#/components/schemas/LBTargetGroupSpec"},"type":"array","maxItems":32,"title":"Target Groups"},"listeners":{"items":{"$ref":"#/components/schemas/LBListenerSpec"},"type":"array","maxItems":16,"title":"Listeners"}},"type":"object","title":"LBConfigSpec"},"LBFixedResponseSpec":{"properties":{"status_code":{"type":"integer","maximum":599.0,"minimum":200.0,"title":"Status Code"},"content_type":{"type":"string","title":"Content Type","default":"text/plain"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"}},"type":"object","required":["status_code"],"title":"LBFixedResponseSpec"},"LBHealthCheckSpec":{"properties":{"mode":{"type":"string","enum":["none","tcp","http"],"title":"Mode","default":"tcp"},"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"path":{"type":"string","title":"Path","default":"/"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"expect_status":{"type":"string","title":"Expect Status","default":"200-399"},"interval_seconds":{"type":"integer","maximum":300.0,"minimum":3.0,"title":"Interval Seconds","default":10},"timeout_seconds":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Timeout Seconds","default":5},"healthy_threshold":{"type":"integer","maximum":10.0,"minimum":2.0,"title":"Healthy Threshold","default":2},"unhealthy_threshold":{"type":"integer","maximum":10.0,"minimum":2.0,"title":"Unhealthy Threshold","default":3}},"type":"object","title":"LBHealthCheckSpec"},"LBListenerCertificatesPutRequest":{"properties":{"certificate_ids":{"items":{"type":"string"},"type":"array","maxItems":16,"minItems":1,"title":"Certificate Ids"},"default_certificate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Certificate Id"}},"additionalProperties":false,"type":"object","required":["certificate_ids"],"title":"LBListenerCertificatesPutRequest"},"LBListenerPatchRequest":{"properties":{"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"accept_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accept Proxy"},"http2":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Http2"},"tls_min_version":{"anyOf":[{"type":"string","enum":["TLSv1.2","TLSv1.3"]},{"type":"null"}],"title":"Tls Min Version"},"tls_policy":{"anyOf":[{"type":"string","enum":["intermediate","modern"]},{"type":"null"}],"title":"Tls Policy"},"client_timeout_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":5.0},{"type":"null"}],"title":"Client Timeout Seconds"},"default_action":{"anyOf":[{"$ref":"#/components/schemas/LBRuleAction"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"LBListenerPatchRequest"},"LBListenerResponse":{"properties":{"id":{"type":"string","title":"Id"},"port":{"type":"integer","title":"Port"},"protocol":{"type":"string","title":"Protocol"},"managed_by":{"type":"string","title":"Managed By","default":"user"},"accept_proxy":{"type":"boolean","title":"Accept Proxy","default":false},"http2":{"type":"boolean","title":"Http2","default":false},"tls_min_version":{"type":"string","title":"Tls Min Version","default":"TLSv1.2"},"tls_policy":{"type":"string","title":"Tls Policy","default":"intermediate"},"client_timeout_seconds":{"type":"integer","title":"Client Timeout Seconds","default":60},"certificate_ids":{"items":{"type":"string"},"type":"array","title":"Certificate Ids"},"default_certificate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Certificate Id"},"default_action":{"anyOf":[{"$ref":"#/components/schemas/LBRuleAction"},{"type":"null"}]},"rules":{"items":{"$ref":"#/components/schemas/LBListenerRuleResponse"},"type":"array","title":"Rules"},"state":{"$ref":"#/components/schemas/LBListenerStateResponse"}},"type":"object","required":["id","port","protocol"],"title":"LBListenerResponse"},"LBListenerRuleResponse":{"properties":{"id":{"type":"string","title":"Id"},"priority":{"type":"integer","title":"Priority"},"conditions":{"$ref":"#/components/schemas/LBRuleConditionsSpec"},"action":{"$ref":"#/components/schemas/LBRuleAction"}},"type":"object","required":["id","priority","conditions","action"],"title":"LBListenerRuleResponse"},"LBListenerRuleSpec":{"properties":{"priority":{"type":"integer","maximum":50000.0,"minimum":1.0,"title":"Priority"},"conditions":{"$ref":"#/components/schemas/LBRuleConditionsSpec"},"action":{"$ref":"#/components/schemas/LBRuleAction"}},"type":"object","required":["priority","conditions","action"],"title":"LBListenerRuleSpec"},"LBListenerSpec":{"properties":{"port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Port"},"protocol":{"type":"string","enum":["http","https","tcp"],"title":"Protocol"},"certificate_ids":{"items":{"type":"string"},"type":"array","maxItems":16,"title":"Certificate Ids"},"default_certificate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Certificate Id"},"accept_proxy":{"type":"boolean","title":"Accept Proxy","default":false},"http2":{"type":"boolean","title":"Http2","default":true},"tls_min_version":{"type":"string","enum":["TLSv1.2","TLSv1.3"],"title":"Tls Min Version","default":"TLSv1.2"},"tls_policy":{"type":"string","enum":["intermediate","modern"],"title":"Tls Policy","default":"intermediate"},"client_timeout_seconds":{"type":"integer","maximum":3600.0,"minimum":5.0,"title":"Client Timeout Seconds","default":60},"default_action":{"$ref":"#/components/schemas/LBRuleAction"},"rules":{"items":{"$ref":"#/components/schemas/LBListenerRuleSpec"},"type":"array","maxItems":100,"title":"Rules"}},"type":"object","required":["port","protocol","default_action"],"title":"LBListenerSpec"},"LBListenerStateResponse":{"properties":{"phase":{"type":"string","title":"Phase","default":"pending"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At"}},"type":"object","title":"LBListenerStateResponse","description":"From region-owned lb_listener_state; no row → 'pending'."},"LBNodeResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status","default":"booting"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"}},"type":"object","required":["id"],"title":"LBNodeResponse"},"LBRedirectSpec":{"properties":{"scheme":{"anyOf":[{"type":"string","enum":["http","https"]},{"type":"null"}],"title":"Scheme"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"keep_query":{"type":"boolean","title":"Keep Query","default":true},"status_code":{"type":"integer","enum":[301,302,303,307,308],"title":"Status Code","default":301}},"type":"object","title":"LBRedirectSpec"},"LBRuleAction":{"properties":{"type":{"type":"string","enum":["forward","redirect","fixed_response"],"title":"Type"},"target_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Group"},"redirect":{"anyOf":[{"$ref":"#/components/schemas/LBRedirectSpec"},{"type":"null"}]},"fixed_response":{"anyOf":[{"$ref":"#/components/schemas/LBFixedResponseSpec"},{"type":"null"}]}},"type":"object","required":["type"],"title":"LBRuleAction"},"LBRuleConditionsSpec":{"properties":{"host_patterns":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Host Patterns"},"path_patterns":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Path Patterns"},"source_cidrs":{"items":{"type":"string"},"type":"array","maxItems":16,"title":"Source Cidrs"}},"type":"object","title":"LBRuleConditionsSpec"},"LBRulePatchRequest":{"properties":{"priority":{"anyOf":[{"type":"integer","maximum":50000.0,"minimum":1.0},{"type":"null"}],"title":"Priority"},"conditions":{"anyOf":[{"$ref":"#/components/schemas/LBRuleConditionsSpec"},{"type":"null"}]},"action":{"anyOf":[{"$ref":"#/components/schemas/LBRuleAction"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"LBRulePatchRequest"},"LBRulesPutRequest":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/LBListenerRuleSpec"},"type":"array","maxItems":100,"title":"Rules"}},"additionalProperties":false,"type":"object","title":"LBRulesPutRequest"},"LBStickinessSpec":{"properties":{"type":{"type":"string","enum":["none","cookie","source_ip"],"title":"Type","default":"none"},"cookie_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cookie Name"},"duration_seconds":{"type":"integer","maximum":86400.0,"minimum":60.0,"title":"Duration Seconds","default":3600}},"type":"object","title":"LBStickinessSpec"},"LBTargetGroupPatchRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"balance":{"anyOf":[{"type":"string","enum":["roundrobin","leastconn","source","random"]},{"type":"null"}],"title":"Balance"},"health_check":{"anyOf":[{"$ref":"#/components/schemas/LBHealthCheckSpec"},{"type":"null"}]},"stickiness":{"anyOf":[{"$ref":"#/components/schemas/LBStickinessSpec"},{"type":"null"}]},"send_proxy":{"anyOf":[{"type":"string","enum":["none","v1","v2"]},{"type":"null"}],"title":"Send Proxy"},"server_timeout_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":5.0},{"type":"null"}],"title":"Server Timeout Seconds"},"tunnel_timeout_seconds":{"anyOf":[{"type":"integer","maximum":86400.0,"minimum":30.0},{"type":"null"}],"title":"Tunnel Timeout Seconds"},"slow_start_seconds":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Slow Start Seconds"},"deregistration_delay_seconds":{"anyOf":[{"type":"integer","maximum":300.0,"minimum":0.0},{"type":"null"}],"title":"Deregistration Delay Seconds"}},"additionalProperties":false,"type":"object","title":"LBTargetGroupPatchRequest"},"LBTargetGroupResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"managed_by":{"type":"string","title":"Managed By","default":"user"},"target_type":{"type":"string","title":"Target Type"},"protocol":{"type":"string","title":"Protocol"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"balance":{"type":"string","title":"Balance","default":"roundrobin"},"health_check":{"$ref":"#/components/schemas/LBHealthCheckSpec"},"stickiness":{"$ref":"#/components/schemas/LBStickinessSpec"},"send_proxy":{"type":"string","title":"Send Proxy","default":"none"},"server_timeout_seconds":{"type":"integer","title":"Server Timeout Seconds","default":60},"tunnel_timeout_seconds":{"type":"integer","title":"Tunnel Timeout Seconds","default":3600},"slow_start_seconds":{"type":"integer","title":"Slow Start Seconds","default":0},"deregistration_delay_seconds":{"type":"integer","title":"Deregistration Delay Seconds","default":30},"targets":{"items":{"$ref":"#/components/schemas/LBTargetResponse"},"type":"array","title":"Targets"}},"type":"object","required":["id","name","target_type","protocol"],"title":"LBTargetGroupResponse"},"LBTargetGroupSpec":{"properties":{"name":{"type":"string","title":"Name"},"target_type":{"type":"string","enum":["vm","ip","app"],"title":"Target Type"},"protocol":{"type":"string","enum":["http","https","tcp"],"title":"Protocol"},"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"balance":{"type":"string","enum":["roundrobin","leastconn","source","random"],"title":"Balance","default":"roundrobin"},"health_check":{"$ref":"#/components/schemas/LBHealthCheckSpec"},"stickiness":{"$ref":"#/components/schemas/LBStickinessSpec"},"send_proxy":{"type":"string","enum":["none","v1","v2"],"title":"Send Proxy","default":"none"},"server_timeout_seconds":{"type":"integer","maximum":3600.0,"minimum":5.0,"title":"Server Timeout Seconds","default":60},"tunnel_timeout_seconds":{"type":"integer","maximum":86400.0,"minimum":30.0,"title":"Tunnel Timeout Seconds","default":3600},"slow_start_seconds":{"type":"integer","maximum":300.0,"minimum":0.0,"title":"Slow Start Seconds","default":0},"deregistration_delay_seconds":{"type":"integer","maximum":300.0,"minimum":0.0,"title":"Deregistration Delay Seconds","default":30},"targets":{"items":{"$ref":"#/components/schemas/LBTargetSpec"},"type":"array","maxItems":256,"title":"Targets"}},"type":"object","required":["name","target_type","protocol"],"title":"LBTargetGroupSpec"},"LBTargetResponse":{"properties":{"id":{"type":"string","title":"Id"},"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"vm_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Name"},"target_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Ip"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"weight":{"type":"integer","title":"Weight","default":1},"draining_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Draining Since"},"health":{"type":"string","title":"Health","default":"unknown"},"health_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Detail"}},"type":"object","required":["id"],"title":"LBTargetResponse"},"LBTargetSpec":{"properties":{"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"target_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Ip"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"port":{"anyOf":[{"type":"integer","maximum":65535.0,"minimum":1.0},{"type":"null"}],"title":"Port"},"weight":{"type":"integer","maximum":256.0,"minimum":0.0,"title":"Weight","default":1}},"type":"object","title":"LBTargetSpec"},"LBTargetsPutRequest":{"properties":{"targets":{"items":{"$ref":"#/components/schemas/LBTargetSpec"},"type":"array","maxItems":256,"title":"Targets"}},"additionalProperties":false,"type":"object","title":"LBTargetsPutRequest"},"LoadBalancerDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"project_id":{"type":"string","title":"Project Id"},"region_id":{"type":"string","title":"Region Id"},"vpc_id":{"type":"string","title":"Vpc Id"},"vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vip"},"node_count":{"type":"integer","title":"Node Count"},"mode":{"type":"string","title":"Mode","default":"vpc"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"region_observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Region Observed At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"config":{"$ref":"#/components/schemas/LBConfigResponse"},"nodes":{"items":{"$ref":"#/components/schemas/LBNodeResponse"},"type":"array","title":"Nodes"}},"type":"object","required":["id","name","project_id","region_id","vpc_id","node_count","status"],"title":"LoadBalancerDetailResponse"},"LoadBalancerResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"project_id":{"type":"string","title":"Project Id"},"region_id":{"type":"string","title":"Region Id"},"vpc_id":{"type":"string","title":"Vpc Id"},"vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vip"},"node_count":{"type":"integer","title":"Node Count"},"mode":{"type":"string","title":"Mode","default":"vpc"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"region_observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Region Observed At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","project_id","region_id","vpc_id","node_count","status"],"title":"LoadBalancerResponse"},"Page_AppJobResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AppJobResponse"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[AppJobResponse]"},"Page_AppJobRunResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AppJobRunResponse"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[AppJobRunResponse]"},"Page_LoadBalancerResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/LoadBalancerResponse"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[LoadBalancerResponse]"},"Page_PgClusterResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PgClusterResponse"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[PgClusterResponse]"},"Page_V1AccessKey_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1AccessKey"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1AccessKey]"},"Page_V1AppDomain_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1AppDomain"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1AppDomain]"},"Page_V1App_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1App"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1App]"},"Page_V1Backup_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Backup"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Backup]"},"Page_V1Bucket_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Bucket"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Bucket]"},"Page_V1Build_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Build"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Build]"},"Page_V1Certificate_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Certificate"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Certificate]"},"Page_V1DNSRecord_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1DNSRecord"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1DNSRecord]"},"Page_V1EnvVar_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1EnvVar"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1EnvVar]"},"Page_V1FloatingIP_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1FloatingIP"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1FloatingIP]"},"Page_V1Function_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Function"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Function]"},"Page_V1K8sCluster_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1K8sCluster"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1K8sCluster]"},"Page_V1Project_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Project"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Project]"},"Page_V1RegisteredDomain_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1RegisteredDomain"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1RegisteredDomain]"},"Page_V1SshKey_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1SshKey"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1SshKey]"},"Page_V1VM_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1VM"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1VM]"},"Page_V1Volume_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Volume"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Volume]"},"Page_V1Vpc_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Vpc"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Vpc]"},"Page_V1Zone_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/V1Zone"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[V1Zone]"},"Page_ValkeyClusterResponse_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ValkeyClusterResponse"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["data","limit","offset","count"],"title":"Page[ValkeyClusterResponse]"},"PgBackupResponse":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"backup_type":{"type":"string","title":"Backup Type"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"pgbackrest_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pgbackrest Label"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","kind","backup_type","label","status"],"title":"PgBackupResponse"},"PgBackupsListResponse":{"properties":{"backups":{"items":{"$ref":"#/components/schemas/PgBackupResponse"},"type":"array","title":"Backups"},"pitr_window":{"$ref":"#/components/schemas/PgPitrWindowResponse"},"repo_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repo Bytes"},"retention_days":{"type":"integer","title":"Retention Days"}},"type":"object","required":["backups","pitr_window","retention_days"],"title":"PgBackupsListResponse"},"PgCaResponse":{"properties":{"ready":{"type":"boolean","title":"Ready"},"ca_pem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ca Pem"}},"type":"object","required":["ready"],"title":"PgCaResponse","description":"CA кластера в PEM. ``ready=False`` — регион его ещё не выпустил."},"PgClusterCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"pg_version":{"type":"string","title":"Pg Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/PgPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"type":"integer","title":"Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Name"},"vpc_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Name"},"endpoint_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Ip"},"endpoint_dns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Dns"},"vpc_vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Vip"},"read_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read Host"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"access_mode":{"type":"string","title":"Access Mode","default":"public"},"databases":{"items":{"$ref":"#/components/schemas/PgDatabaseResponse"},"type":"array","title":"Databases"},"roles":{"items":{"$ref":"#/components/schemas/PgRoleResponse"},"type":"array","title":"Roles"},"nodes":{"items":{"$ref":"#/components/schemas/PgNodeResponse"},"type":"array","title":"Nodes"},"ca_available":{"type":"boolean","title":"Ca Available","default":false},"backups_enabled":{"type":"boolean","title":"Backups Enabled","default":false},"wal_archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Wal Archived At"},"parameters":{"additionalProperties":{"type":"string"},"type":"object","title":"Parameters"},"parameters_applied":{"type":"boolean","title":"Parameters Applied","default":false},"pending_restart":{"type":"boolean","title":"Pending Restart","default":false},"plan_change_pending":{"type":"boolean","title":"Plan Change Pending","default":false},"topology_change_pending":{"type":"boolean","title":"Topology Change Pending","default":false},"replace_pending":{"type":"boolean","title":"Replace Pending","default":false},"nodes_outdated":{"type":"integer","title":"Nodes Outdated","default":0},"role_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Password"}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","pg_version","topology","node_count","status","port"],"title":"PgClusterCreatedResponse","description":"Ответ на СОЗДАНИЕ кластера: единственное место, где виден пароль.\n\nОтдельный тип, а не поле в общем ответе, — чтобы «показывается один раз»\nбыло свойством контракта, а не договорённостью. В обычной карточке поля\nнет вовсе: пароль лежит в keystore, api его не хранит и прочитать не может."},"PgClusterDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"pg_version":{"type":"string","title":"Pg Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/PgPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"type":"integer","title":"Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Name"},"vpc_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Name"},"endpoint_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Ip"},"endpoint_dns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Dns"},"vpc_vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Vip"},"read_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read Host"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"access_mode":{"type":"string","title":"Access Mode","default":"public"},"databases":{"items":{"$ref":"#/components/schemas/PgDatabaseResponse"},"type":"array","title":"Databases"},"roles":{"items":{"$ref":"#/components/schemas/PgRoleResponse"},"type":"array","title":"Roles"},"nodes":{"items":{"$ref":"#/components/schemas/PgNodeResponse"},"type":"array","title":"Nodes"},"ca_available":{"type":"boolean","title":"Ca Available","default":false},"backups_enabled":{"type":"boolean","title":"Backups Enabled","default":false},"wal_archived_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Wal Archived At"},"parameters":{"additionalProperties":{"type":"string"},"type":"object","title":"Parameters"},"parameters_applied":{"type":"boolean","title":"Parameters Applied","default":false},"pending_restart":{"type":"boolean","title":"Pending Restart","default":false},"plan_change_pending":{"type":"boolean","title":"Plan Change Pending","default":false},"topology_change_pending":{"type":"boolean","title":"Topology Change Pending","default":false},"replace_pending":{"type":"boolean","title":"Replace Pending","default":false},"nodes_outdated":{"type":"integer","title":"Nodes Outdated","default":0}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","pg_version","topology","node_count","status","port"],"title":"PgClusterDetailResponse"},"PgClusterResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"pg_version":{"type":"string","title":"Pg Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/PgPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"type":"integer","title":"Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","pg_version","topology","node_count","status","port"],"title":"PgClusterResponse"},"PgDatabaseResponse":{"properties":{"name":{"type":"string","title":"Name"},"owner_role":{"type":"string","title":"Owner Role"},"encoding":{"type":"string","title":"Encoding"},"lc_collate":{"type":"string","title":"Lc Collate"}},"type":"object","required":["name","owner_role","encoding","lc_collate"],"title":"PgDatabaseResponse"},"PgNodeResponse":{"properties":{"id":{"type":"string","title":"Id"},"ordinal":{"type":"integer","title":"Ordinal"},"removing":{"type":"boolean","title":"Removing","default":false},"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"intended_role":{"type":"string","title":"Intended Role"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"patroni_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Patroni Role"},"replication_lag_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replication Lag Bytes"},"generation":{"type":"integer","title":"Generation","default":0},"image_outdated":{"type":"boolean","title":"Image Outdated","default":false},"image_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Name"},"replacing":{"type":"boolean","title":"Replacing","default":false}},"type":"object","required":["id","ordinal","intended_role"],"title":"PgNodeResponse"},"PgParameterSpecResponse":{"properties":{"name":{"type":"string","title":"Name"},"group":{"type":"string","title":"Group"},"type":{"type":"string","title":"Type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"restart":{"type":"boolean","title":"Restart","default":false},"default":{"type":"string","title":"Default","default":""},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name","group","type"],"title":"PgParameterSpecResponse","description":"Одна строка каталога с пределами, уже посчитанными под тариф узла."},"PgParametersResponse":{"properties":{"parameters":{"additionalProperties":{"type":"string"},"type":"object","title":"Parameters"},"applied_parameters":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Applied Parameters"},"applied":{"type":"boolean","title":"Applied","default":false},"pending_restart":{"type":"boolean","title":"Pending Restart","default":false},"restart_requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Restart Requested At"},"restarted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Restarted At"},"restart_pending_ack":{"type":"boolean","title":"Restart Pending Ack","default":false},"catalog":{"items":{"$ref":"#/components/schemas/PgParameterSpecResponse"},"type":"array","title":"Catalog"}},"type":"object","title":"PgParametersResponse"},"PgPitrWindowResponse":{"properties":{"from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"},"to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},"type":"object","title":"PgPitrWindowResponse","description":"Окно PITR: от старейшего завершённого снимка до последнего\nзаархивированного WAL. Любая граница None = окна нет."},"PgPlanResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"vcpu":{"type":"integer","title":"Vcpu"},"mem":{"type":"integer","title":"Mem"},"disk_size":{"type":"integer","title":"Disk Size"},"price_per_month":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Month"},"price_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Hour"}},"type":"object","required":["id","name","vcpu","mem","disk_size"],"title":"PgPlanResponse","description":"Тариф узла базы. Диск входит в тариф, цена — за ОДИН узел."},"PgRegionResponse":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"name":{"type":"string","title":"Name"},"is_default":{"type":"boolean","title":"Is Default","default":false},"pg_versions":{"items":{"type":"string"},"type":"array","title":"Pg Versions","default":[]},"default_pg_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Pg Version"}},"type":"object","required":["cluster_id","name"],"title":"PgRegionResponse","description":"Регион + версии PostgreSQL, у которых в нём есть готовый образ узла\n(каталог образов, миграция 00218): версия предлагается только там, где\nеё сборка разложена на все активные ноды."},"PgRegionsListResponse":{"properties":{"regions":{"items":{"$ref":"#/components/schemas/PgRegionResponse"},"type":"array","title":"Regions"},"pg_versions":{"items":{"type":"string"},"type":"array","title":"Pg Versions"},"default_pg_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Pg Version"},"plans":{"items":{"$ref":"#/components/schemas/PgPlanResponse"},"type":"array","title":"Plans"},"topologies":{"items":{"$ref":"#/components/schemas/PgTopologyResponse"},"type":"array","title":"Topologies"},"public_ip_price_per_month":{"type":"number","title":"Public Ip Price Per Month","default":0.0}},"type":"object","required":["regions","pg_versions","plans","topologies"],"title":"PgRegionsListResponse","description":"Регионы, где включён managed Postgres, и всё, из чего собирается мастер.\nВерхнеуровневые ``pg_versions``/``default_pg_version`` — объединение по\nрегионам (legacy-читатели); пер-регион — в ``regions[]``."},"PgReplaceNodesResponse":{"properties":{"requested":{"type":"integer","title":"Requested"}},"type":"object","required":["requested"],"title":"PgReplaceNodesResponse","description":"Ответ ручек замены: сколько узлов получили намерение «заменить»."},"PgRestoreFromRequest":{"properties":{"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"repo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo Id"},"backup_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Id"},"target_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Target Time"}},"type":"object","title":"PgRestoreFromRequest","description":"Откуда поднять новый кластер (фаза 4: restore ВСЕГДА в новый кластер).\n\nИсточник — кластер либо его репозиторий бэкапов напрямую: репозиторий\nпереживает снос кластера на 14 дней, и за это время восстановиться из\nнего можно, хотя строки кластера уже нет. Точка: ``backup_id`` (на момент\nснимка) либо ``target_time`` (PITR, любой момент в окне WAL-архива); ни\nтого ни другого — последний снимок."},"PgRolePasswordResetResponse":{"properties":{"role":{"type":"string","title":"Role"},"password":{"type":"string","title":"Password"},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","required":["role","password"],"title":"PgRolePasswordResetResponse","description":"Новый пароль роли — снова единственный раз, когда он виден.\n\n`applied=False` — регион ещё не выполнил `ALTER ROLE` на узле: до этого\nмомента база принимает СТАРЫЙ пароль. Врать здесь нельзя, иначе клиент\nрешит, что старый уже не работает, и потеряет доступ на ровном месте."},"PgRoleResponse":{"properties":{"name":{"type":"string","title":"Name"},"can_login":{"type":"boolean","title":"Can Login"}},"type":"object","required":["name","can_login"],"title":"PgRoleResponse"},"PgTopologyResponse":{"properties":{"id":{"type":"string","title":"Id"},"nodes":{"type":"integer","title":"Nodes"}},"type":"object","required":["id","nodes"],"title":"PgTopologyResponse","description":"Топология и число узлов, на которое умножается цена тарифа."},"UpdatePgAllowlistRequest":{"properties":{"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"}},"type":"object","required":["ip_allowlist"],"title":"UpdatePgAllowlistRequest"},"UpdatePgParametersRequest":{"properties":{"parameters":{"additionalProperties":{"type":"string"},"type":"object","title":"Parameters"}},"type":"object","title":"UpdatePgParametersRequest","description":"Полная замена набора переопределений: чего нет в запросе — снимается\n(регион обнулит в DCS). Значения — строки в синтаксисе Postgres; числа и\nбулевы приводятся к строке до проверки каталогом."},"UpdateValkeyAllowlistRequest":{"properties":{"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"}},"type":"object","required":["ip_allowlist"],"title":"UpdateValkeyAllowlistRequest"},"UpdateValkeyParamsRequest":{"properties":{"eviction_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eviction Policy"},"persistence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persistence"}},"type":"object","title":"UpdateValkeyParamsRequest","description":"Смена параметров живого кластера. None = не менять.\n\nЗдесь только намерение — регион доводит его до сервера CONFIG SET'ом,\n``config_etag`` в наблюдении покажет, доехало ли."},"V1AccessKey":{"properties":{"id":{"type":"string","title":"Id"},"access_key_id":{"type":"string","title":"Access Key Id","description":"The AWS_ACCESS_KEY_ID to configure in an S3 client"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status","description":"provisioning | active | disabled | error"},"all_buckets":{"type":"boolean","title":"All Buckets","description":"True when the key reaches every bucket of the account, present and future"},"buckets":{"items":{"$ref":"#/components/schemas/V1BucketRef"},"type":"array","title":"Buckets","description":"The buckets this key is limited to; empty when all_buckets"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","access_key_id","name","status","all_buckets"],"title":"V1AccessKey"},"V1AccessKeyCreate":{"properties":{"all_buckets":{"type":"boolean","title":"All Buckets","description":"Grant every bucket of the account"},"bucket_ids":{"items":{"type":"string"},"type":"array","title":"Bucket Ids","description":"Buckets to grant when all_buckets is false; replaces the current set"},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Label shown in the dashboard"}},"type":"object","required":["all_buckets","name"],"title":"V1AccessKeyCreate"},"V1AccessKeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"access_key_id":{"type":"string","title":"Access Key Id","description":"The AWS_ACCESS_KEY_ID to configure in an S3 client"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status","description":"provisioning | active | disabled | error"},"all_buckets":{"type":"boolean","title":"All Buckets","description":"True when the key reaches every bucket of the account, present and future"},"buckets":{"items":{"$ref":"#/components/schemas/V1BucketRef"},"type":"array","title":"Buckets","description":"The buckets this key is limited to; empty when all_buckets"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"secret_access_key":{"type":"string","title":"Secret Access Key","description":"Returned exactly once — only a hash is stored. Cannot be retrieved again"}},"type":"object","required":["id","access_key_id","name","status","all_buckets","secret_access_key"],"title":"V1AccessKeyCreated"},"V1AccessKeyScope":{"properties":{"all_buckets":{"type":"boolean","title":"All Buckets","description":"Grant every bucket of the account"},"bucket_ids":{"items":{"type":"string"},"type":"array","title":"Bucket Ids","description":"Buckets to grant when all_buckets is false; replaces the current set"}},"type":"object","required":["all_buckets"],"title":"V1AccessKeyScope"},"V1App":{"properties":{"id":{"type":"string","title":"Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"source_type":{"type":"string","title":"Source Type","default":"git"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"git_provider":{"type":"string","title":"Git Provider","default":"github"},"repo_full_name":{"type":"string","title":"Repo Full Name","default":""},"branch":{"type":"string","title":"Branch","default":"main"},"source_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Error"},"status":{"type":"string","title":"Status"},"app_type":{"type":"string","title":"App Type","default":"frontend"},"runtime_type":{"type":"string","title":"Runtime Type","default":"firecracker"},"replica_count":{"type":"integer","title":"Replica Count","default":0},"replica_vcpu":{"type":"integer","title":"Replica Vcpu","default":1},"replica_memory_mb":{"type":"integer","title":"Replica Memory Mb","default":512},"auto_deploy":{"type":"boolean","title":"Auto Deploy","default":true},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"readiness_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readiness Path"},"predeploy_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predeploy Command"},"current_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Build Id"},"deploy_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deploy State"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","project_id","name","status"],"title":"V1App"},"V1AppCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"source_type":{"type":"string","title":"Source Type","default":"git"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"git_provider":{"type":"string","title":"Git Provider","default":"github"},"git_connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Connection Id"},"github_installation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Installation Id"},"gitlab_connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gitlab Connection Id"},"repo_full_name":{"type":"string","title":"Repo Full Name","default":""},"repo_id":{"type":"integer","title":"Repo Id","default":0},"branch":{"type":"string","maxLength":255,"title":"Branch","default":"main"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"nodejs_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nodejs Version"},"app_type":{"type":"string","title":"App Type","default":"frontend"},"runtime_type":{"type":"string","title":"Runtime Type","default":"firecracker"},"replica_count":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Replica Count","default":0},"auto_deploy":{"type":"boolean","title":"Auto Deploy","default":true},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"},"install_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Install Command"},"build_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Command"},"output_directory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Directory"},"root_directory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Root Directory"},"start_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Command"},"readiness_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readiness Path"},"predeploy_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predeploy Command"},"replica_vcpu":{"anyOf":[{"type":"integer","maximum":8.0,"minimum":1.0},{"type":"null"}],"title":"Replica Vcpu"},"replica_memory_mb":{"anyOf":[{"type":"integer","maximum":8192.0,"minimum":256.0},{"type":"null"}],"title":"Replica Memory Mb"}},"type":"object","required":["name"],"title":"V1AppCreate","description":"Create an app. Exposes the commonly-needed fields; the rest take the\nsame service-side defaults as the dashboard create path."},"V1AppDeployResult":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"site_id":{"type":"string","title":"Site Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","app_id","site_id","status"],"title":"V1AppDeployResult"},"V1AppDomain":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"domain":{"type":"string","title":"Domain"},"type":{"type":"string","title":"Type","default":"current"},"status":{"type":"string","title":"Status"},"certificate_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Certificate Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"dns_configured":{"type":"boolean","title":"Dns Configured","default":false},"target_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Ip"},"is_default":{"type":"boolean","title":"Is Default","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","app_id","domain","status"],"title":"V1AppDomain"},"V1AppUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"replica_count":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":0.0},{"type":"null"}],"title":"Replica Count"},"replica_vcpu":{"anyOf":[{"type":"integer","maximum":8.0,"minimum":1.0},{"type":"null"}],"title":"Replica Vcpu"},"replica_memory_mb":{"anyOf":[{"type":"integer","maximum":8192.0,"minimum":256.0},{"type":"null"}],"title":"Replica Memory Mb"},"readiness_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readiness Path"},"predeploy_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predeploy Command"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image","description":"Image of an app whose source_type is docker_image, e.g. ghcr.io/org/app:<sha>. Takes effect on the next deploy; 422 on other source types. null is ignored."}},"additionalProperties":false,"type":"object","title":"V1AppUpdate"},"V1Backup":{"properties":{"id":{"type":"string","title":"Id"},"vm_id":{"type":"string","title":"Vm Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status"},"type":{"type":"string","title":"Type"},"parent_backup_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Backup Id"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","vm_id","name","status","type"],"title":"V1Backup"},"V1BackupCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Backup name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional backup description"}},"type":"object","required":["name"],"title":"V1BackupCreate"},"V1Balance":{"properties":{"currency":{"type":"string","title":"Currency","description":"ISO 4217 code; the account is billed in RUB"},"balance":{"type":"string","title":"Balance","description":"Money paid in and not yet spent. A decimal string, not a float; negative means debt"},"credits":{"type":"string","title":"Credits","description":"Bonus balance (promo codes, referral grants)"},"credits_unlocked":{"type":"boolean","title":"Credits Unlocked","description":"Bonuses count towards payment only after the account's first real top-up; false means `credits` cannot be spent yet"},"available":{"type":"string","title":"Available","description":"What paid resources can be bought with right now: `balance`, plus `credits` when they are unlocked"},"real_topup_min":{"type":"string","title":"Real Topup Min","description":"Smallest real top-up that unlocks the bonus balance; \"0\" once it is unlocked"}},"type":"object","required":["currency","balance","credits","credits_unlocked","available","real_topup_min"],"title":"V1Balance"},"V1Bucket":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","description":"Globally unique bucket name — also the name used in S3 clients"},"region":{"type":"string","title":"Region"},"versioning":{"type":"boolean","title":"Versioning"},"is_public":{"type":"boolean","title":"Is Public","description":"Objects are readable anonymously over public_base_url"},"public_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Base Url","description":"Anonymous read prefix; null when the bucket is private"},"quota_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Bytes","description":"Storage cap in bytes; null means the account default"},"status":{"type":"string","title":"Status","description":"creating | active | deleting"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","region","versioning","is_public","status"],"title":"V1Bucket"},"V1BucketCreate":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"title":"Name","description":"3-63 lowercase letters, digits, '.' or '-'; starts and ends alphanumeric. Globally unique across the platform"},"versioning":{"type":"boolean","title":"Versioning","description":"Keep previous versions of overwritten objects","default":false},"is_public":{"type":"boolean","title":"Is Public","description":"Allow anonymous reads of every object","default":false},"quota_bytes":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Quota Bytes","description":"Storage cap in bytes"}},"type":"object","required":["name"],"title":"V1BucketCreate"},"V1BucketRef":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"V1BucketRef"},"V1BucketUpdate":{"properties":{"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public","description":"Toggle anonymous read access"},"versioning":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Versioning","description":"Toggle object versioning"}},"type":"object","title":"V1BucketUpdate"},"V1BucketUsage":{"properties":{"bucket_id":{"type":"string","title":"Bucket Id"},"name":{"type":"string","title":"Name"},"bytes_stored":{"type":"integer","title":"Bytes Stored"},"object_count":{"type":"integer","title":"Object Count"},"quota_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Bytes"},"snapshot_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot At","description":"When the platform last measured this bucket; null if never"}},"type":"object","required":["bucket_id","name","bytes_stored","object_count"],"title":"V1BucketUsage"},"V1Build":{"properties":{"id":{"type":"string","title":"Id"},"app_id":{"type":"string","title":"App Id"},"status":{"type":"string","title":"Status"},"commit_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Sha"},"commit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At"},"deploy_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deploy State"},"boot_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Boot Error"},"source_archive_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Archive Sha256"},"source_archive_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Archive Bytes"}},"type":"object","required":["id","app_id","status"],"title":"V1Build"},"V1Certificate":{"properties":{"id":{"type":"string","title":"Id"},"primary_domain":{"type":"string","title":"Primary Domain"},"domains":{"items":{"type":"string"},"type":"array","title":"Domains"},"status":{"type":"string","title":"Status"},"challenge_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Challenge Type"},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"not_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not After"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","primary_domain","domains","status"],"title":"V1Certificate"},"V1ConnectionInfo":{"properties":{"endpoint":{"type":"string","title":"Endpoint","description":"S3 endpoint URL for any AWS SigV4 client"},"region":{"type":"string","title":"Region"},"path_style_example":{"type":"string","title":"Path Style Example"},"virtual_hosted_example":{"type":"string","title":"Virtual Hosted Example"}},"type":"object","required":["endpoint","region","path_style_example","virtual_hosted_example"],"title":"V1ConnectionInfo"},"V1DNSRecord":{"properties":{"id":{"type":"string","title":"Id"},"zone_id":{"type":"string","title":"Zone Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"content":{"type":"string","title":"Content"},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl"},"managed":{"type":"boolean","title":"Managed","default":false}},"type":"object","required":["id","zone_id","name","type","content"],"title":"V1DNSRecord"},"V1DNSRecordCreate":{"properties":{"name":{"type":"string","title":"Name","example":"www.example.com."},"type":{"type":"string","title":"Type","example":"A"},"content":{"type":"string","title":"Content","example":"192.0.2.10"},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl"}},"type":"object","required":["name","type","content"],"title":"V1DNSRecordCreate"},"V1DNSRecordUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl"}},"type":"object","title":"V1DNSRecordUpdate"},"V1DeployRequest":{"properties":{"commit_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Sha"}},"type":"object","title":"V1DeployRequest"},"V1DomainCreate":{"properties":{"domain":{"type":"string","maxLength":255,"minLength":1,"title":"Domain"},"override_dns":{"type":"boolean","title":"Override Dns","default":false},"skip_certificate":{"type":"boolean","title":"Skip Certificate","default":false}},"type":"object","required":["domain"],"title":"V1DomainCreate"},"V1EnvVar":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"},"is_secret":{"type":"boolean","title":"Is Secret"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","value","is_secret"],"title":"V1EnvVar"},"V1EnvVarCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"value":{"type":"string","minLength":1,"title":"Value"},"is_secret":{"type":"boolean","title":"Is Secret","default":false}},"type":"object","required":["name","value"],"title":"V1EnvVarCreate"},"V1FloatingIP":{"properties":{"id":{"type":"string","title":"Id"},"address":{"type":"string","title":"Address"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"cluster_id":{"type":"string","title":"Cluster Id"},"status":{"type":"string","title":"Status"},"target_kind":{"type":"string","title":"Target Kind","default":"interface"},"auto_release":{"type":"boolean","title":"Auto Release","default":false},"vm_interface_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Interface Id"},"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"vm_project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Project Id"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"internal_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Address"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","address","cluster_id","status"],"title":"V1FloatingIP"},"V1FloatingIPAttach":{"properties":{"vm_interface_id":{"type":"string","title":"Vm Interface Id","description":"VM interface UUID (the VM must live in one of your VPCs)"}},"type":"object","required":["vm_interface_id"],"title":"V1FloatingIPAttach"},"V1FloatingIPCreate":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id","description":"Region (cluster) UUID to allocate the address in"},"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Optional label"}},"type":"object","required":["cluster_id"],"title":"V1FloatingIPCreate"},"V1FloatingIPUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"New label; null clears it"}},"type":"object","title":"V1FloatingIPUpdate"},"V1FolderCreate":{"properties":{"prefix":{"type":"string","minLength":1,"title":"Prefix","description":"Folder prefix; a trailing '/' is added when missing"}},"type":"object","required":["prefix"],"title":"V1FolderCreate"},"V1FolderCreated":{"properties":{"prefix":{"type":"string","title":"Prefix","description":"The normalized prefix that was created, with its trailing '/'"}},"type":"object","required":["prefix"],"title":"V1FolderCreated"},"V1Function":{"properties":{"id":{"type":"string","title":"Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"runtime":{"type":"string","title":"Runtime"},"files":{"additionalProperties":{"type":"string"},"type":"object","title":"Files","default":{}},"handler":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handler"},"status":{"type":"string","title":"Status"},"current_build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Build Id"},"invoke_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoke Url"},"vcpu":{"type":"integer","title":"Vcpu","default":1},"memory_mb":{"type":"integer","title":"Memory Mb","default":256},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","project_id","name","runtime","status"],"title":"V1Function"},"V1FunctionCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"runtime":{"type":"string","title":"Runtime","default":"go"},"files":{"additionalProperties":{"type":"string"},"type":"object","title":"Files"},"handler":{"type":"string","title":"Handler"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"}},"type":"object","required":["name","files","handler"],"title":"V1FunctionCreate"},"V1FunctionDeployResult":{"properties":{"build_id":{"type":"string","title":"Build Id"},"function_id":{"type":"string","title":"Function Id"},"site_id":{"type":"string","title":"Site Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["build_id","function_id","site_id","status"],"title":"V1FunctionDeployResult"},"V1FunctionUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"files":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Files"},"handler":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handler"},"runtime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runtime"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"}},"type":"object","title":"V1FunctionUpdate"},"V1K8sCluster":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"project_id":{"type":"string","title":"Project Id"},"region_id":{"type":"string","title":"Region Id","description":"Region (infra cluster) UUID"},"k8s_version":{"type":"string","title":"K8S Version"},"talos_version":{"type":"string","title":"Talos Version"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"endpoint_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Ip","description":"Public Kubernetes API endpoint IP; null for a private cluster"},"endpoint_port":{"type":"integer","title":"Endpoint Port"},"endpoint_access":{"type":"string","title":"Endpoint Access","description":"API endpoint access: public | public_private | private","default":"public"},"endpoint_dns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Dns","description":"Stable API endpoint name — prefer it over the IP in a kubeconfig. Null for clusters created before named endpoints"},"internal_vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Vip","description":"Internal API endpoint VIP inside the cluster's node network (public_private / private)"},"status":{"type":"string","title":"Status"},"upgrading":{"type":"boolean","title":"Upgrading","description":"A version upgrade is rolling across the nodes","default":false},"node_talos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node Talos Version","description":"Newest Talos OS version actually running on a node (may exceed a legacy talos_version pin)"},"node_pools":{"items":{"$ref":"#/components/schemas/V1K8sNodePool"},"type":"array","title":"Node Pools"}},"type":"object","required":["id","name","project_id","region_id","k8s_version","talos_version","endpoint_port","status"],"title":"V1K8sCluster"},"V1K8sClusterCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Cluster name"},"vm_plan_id":{"type":"string","title":"Vm Plan Id","description":"VM plan UUID used for every node"},"region_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Id","description":"Region (infra cluster) UUID; default region when omitted. A VPC pins the region"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id","description":"Attach the cluster's nodes to this VPC (optional). Requires endpoint_access='private' — the cluster API is then reachable from inside that VPC"},"k8s_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"K8S Version","description":"Kubernetes version; the platform default when omitted (see /v1/kubernetes/regions)"},"talos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Talos Version","description":"Talos OS version for the nodes; the platform default when omitted"},"control_plane_count":{"type":"integer","title":"Control Plane Count","description":"Control-plane nodes: 1, or 3 for a highly-available control plane. Fixed after creation","default":1},"worker_count":{"type":"integer","maximum":50.0,"minimum":0.0,"title":"Worker Count","description":"Worker nodes (scalable later via the node-pool scale endpoint)","default":2},"worker_disk_size_gb":{"anyOf":[{"type":"integer","maximum":4000.0,"minimum":10.0},{"type":"null"}],"title":"Worker Disk Size Gb","description":"Per-worker disk override in GB (plan default when omitted)"},"endpoint_access":{"type":"string","title":"Endpoint Access","description":"API endpoint access: public (public VIP only), public_private (public VIP + an internal VIP in the cluster network), private (internal VIP only — no address on the internet). With vpc_id only 'private' is accepted: a public endpoint is served from the region router, which has no route into your VPC","default":"public"}},"type":"object","required":["name","vm_plan_id"],"title":"V1K8sClusterCreate"},"V1K8sNode":{"properties":{"id":{"type":"string","title":"Id"},"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Node InternalIP — по нему CSI-драйвер связывает под на ноде с машиной TatNet"}},"type":"object","required":["id","role","status"],"title":"V1K8sNode","description":"Нода кластера: строка `k8s_nodes` плюс адрес её машины."},"V1K8sNodePool":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"vm_plan_id":{"type":"string","title":"Vm Plan Id"},"desired_count":{"type":"integer","title":"Desired Count"},"disk_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Disk Size Gb"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","name","role","vm_plan_id","desired_count","status"],"title":"V1K8sNodePool"},"V1K8sRegion":{"properties":{"id":{"type":"string","title":"Id","description":"Region UUID (use as region_id)"},"name":{"type":"string","title":"Name"},"is_default":{"type":"boolean","title":"Is Default"},"talos_versions":{"items":{"type":"string"},"type":"array","title":"Talos Versions","description":"Talos OS versions with a ready node image in this region, newest first"},"default_talos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Talos Version"}},"type":"object","required":["id","name","is_default"],"title":"V1K8sRegion"},"V1K8sRegions":{"properties":{"regions":{"items":{"$ref":"#/components/schemas/V1K8sRegion"},"type":"array","title":"Regions"},"k8s_versions":{"items":{"type":"string"},"type":"array","title":"K8S Versions","description":"Kubernetes versions offered for new clusters, newest first"},"default_k8s_version":{"type":"string","title":"Default K8S Version"},"talos_versions":{"items":{"type":"string"},"type":"array","title":"Talos Versions","description":"Talos OS versions offered, newest first"},"default_talos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Talos Version"}},"type":"object","required":["regions","k8s_versions","default_k8s_version"],"title":"V1K8sRegions"},"V1K8sScale":{"properties":{"desired_count":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Desired Count","description":"Desired worker node count"}},"type":"object","required":["desired_count"],"title":"V1K8sScale"},"V1K8sUpgrade":{"properties":{"k8s_version":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"K8S Version","description":"Target Kubernetes version (strictly newer, at most one minor ahead)"},"talos_version":{"anyOf":[{"type":"string","maxLength":50,"minLength":1},{"type":"null"}],"title":"Talos Version","description":"Target Talos OS version (nodes are re-installed and rebooted one at a time)"}},"type":"object","title":"V1K8sUpgrade"},"V1Kubeconfig":{"properties":{"ready":{"type":"boolean","title":"Ready","description":"False while the cluster is still bootstrapping"},"kubeconfig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubeconfig","description":"Cluster-admin kubeconfig YAML (handle as a secret)"}},"type":"object","required":["ready"],"title":"V1Kubeconfig"},"V1LBCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id","description":"VPC mode: targets attach here"},"k8s_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"K8S Cluster Id","description":"k8s mode: front this cluster's NodePorts (CCM)"},"region_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Id","description":"vpc mode: must match the VPC's region"},"node_count":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Node Count","default":2},"config":{"anyOf":[{"$ref":"#/components/schemas/LBConfigSpec"},{"type":"null"}]}},"type":"object","required":["name"],"title":"V1LBCreate"},"V1LBLetsEncryptCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"domain":{"type":"string","maxLength":253,"minLength":1,"title":"Domain","description":"Domain in a TatNet-managed zone"}},"type":"object","required":["name","domain"],"title":"V1LBLetsEncryptCreate"},"V1LBRegion":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_default":{"type":"boolean","title":"Is Default"}},"type":"object","required":["id","name","is_default"],"title":"V1LBRegion"},"V1LBRegions":{"properties":{"regions":{"items":{"$ref":"#/components/schemas/V1LBRegion"},"type":"array","title":"Regions"}},"type":"object","required":["regions"],"title":"V1LBRegions"},"V1LBUpdate":{"properties":{"node_count":{"anyOf":[{"type":"integer","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Node Count"}},"type":"object","title":"V1LBUpdate"},"V1LBUploadedCertCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"cert_pem":{"type":"string","maxLength":65536,"minLength":1,"title":"Cert Pem"},"key_pem":{"type":"string","maxLength":65536,"minLength":1,"title":"Key Pem"}},"type":"object","required":["name","cert_pem","key_pem"],"title":"V1LBUploadedCertCreate"},"V1NatGateway":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"fip_id":{"type":"string","title":"Fip Id"},"address":{"type":"string","title":"Address"},"status":{"type":"string","title":"Status"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"type":"object","required":["enabled","fip_id","address","status"],"title":"V1NatGateway","description":"The VPC's NAT gateway: a floating IP held by the VPC itself (SNAT of the\nwhole subnet). ``enabled`` is the intent; ``status`` is computed from what\nthe region has applied (attaching | attached | detaching | error)."},"V1NatGatewayEnable":{"properties":{"fip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fip Id","description":"Reuse an available floating IP of the account in the VPC's region; omit to allocate a new one"}},"type":"object","title":"V1NatGatewayEnable"},"V1Object":{"properties":{"key":{"type":"string","title":"Key"},"size":{"type":"integer","title":"Size"},"last_modified":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Modified"},"etag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etag"}},"type":"object","required":["key","size"],"title":"V1Object"},"V1ObjectKey":{"properties":{"key":{"type":"string","minLength":1,"title":"Key","description":"Object key within the bucket"}},"type":"object","required":["key"],"title":"V1ObjectKey"},"V1ObjectList":{"properties":{"prefix":{"type":"string","title":"Prefix"},"delimiter":{"type":"string","title":"Delimiter"},"objects":{"items":{"$ref":"#/components/schemas/V1Object"},"type":"array","title":"Objects"},"folders":{"items":{"type":"string"},"type":"array","title":"Folders","description":"Common prefixes one level below `prefix`"},"next_continuation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Continuation Token","description":"Pass back as `continuation_token` for the next page; null on the last page"},"is_truncated":{"type":"boolean","title":"Is Truncated"}},"type":"object","required":["prefix","delimiter","objects","folders","is_truncated"],"title":"V1ObjectList","description":"S3-style token pagination — not the ``limit``/``offset`` envelope the\nother /v1 lists use (see the module docstring)."},"V1PolicyStatement":{"properties":{"effect":{"type":"string","title":"Effect","default":"allow"},"actions":{"items":{"type":"string"},"type":"array","title":"Actions"},"resources":{"items":{"type":"string"},"type":"array","title":"Resources"}},"type":"object","required":["actions","resources"],"title":"V1PolicyStatement"},"V1PowerActionResult":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","message"],"title":"V1PowerActionResult"},"V1Presign":{"properties":{"key":{"type":"string","minLength":1,"title":"Key","description":"Object key within the bucket"},"method":{"type":"string","title":"Method","description":"GET to download, PUT to upload","default":"GET"}},"type":"object","required":["key"],"title":"V1Presign"},"V1PresignResult":{"properties":{"url":{"type":"string","title":"Url","description":"Pre-signed URL; usable without any TatNet credential until it expires"},"method":{"type":"string","title":"Method"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["url","method"],"title":"V1PresignResult"},"V1Project":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"}},"type":"object","required":["id","name"],"title":"V1Project"},"V1RegisteredDomain":{"properties":{"id":{"type":"string","title":"Id"},"domain":{"type":"string","title":"Domain","description":"The domain as registered, in its original script"},"domain_ascii":{"type":"string","title":"Domain Ascii","description":"Punycode form — what DNS and the registrar use"},"tld":{"type":"string","title":"Tld"},"status":{"type":"string","title":"Status","description":"Our lifecycle: pending | active | expired | deleted"},"provider":{"type":"string","title":"Provider","description":"Registrar the domain is held at"},"provider_status":{"type":"string","title":"Provider Status","description":"The registrar's own verdict on our last request, separate from `status`: ok | blocked | failed | unknown. Anything but 'ok' means the registrar refused us — a domain can be active for us and blocked there at the same time","default":"ok"},"provider_status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Status Message"},"provider_status_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Status At"},"registered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"auto_renew":{"type":"boolean","title":"Auto Renew"},"auto_renew_period_years":{"type":"integer","title":"Auto Renew Period Years"},"nameservers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Nameservers","description":"Nameservers from the last successful register or redelegate; null when the platform has no record (not the same as 'none set')"},"auto_created_zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Created Zone Id","description":"DNS zone the platform created for this domain, if any"},"last_provider_sync_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Provider Sync At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","domain","domain_ascii","tld","status","provider","auto_renew","auto_renew_period_years"],"title":"V1RegisteredDomain"},"V1ReservedIp":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"mac":{"type":"string","title":"Mac"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","name","address","mac"],"title":"V1ReservedIp"},"V1ReservedIpCreate":{"properties":{"name":{"type":"string","title":"Name"},"address":{"type":"string","format":"ipv4","title":"Address"},"mac":{"type":"string","title":"Mac"}},"type":"object","required":["name","address","mac"],"title":"V1ReservedIpCreate"},"V1SshKey":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"public_key":{"type":"string","title":"Public Key"}},"type":"object","required":["id","name","public_key"],"title":"V1SshKey"},"V1SshKeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"public_key":{"type":"string","title":"Public Key"}},"type":"object","required":["name","public_key"],"title":"V1SshKeyCreate"},"V1Usage":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/V1BucketUsage"},"type":"array","title":"Buckets"},"total_bytes_stored":{"type":"integer","title":"Total Bytes Stored"},"total_object_count":{"type":"integer","title":"Total Object Count"}},"type":"object","required":["buckets","total_bytes_stored","total_object_count"],"title":"V1Usage"},"V1VM":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"hostname":{"type":"string","title":"Hostname"},"status":{"type":"string","title":"Status"},"vcpu":{"type":"integer","title":"Vcpu"},"mem":{"type":"integer","title":"Mem"},"disk_size":{"type":"integer","title":"Disk Size"},"project_id":{"type":"string","title":"Project Id"},"install_guest_agent":{"type":"boolean","title":"Install Guest Agent","description":"Whether qemu-guest-agent is installed via cloud-init","default":true},"guest_agent_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Agent State","description":"Observed qemu-guest-agent state from the node's guest-ping: `connected` or `absent`; null when not checked yet or the VM is stopped. Read-only — `install_guest_agent` is the intent, this is the fact."},"guest_agent_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Guest Agent Checked At","description":"When the guest agent was last probed (RFC 3339)"},"ipv4_addresses":{"items":{"type":"string"},"type":"array","title":"Ipv4 Addresses"},"interfaces":{"items":{"$ref":"#/components/schemas/V1VMInterfaceOut"},"type":"array","title":"Interfaces","description":"Network interfaces as attached; an interface `id` is what `POST /v1/floating-ips/{id}/attach` takes"},"floating_ips":{"items":{"$ref":"#/components/schemas/V1VMFloatingIP"},"type":"array","title":"Floating Ips","description":"Floating IPs attached to the VM's interfaces, with their computed status"},"ephemeral":{"type":"boolean","title":"Ephemeral","description":"Ephemeral VM: billed per second of lifetime at the plan's hourly rate, no prepaid period or subscription; cannot be resized","default":false}},"type":"object","required":["id","name","hostname","status","vcpu","mem","disk_size","project_id"],"title":"V1VM"},"V1VMCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"VM display name"},"hostname":{"type":"string","maxLength":63,"minLength":1,"title":"Hostname","description":"VM hostname (lowercase letters, digits, hyphens)"},"image_id":{"type":"string","title":"Image Id","description":"Image UUID"},"vm_plan_id":{"type":"string","title":"Vm Plan Id","description":"VM plan UUID"},"cluster_id":{"type":"string","title":"Cluster Id","description":"Cluster UUID"},"default_user":{"type":"string","minLength":1,"title":"Default User","description":"Default login user for the VM"},"disk_size_gb":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Disk Size Gb","description":"Custom disk size in GB (within plan limits)"},"ssh_key_ids":{"items":{"type":"string"},"type":"array","title":"Ssh Key Ids","description":"SSH key UUIDs to inject (0 or more)"},"interfaces":{"items":{"$ref":"#/components/schemas/V1VMInterface"},"type":"array","title":"Interfaces","description":"Network interfaces to attach"},"cloud_init":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cloud Init","description":"Custom cloud-init user-data (YAML)"},"install_guest_agent":{"type":"boolean","title":"Install Guest Agent","description":"Install qemu-guest-agent in the VM via cloud-init. With the agent running, the password can be reset without stopping the VM.","default":true},"period_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period Months","description":"Payment period in months (1, 3, 6, 12)"},"period_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Period Days","description":"Payment period in days (e.g. 1)"},"backup_count":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Backup Count","description":"Number of backup slots (0..10)","default":0},"auto_renew":{"type":"boolean","title":"Auto Renew","description":"Automatically renew the paid VM subscription","default":true},"ephemeral":{"type":"boolean","title":"Ephemeral","description":"Ephemeral VM: no prepaid period or subscription. Billed per second of lifetime — from creation to the deletion request — at the plan's hourly rate (plus extra disk and public IP) through an hourly usage meter. Meant for short-lived machines (CI runners, batch jobs). Mutually exclusive with period_months/period_days and backup_count; cannot be resized; insufficient funds → 402 and no capacity → 503 immediately instead of a queued VM.","default":false}},"type":"object","required":["name","hostname","image_id","vm_plan_id","cluster_id","default_user"],"title":"V1VMCreate"},"V1VMFloatingIP":{"properties":{"id":{"type":"string","title":"Id"},"address":{"type":"string","title":"Address"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","address","status"],"title":"V1VMFloatingIP"},"V1VMInterface":{"properties":{"type":{"type":"string","title":"Type","description":"Interface type: 'vpc' (recommended) or 'public' (deprecated)"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id","description":"VPC (logical switch) UUID for 'vpc' interfaces; omit to use the account's default VPC in the VM's region (created on first use)"},"floating_ip":{"type":"boolean","title":"Floating Ip","description":"'vpc' interfaces only: allocate a floating public IPv4 in the VM's region and attach it to this interface. Released automatically when the VM is deleted unless detached manually first.","default":false},"enable_ipv4":{"type":"boolean","title":"Enable Ipv4","description":"Allocate a public IPv4 address (public interfaces)","default":true},"enable_ipv6":{"type":"boolean","title":"Enable Ipv6","description":"Allocate a public IPv6 address (public interfaces, IPv6-capable clusters)","default":false},"dhcp4":{"type":"boolean","title":"Dhcp4","description":"Enable DHCP for IPv4","default":false}},"type":"object","required":["type"],"title":"V1VMInterface","description":"A network interface to attach to a VM at creation time.\n\nThe recommended shape is one `vpc` interface with `floating_ip: true`:\nthe VM lands in a VPC (the account's default one when `vpc_id` is\nomitted) and gets a floating public IPv4 attached as part of creation.\n`public` (a legacy public NIC) is deprecated and kept for IPv6 and\ncompatibility."},"V1VMInterfaceOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"mac":{"type":"string","title":"Mac"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id","description":"VPC (logical switch) UUID for VPC-attached interfaces"},"ipv4_addresses":{"items":{"type":"string"},"type":"array","title":"Ipv4 Addresses"}},"type":"object","required":["id","name","type","mac"],"title":"V1VMInterfaceOut","description":"A VM interface as attached. Without `id` here a key holder could not\nattach a floating IP at all — the attach endpoint takes an interface, and\nno other v1 route exposes one."},"V1Volume":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"region_id":{"type":"string","title":"Region Id"},"size_gb":{"type":"integer","title":"Size Gb"},"actual_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Size Gb"},"status":{"type":"string","title":"Status"},"desired_state":{"type":"string","title":"Desired State"},"managed_by":{"type":"string","title":"Managed By"},"k8s_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"K8S Cluster Id"},"device_serial":{"type":"string","title":"Device Serial"},"error_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Detail"},"attachment":{"anyOf":[{"$ref":"#/components/schemas/V1VolumeAttachment"},{"type":"null"}]}},"type":"object","required":["id","name","region_id","size_gb","status","desired_state","managed_by","device_serial"],"title":"V1Volume"},"V1VolumeAttach":{"properties":{"vm_id":{"type":"string","title":"Vm Id"}},"type":"object","required":["vm_id"],"title":"V1VolumeAttach"},"V1VolumeAttachment":{"properties":{"vm_id":{"type":"string","title":"Vm Id"},"status":{"type":"string","title":"Status"},"target_dev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Dev"}},"type":"object","required":["vm_id","status"],"title":"V1VolumeAttachment"},"V1VolumeCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"size_gb":{"type":"integer","minimum":1.0,"title":"Size Gb"},"region_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Id"},"k8s_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"K8S Cluster Id"}},"type":"object","required":["name","size_gb"],"title":"V1VolumeCreate"},"V1VolumeDetach":{"properties":{"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"V1VolumeDetach"},"V1VolumeResize":{"properties":{"size_gb":{"type":"integer","minimum":1.0,"title":"Size Gb"}},"type":"object","required":["size_gb"],"title":"V1VolumeResize"},"V1Vpc":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"subnet":{"type":"string","title":"Subnet"},"cluster_id":{"type":"string","title":"Cluster Id"},"ovn_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ovn Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"is_default":{"type":"boolean","title":"Is Default","description":"The account's default VPC in this region (created on first use)","default":false},"nat_gateway":{"anyOf":[{"$ref":"#/components/schemas/V1NatGateway"},{"type":"null"}],"description":"NAT gateway of the VPC; null when none was ever enabled"}},"type":"object","required":["id","name","subnet","cluster_id"],"title":"V1Vpc"},"V1VpcCreate":{"properties":{"name":{"type":"string","title":"Name"},"subnet":{"type":"string","format":"ipv4network","title":"Subnet"},"cluster_id":{"type":"string","title":"Cluster Id"}},"type":"object","required":["name","subnet","cluster_id"],"title":"V1VpcCreate"},"V1Zone":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"default_ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Ttl"},"dnssec_enabled":{"type":"boolean","title":"Dnssec Enabled","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","status","created_at","updated_at"],"title":"V1Zone"},"V1ZoneCreate":{"properties":{"name":{"type":"string","title":"Name"},"default_ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Ttl"},"dnssec_enabled":{"type":"boolean","title":"Dnssec Enabled","default":false}},"type":"object","required":["name"],"title":"V1ZoneCreate"},"V1ZoneUpdate":{"properties":{"default_ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Ttl"},"dnssec_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dnssec Enabled"}},"type":"object","title":"V1ZoneUpdate"},"VMStartRequest":{"properties":{"renew":{"type":"boolean","title":"Renew","default":false},"quote_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote Token"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"}},"type":"object","title":"VMStartRequest","description":"Optional renewal confirmation supplied when starting an expired VM."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValkeyCaResponse":{"properties":{"ready":{"type":"boolean","title":"Ready","default":false},"ca_pem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ca Pem"}},"type":"object","title":"ValkeyCaResponse","description":"CA кластера в PEM. ``ready=False`` — регион его ещё не выпустил.\n\nФорма та же, что у ``PgCaResponse`` и у kubeconfig'а managed k8s: «ещё не\nготово» — это 200 с флагом, а не 404. До 2026-09-15 роут отвечал здесь\n404, и фронт, написанный под флаг (`if (!res.ca_pem)` → «CA не готов»),\nпоказывал вместо этого сырую ошибку: ветка была недостижима."},"ValkeyClusterCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"valkey_version":{"type":"string","title":"Valkey Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/ValkeyPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"maxmemory_mb":{"type":"integer","title":"Maxmemory Mb"},"maxclients":{"type":"integer","title":"Maxclients"},"eviction_policy":{"type":"string","title":"Eviction Policy"},"persistence":{"type":"string","title":"Persistence"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"endpoint_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Host"},"endpoint_port":{"type":"integer","title":"Endpoint Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Name"},"vpc_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Name"},"endpoint_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Ip"},"endpoint_dns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Dns"},"vpc_vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Vip"},"read_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read Host"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"access_mode":{"type":"string","title":"Access Mode","default":"public"},"nodes":{"items":{"$ref":"#/components/schemas/ValkeyNodeResponse"},"type":"array","title":"Nodes"},"ca_available":{"type":"boolean","title":"Ca Available","default":false},"replace_pending":{"type":"boolean","title":"Replace Pending","default":false},"nodes_outdated":{"type":"integer","title":"Nodes Outdated","default":0},"user":{"type":"string","title":"User","default":"default"},"parameters_applied":{"type":"boolean","title":"Parameters Applied","default":false},"plan_change_pending":{"type":"boolean","title":"Plan Change Pending","default":false},"topology_change_pending":{"type":"boolean","title":"Topology Change Pending","default":false},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","valkey_version","topology","node_count","maxmemory_mb","maxclients","eviction_policy","persistence","status","endpoint_port"],"title":"ValkeyClusterCreatedResponse","description":"Ответ на СОЗДАНИЕ кластера: единственное место, где виден пароль.\n\nОтдельный тип, а не поле в общем ответе, — чтобы «показывается один раз»\nбыло свойством контракта, а не договорённостью. В обычной карточке поля\nнет вовсе: пароль лежит в keystore, api его не хранит и прочитать не может."},"ValkeyClusterDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"valkey_version":{"type":"string","title":"Valkey Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/ValkeyPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"maxmemory_mb":{"type":"integer","title":"Maxmemory Mb"},"maxclients":{"type":"integer","title":"Maxclients"},"eviction_policy":{"type":"string","title":"Eviction Policy"},"persistence":{"type":"string","title":"Persistence"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"endpoint_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Host"},"endpoint_port":{"type":"integer","title":"Endpoint Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Name"},"vpc_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Name"},"endpoint_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Ip"},"endpoint_dns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Dns"},"vpc_vip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Vip"},"read_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Read Host"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"access_mode":{"type":"string","title":"Access Mode","default":"public"},"nodes":{"items":{"$ref":"#/components/schemas/ValkeyNodeResponse"},"type":"array","title":"Nodes"},"ca_available":{"type":"boolean","title":"Ca Available","default":false},"replace_pending":{"type":"boolean","title":"Replace Pending","default":false},"nodes_outdated":{"type":"integer","title":"Nodes Outdated","default":0},"user":{"type":"string","title":"User","default":"default"},"parameters_applied":{"type":"boolean","title":"Parameters Applied","default":false},"plan_change_pending":{"type":"boolean","title":"Plan Change Pending","default":false},"topology_change_pending":{"type":"boolean","title":"Topology Change Pending","default":false}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","valkey_version","topology","node_count","maxmemory_mb","maxclients","eviction_policy","persistence","status","endpoint_port"],"title":"ValkeyClusterDetailResponse"},"ValkeyClusterResponse":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"project_id":{"type":"string","title":"Project Id"},"name":{"type":"string","title":"Name"},"region_cluster_id":{"type":"string","title":"Region Cluster Id"},"valkey_version":{"type":"string","title":"Valkey Version"},"topology":{"type":"string","title":"Topology"},"node_count":{"type":"integer","title":"Node Count"},"vpc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vpc Id"},"plan":{"anyOf":[{"$ref":"#/components/schemas/ValkeyPlanResponse"},{"type":"null"}]},"monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Cost"},"maxmemory_mb":{"type":"integer","title":"Maxmemory Mb"},"maxclients":{"type":"integer","title":"Maxclients"},"eviction_policy":{"type":"string","title":"Eviction Policy"},"persistence":{"type":"string","title":"Persistence"},"status":{"type":"string","title":"Status"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail"},"endpoint_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Host"},"endpoint_port":{"type":"integer","title":"Endpoint Port"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","account_id","project_id","name","region_cluster_id","valkey_version","topology","node_count","maxmemory_mb","maxclients","eviction_policy","persistence","status","endpoint_port"],"title":"ValkeyClusterResponse"},"ValkeyNodeResponse":{"properties":{"id":{"type":"string","title":"Id"},"ordinal":{"type":"integer","title":"Ordinal"},"vm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vm Id"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"server_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Role"},"repl_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Repl Offset"},"removing":{"type":"boolean","title":"Removing","default":false},"generation":{"type":"integer","title":"Generation","default":0},"image_outdated":{"type":"boolean","title":"Image Outdated","default":false},"image_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Name"},"replacing":{"type":"boolean","title":"Replacing","default":false}},"type":"object","required":["id","ordinal"],"title":"ValkeyNodeResponse"},"ValkeyPasswordResetResponse":{"properties":{"password":{"type":"string","title":"Password"},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","required":["password"],"title":"ValkeyPasswordResetResponse","description":"Новый пароль — снова единственный раз, когда он виден.\n\n`applied=False` — регион ещё не довёл его до живого сервера: до этого\nмомента сервер принимает СТАРЫЙ пароль. Врать здесь нельзя, иначе клиент\nрешит, что старый уже не работает, и потеряет доступ на ровном месте."},"ValkeyPlanResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"vcpu":{"type":"integer","title":"Vcpu"},"mem":{"type":"integer","title":"Mem"},"disk_size":{"type":"integer","title":"Disk Size"},"price_per_month":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Month"},"price_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Hour"},"maxmemory_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxmemory Mb"},"maxclients":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxclients"}},"type":"object","required":["id","name","vcpu","mem","disk_size"],"title":"ValkeyPlanResponse","description":"Тариф узла Valkey. Диск входит в тариф, цена — за ОДИН узел.\n\n``maxmemory_mb`` / ``maxclients`` — продаваемые пределы из\n:data:`VALKEY_PLAN_SPECS`: фронт показывает их той же картой, с которой\nсервер снимет снимок при создании."},"ValkeyRegionResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_default":{"type":"boolean","title":"Is Default","default":false},"valkey_versions":{"items":{"type":"string"},"type":"array","title":"Valkey Versions","default":[]},"default_valkey_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Valkey Version"}},"type":"object","required":["id","name"],"title":"ValkeyRegionResponse","description":"Регион в пикере мастера. Собственный тип, не AppRegionResponse:\nфронтовый контракт Valkey ждёт `id`, а не `cluster_id`."},"ValkeyRegionsListResponse":{"properties":{"regions":{"items":{"$ref":"#/components/schemas/ValkeyRegionResponse"},"type":"array","title":"Regions"},"valkey_versions":{"items":{"type":"string"},"type":"array","title":"Valkey Versions"},"default_valkey_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Valkey Version"},"plans":{"items":{"$ref":"#/components/schemas/ValkeyPlanResponse"},"type":"array","title":"Plans"},"topologies":{"items":{"$ref":"#/components/schemas/ValkeyTopologyResponse"},"type":"array","title":"Topologies"},"eviction_policies":{"items":{"type":"string"},"type":"array","title":"Eviction Policies"},"persistence_modes":{"items":{"type":"string"},"type":"array","title":"Persistence Modes"},"public_ip_price_per_month":{"type":"number","title":"Public Ip Price Per Month","default":0.0}},"type":"object","required":["regions","valkey_versions","plans","topologies","eviction_policies","persistence_modes"],"title":"ValkeyRegionsListResponse","description":"Регионы, где включён managed Valkey, и всё, из чего собирается мастер.\n\nТопологии отдаются ВСЕ (в отличие от pg): UI сам показывает недоступные\nкак «скоро», а сервер отклоняет их 422 на create."},"ValkeyReplaceNodesResponse":{"properties":{"requested":{"type":"integer","title":"Requested"}},"type":"object","required":["requested"],"title":"ValkeyReplaceNodesResponse","description":"Ответ ручек замены: сколько узлов получили намерение «заменить»."},"ValkeyTopologyResponse":{"properties":{"id":{"type":"string","title":"Id"},"nodes":{"type":"integer","title":"Nodes"}},"type":"object","required":["id","nodes"],"title":"ValkeyTopologyResponse","description":"Топология и число узлов, на которое умножается цена тарифа."},"WhoAmIResponse":{"properties":{"account_id":{"type":"string","title":"Account Id"},"key_id":{"type":"string","title":"Key Id"},"policy":{"items":{"$ref":"#/components/schemas/V1PolicyStatement"},"type":"array","title":"Policy"}},"type":"object","required":["account_id","key_id","policy"],"title":"WhoAmIResponse"}},"securitySchemes":{"TatNetAPIKey":{"type":"http","description":"Your TatNet API key as a bearer token: `Authorization: Bearer tn_live_…`","scheme":"bearer","bearerFormat":"tn_live_…"}}}}