{"openapi":"3.0.3","info":{"title":"Customer API (beta)","version":"1.0.0","description":"Start with the usage guide at `/guide.md` (workflows, response shapes, error codes). Manage your services programmatically. Authenticate with an API key created in the client panel (Profile → API Keys), sent as `Authorization: Bearer fbk_...`. Every response is JSON with a `success` flag. Mutations require the scope noted on each operation (`x-scope`); team members are additionally limited to their account permissions. Rate limits are per key and reported in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers; some actions carry an additional per-service cool-down (see the 429 description). Money: an order, add-on or upgrade creates an invoice or a proforma (tenant setting). It is paid from your credit balance automatically ONLY when the tenant has enabled auto-credit for your account; otherwise pay the returned document with `POST /invoices/{id}/pay` or `POST /proformas/{id}/pay`. Provisioning starts once the document is paid."},"servers":[{"url":"https://my.voxa.host/api/v1"}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"fbk_<prefix>_<secret>"}},"schemas":{"Envelope":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"description":"Endpoint-specific payload; see the guide for shapes"},"message":{"type":"string"},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ErrorEnvelope":{"type":"object","required":["success","error","code"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Human-readable reason"},"code":{"type":"string","enum":["BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","SCOPE_REQUIRED","PERMISSION_DENIED","ACCOUNT_SUSPENDED","INVALID_JSON","ACTION_NOT_ALLOWED","ACTION_UNKNOWN","FEATURE_DISABLED","NOT_FOUND","CONFLICT","RENEWAL_PENDING","RATE_LIMITED","ACTION_RATE_LIMITED","PROVIDER_ERROR","PROVIDER_UNAVAILABLE","UPSTREAM_ERROR","UNAVAILABLE","INTERNAL_ERROR","ERROR"]},"scope":{"type":"string","description":"Present with SCOPE_REQUIRED"},"retry_after_seconds":{"type":"integer","description":"Present with ACTION_RATE_LIMITED (also sent as the Retry-After header)"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}}},"example":{"success":false,"error":"API key is missing the required scope: services","code":"SCOPE_REQUIRED","scope":"services"}},"Pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}},"IpAddress":{"type":"object","properties":{"address":{"type":"string"},"version":{"type":"integer","enum":[4,6]},"prefix_length":{"type":"integer","nullable":true},"gateway":{"type":"string","nullable":true},"subnet_cidr":{"type":"string","nullable":true},"purpose":{"type":"string"}}},"VpsCapabilities":{"type":"object","description":"What the operator allows on this VPS; verbs not listed are refused","properties":{"actions":{"type":"array","items":{"type":"string","enum":["start","shutdown","reboot"]},"description":"Empty = the operator switched customer power control off for this product; a verb not listed answers 403"},"console":{"type":"boolean"},"reinstall":{"type":"boolean"},"password_reset":{"type":"boolean"},"snapshots":{"type":"boolean"},"shared":{"type":"boolean"},"frozen":{"type":"boolean"},"shared_managed":{"type":"boolean"},"unavailable_reason":{"type":"string","nullable":true,"enum":["shared_cluster","frozen_cluster",null]},"provider_dependent":{"type":"boolean","description":"Plugin-provided VPS: the verbs are routed but the provider decides"}}},"ProvisioningFailure":{"type":"object","nullable":true,"description":"Why a build failed, classified — present (non-null) only while `status` is `provisioning_failed`. Branch on `code`; `message` is one plain sentence meant to be shown as-is. The operator-side error text is never returned.","properties":{"code":{"type":"string","enum":["ip_capacity","storage_capacity","capacity","install_timeout","configuration","name_conflict","provider_unreachable","unknown"]},"message":{"type":"string"}},"example":{"code":"ip_capacity","message":"The chosen location had no free IP address to assign."}},"Vps":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"hostname":{"type":"string","nullable":true},"status":{"type":"string","description":"BILLING state","enum":["pending","pending_payment","installing","active","suspended","terminated","provisioning_failed","cancelled"]},"kind":{"type":"string","enum":["vps"]},"provider":{"type":"string","description":"\"native\" or the provider plugin slug"},"product":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"billing":{"type":"object","properties":{"cycle":{"type":"string"},"amount":{"type":"string","description":"Decimal string, 4 dp — what THIS service bills; may differ from the product list price"},"currency":{"type":"string","nullable":true},"next_due_date":{"type":"string","format":"date-time","nullable":true}}},"cancellation":{"type":"object","nullable":true,"properties":{"scheduled_date":{"type":"string","format":"date-time"}}},"location":{"type":"string","nullable":true},"primary_ip":{"type":"string","nullable":true},"ip_addresses":{"type":"array","items":{"$ref":"#/components/schemas/IpAddress"}},"instance":{"type":"object","nullable":true,"description":"MACHINE state","properties":{"state":{"type":"string","enum":["creating","running","stopped","paused","migrating","error","orphaned","terminated_pending_wipe"]},"vcpus":{"type":"integer","nullable":true},"memory_mb":{"type":"integer","nullable":true},"disk_gb":{"type":"integer","nullable":true},"os":{"type":"string","nullable":true},"rescue_mode":{"type":"boolean"},"updated_at":{"type":"string","format":"date-time"}}},"os_installation_status":{"type":"string","nullable":true,"description":"in_progress | completed | failed around a reinstall"},"capabilities":{"allOf":[{"$ref":"#/components/schemas/VpsCapabilities"}],"nullable":true,"description":"Detail only (GET /vps/{id}); null on list rows"},"failure":{"$ref":"#/components/schemas/ProvisioningFailure"},"specs":{"type":"object","additionalProperties":true,"nullable":true},"created_at":{"type":"string","format":"date-time"}}},"JobResult":{"type":"object","description":"Asynchronous action accepted. completed:false means poll the resource; never repeat the call.","properties":{"completed":{"type":"boolean"},"pending":{"type":"boolean"},"job_id":{"type":"string"},"state":{"type":"string"},"status":{"type":"string"}},"example":{"completed":true,"job_id":"c2b9…","state":"running","status":"completed"}},"PayResult":{"type":"object","description":"Invoice: {payment, newBalance, remainingAmount, invoicePaid}. Proforma: {creditApplied, newBalance, remainingAmount, proformaPaid, invoice} — the invoice the proforma converted into once fully paid.","properties":{"payment":{"type":"object","additionalProperties":true},"creditApplied":{"type":"number"},"newBalance":{"type":"number"},"remainingAmount":{"type":"number"},"invoicePaid":{"type":"boolean"},"proformaPaid":{"type":"boolean"},"invoice":{"type":"object","nullable":true,"additionalProperties":true}},"example":{"payment":{"id":"…","amount":"5.0000","gateway":"credit","status":"completed"},"newBalance":20.5,"remainingAmount":0,"invoicePaid":true}},"DocumentState":{"type":"object","nullable":true,"description":"Settlement summary of the billing document a create/buy call produced — branch on `settled`, not on the nested row","properties":{"type":{"type":"string","enum":["invoice","proforma"]},"id":{"type":"string","format":"uuid"},"status":{"type":"string","description":"unpaid | pending | paid | converted"},"total":{"type":"string"},"settled":{"type":"boolean"}}},"CreateResult":{"type":"object","description":"Payload of POST /orders and POST /services/{id}/options: the panel payload plus a settlement summary","properties":{"order":{"type":"object","additionalProperties":true},"services":{"type":"array","items":{"type":"object","additionalProperties":true}},"serviceOption":{"type":"object","additionalProperties":true},"invoice":{"type":"object","nullable":true,"additionalProperties":true,"description":"Row as built by the handler — may still read unpaid when auto-credit settled it; trust `document`/`settled`. When auto-credit settled it the row carries `autoCreditApplied` {creditApplied, newBalance, remainingAmount, invoice}"},"proforma":{"type":"object","nullable":true,"additionalProperties":true,"description":"Same as `invoice`; `autoCreditApplied.invoice` is the invoice the proforma converted into"},"document":{"$ref":"#/components/schemas/DocumentState"},"settled":{"type":"boolean","description":"true when nothing is owed (auto-credit paid it, or the total was zero)"},"idempotent":{"type":"boolean","description":"Only on a replay: true means nothing was created by THIS call and the order below is the one your key already made (the status is 200, not 201)"},"next_step":{"type":"string"},"credit_balance":{"type":"number","nullable":true}}},"PowerAction":{"type":"string","enum":["start","stop","restart","reboot","shutdown","poweroff"]},"ReinstallBody":{"type":"object","required":["image_id","password"],"properties":{"image_id":{"type":"string","format":"uuid","description":"OS image id from GET /vps/{id}/os-images (aliases accepted: os_image_id, osImageId; plugin providers: template)"},"password":{"type":"string","minLength":8,"description":"New root/administrator password"}}},"PasswordBody":{"type":"object","required":["password"],"properties":{"password":{"type":"string","minLength":8}}},"CancelBody":{"type":"object","properties":{"reason":{"type":"string","description":"At least two words","default":"Cancelled via API"},"immediate":{"type":"boolean","default":false,"description":"true = terminate now; false = at end of the paid period"}}},"OrderBody":{"type":"object","required":["productId","billingCycle"],"properties":{"productId":{"type":"string","format":"uuid"},"billingCycle":{"type":"string","enum":["hourly","monthly","quarterly","semi-annually","annually"]},"hostname":{"type":"string","description":"FQDN-style hostname"},"projectId":{"type":"string","description":"Project (id or slug) this order and the services it creates belong to. Omit to use the project this key is bound to, or the default project. A key bound to a different project refuses with 403 PROJECT_SCOPE_MISMATCH."},"idempotencyKey":{"type":"string","maxLength":255,"description":"Your own replay handle for this create — the `Idempotency-Key` header does the same and wins if both are sent. One key maps to one order, for the life of that order: replaying it returns 200 with the FIRST order and `idempotent: true`, never a second order, even if the rest of the body differs. Retry the same key after a timeout or 5xx; use a new key for a new order. The key is echoed back as `order.idempotency_key` and is also a filter on GET /orders."},"location":{"type":"string","description":"Datacentre to build in. Send a `value` from `GET /products/{id}` → `locations[]` (or `GET /locations`). Required when that response says `location_required: true`; otherwise optional, and placement chooses. A location the product is not sold in is refused with 400 LOCATION_UNAVAILABLE, and the message names the values that are accepted. A location listed with `sold_out: true` is refused with 409 LOCATION_SOLD_OUT."},"configOptions":{"type":"object","description":"Product configuration, e.g. { \"os_image_id\": \"<uuid>\" } for VPS and dedicated servers","additionalProperties":true,"properties":{"os_image_id":{"type":"string","format":"uuid","description":"OS image to install; must be one the product offers"},"custom_image_id":{"type":"string","format":"uuid","description":"VPS only. Deploy from one of your own base images (see /custom-images) instead of a catalogue OS. Mutually exclusive with os_image_id, and not subject to the product's OS list — the image is yours, not sold to you."},"user_data":{"type":"string","maxLength":65536,"description":"VPS only. First-boot input, applied on provision and re-applied on every reinstall. Either a \"#cloud-config\" document (merged into the platform's own — lists such as runcmd, packages and write_files are appended after the platform's entries, and any other key the platform already sets is kept) or a script beginning with \"#!\" (written to /var/lib/fluxbilling/order-user-data.sh and run once, logging to /var/log/fluxbilling-order-user-data.log). Not supported on Windows images."},"ssh_keys":{"type":"array","maxItems":20,"items":{"type":"string"},"description":"VPS only. OpenSSH public keys authorised for root on first boot."},"ssh_key_ids":{"type":"array","maxItems":20,"items":{"type":"string","format":"uuid"},"description":"VPS only. Ids of keys already stored on the account (see /ssh-keys), authorised for root on first boot."}}},"items":{"type":"array","maxItems":50,"description":"Multi-item alternative to productId/billingCycle","items":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"billingCycle":{"type":"string"},"quantity":{"type":"integer","minimum":1},"configuration":{"type":"object","additionalProperties":true},"options":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"quantity":{"type":"integer"}}}}}}},"discountCode":{"type":"string"}}},"PayBody":{"type":"object","properties":{"amount":{"type":"number","description":"Defaults to min(credit balance, outstanding balance of the document). Partial payments are allowed; the document is settled once fully paid."}}},"SshKeyBody":{"type":"object","required":["name","publicKey"],"properties":{"name":{"type":"string","maxLength":255},"publicKey":{"type":"string","description":"OpenSSH public key line (`ssh-ed25519 AAAA… comment`); `public_key` is accepted as an alias. The comment is not stored; responses carry `public_key` and `fingerprint`."},"projectId":{"type":"string","description":"Project (id or slug) to add the key to. The same key may be added to several projects."}}},"Snapshot":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","description":"1-120 characters of letters, digits, dot, dash or underscore, starting alphanumeric. It is the string you type back to restore it."},"description":{"type":"string","nullable":true},"status":{"type":"string","enum":["creating","available","reverting","deleting","error"]},"size_bytes":{"type":"integer","nullable":true,"description":"What the snapshot costs on the host right now. It starts near zero and grows as the live disk diverges from it."},"has_memory":{"type":"boolean","description":"Whether guest RAM is part of it. Snapshots you take through the API never capture RAM."},"restorable":{"type":"boolean","description":"false when the snapshot is busy, failed, or was not found on the host the last time it was read"},"in_progress":{"type":"boolean"},"crash_consistent":{"type":"boolean","nullable":true,"description":"true = the guest filesystems could NOT be frozen when it was taken (no qemu-guest-agent answered), so restoring it is the equivalent of restoring after a power cut. false = quiesced. null = the host did not say."},"destroys_on_restore":{"type":"array","items":{"type":"string"},"description":"Snapshots that are DESTROYED if you restore this one. Rolling a disk back cannot leave a later restore point standing, so restoring an older snapshot removes every newer one."},"comes_back_running":{"type":"boolean","description":"Whether the VPS is running once the restore finishes. The platform stops it to restore and starts it again if it was running."},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true}}},"CustomImage":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"source_kind":{"type":"string","enum":["external","capture"],"description":"`external` = a URL you host, `capture` = an image the platform stores for you"},"status":{"type":"string","enum":["capturing","available","error"],"description":"Only `available` can be deployed from"},"size_bytes":{"type":"integer","nullable":true,"description":"What the stored file actually occupies, after compression"},"virtual_size_bytes":{"type":"integer","nullable":true,"description":"The server disk this image represents. The monthly storage charge is based on THIS, not on the compressed size, and it is also the smallest plan disk it can be deployed onto."},"source_url":{"type":"string","nullable":true,"description":"Null for a captured image, which the platform serves itself"},"source_sha256":{"type":"string","nullable":true},"os_family":{"type":"string"},"error":{"type":"string","nullable":true,"description":"Why a capture failed"},"available_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"CustomImageBody":{"type":"object","required":["name","sourceUrl","sha256"],"properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":2000},"sourceUrl":{"type":"string","maxLength":2000,"description":"https:// URL of a cloud-init-enabled qcow2 or raw disk image, on a publicly reachable host. Credentials in the URL are refused, and the host must not resolve to a private address. `source_url` is accepted as an alias."},"sha256":{"type":"string","description":"Lowercase hex sha256 of the image file. REQUIRED: the hypervisor verifies the download against it and discards anything that does not match, so an image with no digest cannot be deployed. `source_sha256` is accepted as an alias."},"osFamily":{"type":"string","default":"linux","description":"Decides which first-boot seed is built. Use `windows` for a cloudbase-init image; anything else takes the cloud-init path."},"projectId":{"type":"string","description":"Project (id or slug) the image belongs to. Image names are unique per project, so each project may hold its own \"base\"."}}},"DedicatedPowerBody":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["on","off","restart"]}}},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string","description":"Stable handle. Accepted anywhere an id is, including in `X-Project-Id`."},"name":{"type":"string"},"description":{"type":"string","nullable":true},"is_default":{"type":"boolean","description":"The project that also holds every resource created before projects existed, and anything never assigned to one."},"color":{"type":"string","nullable":true},"resources":{"type":"object","description":"How much this project holds. The default project's counts include everything unassigned.","properties":{"services":{"type":"integer"},"orders":{"type":"integer"},"custom_images":{"type":"integer"},"ssh_keys":{"type":"integer"}}},"created_at":{"type":"string","format":"date-time"}}},"ProjectBody":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":80,"description":"e.g. \"Production\" or \"Staging\""},"slug":{"type":"string","maxLength":40,"description":"Lowercase letters, digits and hyphens. Derived from the name when omitted. This is what you put in `X-Project-Id`."},"description":{"type":"string","maxLength":2000},"color":{"type":"string","maxLength":20,"description":"Display only — the dot beside the name in the panel."}}},"ProjectMoveBody":{"type":"object","description":"Ids to move INTO this project. Name at least one list. camelCase keys (customImages, sshKeys) are accepted as aliases.","properties":{"services":{"type":"array","items":{"type":"string","format":"uuid"}},"orders":{"type":"array","items":{"type":"string","format":"uuid"}},"custom_images":{"type":"array","items":{"type":"string","format":"uuid"}},"ssh_keys":{"type":"array","items":{"type":"string","format":"uuid"}}}},"ProjectAssignBody":{"type":"object","properties":{"projectId":{"type":"string","nullable":true,"description":"Project id or slug to move this resource into. `null` returns it to the default project. `project_id` and `project` are accepted as aliases."}}}}},"tags":[{"name":"Account","description":"Identity, credit balance, usage summary, credit ledger, and the documentation itself"},{"name":"Services","description":"Every service regardless of type: detail, generic actions, stats, cancellation, renewal, provider backups"},{"name":"VPS","description":"Virtual servers (native hypervisors or provider plugins): state, addresses, power, reinstall, password, snapshots"},{"name":"Dedicated","description":"Bare-metal servers: hardware, addresses, BMC power, reinstall, password, statistics, traffic"},{"name":"Game","description":"Native game servers: document and power control"},{"name":"Add-ons & Upgrades","description":"Add-ons on an existing service and plan upgrades; each creates a billing document that must be paid before it takes effect"},{"name":"Products & Orders","description":"The orderable catalogue, the datacentres it sells in, and new orders"},{"name":"Billing","description":"Invoices and proformas, and paying them from the credit balance"},{"name":"SSH Keys","description":"Account SSH keys installed on bare-metal reinstalls, and nameable from a VPS order via configOptions.ssh_key_ids"},{"name":"Custom Images","description":"Base images you host yourself and deploy VPS orders from via configOptions.custom_image_id"},{"name":"Projects","description":"Isolate environments inside one account: a project-bound key sees only its own services, orders, images and SSH keys, while billing stays consolidated at the account"}],"paths":{"/":{"get":{"summary":"API index: identity, key, scopes, links","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"operationId":"getIndex"}},"/openapi.json":{"get":{"summary":"This document (no authentication required)","tags":["Account"],"security":[],"responses":{"200":{"description":"OpenAPI 3.0 document"},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"operationId":"getOpenapiJson"}},"/docs":{"get":{"summary":"Human-readable documentation page (this guide rendered, plus an endpoint index) — no authentication required","tags":["Account"],"security":[],"operationId":"getDocs","responses":{"200":{"description":"text/html"},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/guide.md":{"get":{"security":[],"responses":{"200":{"description":"text/markdown"},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"summary":"Usage guide in Markdown: authentication, scopes, envelope, error codes, rate limits, pagination, resource shapes and step-by-step workflows with examples (no authentication required)","tags":["Account"],"operationId":"getGuideMd"}},"/account":{"get":{"summary":"Profile, account context and credit balance","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"operationId":"getAccount"}},"/account/balance":{"get":{"summary":"Credit balance","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"operationId":"getAccountBalance"}},"/account/usage":{"get":{"summary":"Service counts, spend this month, unpaid invoices","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"operationId":"getAccountUsage"}},"/account/transactions":{"get":{"summary":"Credit ledger","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."}],"operationId":"getAccountTransactions"}},"/services":{"get":{"summary":"All services with serviceType","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getServices"}},"/services/{id}":{"get":{"summary":"Service detail (VPS capabilities and IPs included)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesById"},"patch":{"summary":"Move this service into another project","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"Refused for a project-bound key. The service keeps running, its billing is unchanged, and only which project sees it changes.","parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssignBody"}}}},"operationId":"patchServicesById"}},"/services/{id}/actions":{"get":{"summary":"Actions supported by this service","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdActions"}},"/services/{id}/actions/{action}":{"post":{"summary":"Run an action: start, stop, restart, status, stats — or, on a provider-plugin service, any verb the provider exposes to customers in the client panel (see GET /services/{id}/actions). Reinstall and password reset have their own routes.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"params":{"type":"object","additionalProperties":true,"description":"Parameters forwarded to a plugin verb"}}}}}},"operationId":"postServicesByIdActionsByAction"}},"/services/{id}/stats":{"get":{"summary":"Usage statistics","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdStats"}},"/services/{id}/power/{action}":{"post":{"summary":"Power action by name (any provider)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"$ref":"#/components/schemas/PowerAction"}}],"operationId":"postServicesByIdPowerByAction"}},"/services/{id}/reinstall":{"post":{"summary":"Reinstall the operating system (native VPS or provider plugin)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReinstallBody"}}}},"operationId":"postServicesByIdReinstall"}},"/services/{id}/password":{"post":{"summary":"Reset the root password (native VPS or provider plugin)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordBody"}}}},"operationId":"postServicesByIdPassword"}},"/services/{id}/backups":{"get":{"summary":"List provider backups","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdBackups"},"post":{"summary":"Create a provider backup","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postServicesByIdBackups"}},"/services/{id}/backups/{backupId}/restore":{"post":{"summary":"Restore a provider backup","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"backupId","in":"path","required":true,"schema":{"type":"string"}}],"operationId":"postServicesByIdBackupsByBackupIdRestore"}},"/services/{id}/cancel":{"post":{"summary":"Request cancellation: at the end of the paid period by default; immediate:true terminates now (VPS disks are destroyed). Allowed on an `active` service and on one left in `provisioning_failed` — the latter always terminates immediately, whatever `immediate` says, because no period was ever delivered. Any other status answers 400","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelBody"}}}},"operationId":"postServicesByIdCancel"},"delete":{"summary":"Withdraw a pending cancellation","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"deleteServicesByIdCancel"}},"/services/{id}/renew":{"post":{"summary":"Issue the next renewal document now (invoice or proforma, per tenant). Active, non-hourly services only; refused while one is already awaiting payment. 1 per 10 minutes.","x-scope":"billing","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postServicesByIdRenew"}},"/services/{id}/options":{"get":{"summary":"Add-ons active on the service","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdOptions"},"post":{"summary":"Buy an add-on for the service. Creates an invoice or proforma and returns `document`/`settled`/`next_step`; pay the document unless `settled` is true. The add-on activates (status active) once the document is paid — poll GET /services/{id}/options.","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CreateResult"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["optionId","billingType"],"properties":{"optionId":{"type":"string","format":"uuid"},"billingType":{"type":"string","enum":["one_time","recurring"]},"billingCycle":{"type":"string","enum":["monthly","quarterly","semi-annually","annually"],"description":"For recurring add-ons; defaults to the service cycle"},"quantity":{"type":"integer","minimum":1,"maximum":100,"default":1}}}}}},"operationId":"postServicesByIdOptions"}},"/services/{id}/options/available":{"get":{"summary":"Add-ons the product offers, with what is already held","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdOptionsAvailable"}},"/services/{id}/options/{optionId}":{"delete":{"summary":"Cancel an add-on immediately (optionId = the catalogue option id from /options/available, not the service-option row id)","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"optionId","in":"path","required":true,"description":"Option id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"operationId":"deleteServicesByIdOptionsByOptionId"}},"/services/{id}/upgrades":{"get":{"summary":"Upgrade paths with prorated previews, and any pending upgrade","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdUpgrades"},"post":{"summary":"Request a product upgrade. Returns the upgrade (status awaiting_payment → executing → completed), its prorated billing document (null when nothing is owed) and `orderId` (an upgrade is recorded as an order). Pay the document via /invoices/{id}/pay or /proformas/{id}/pay; credit is never applied automatically to upgrades.","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["toProductId"],"properties":{"toProductId":{"type":"string","format":"uuid"}}}}}},"operationId":"postServicesByIdUpgrades"}},"/services/{id}/upgrades/options":{"post":{"summary":"Add and/or remove add-ons as one prorated change","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"addOptions":{"type":"array","items":{"oneOf":[{"type":"string","format":"uuid"},{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"configValue":{}}}]}},"removeOptions":{"type":"array","items":{"type":"string","format":"uuid"}}}}}}},"operationId":"postServicesByIdUpgradesOptions"}},"/upgrades/{upgradeId}":{"get":{"summary":"Upgrade request: data.upgrade (status awaiting_payment → executing → completed, executed_at) and data.order (the order it created, or null)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"upgradeId","in":"path","required":true,"description":"Upgrade id","schema":{"type":"string","format":"uuid"}}],"operationId":"getUpgradesByUpgradeId"}},"/upgrades/{upgradeId}/cancel":{"post":{"summary":"Cancel a pending upgrade request","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Add-ons & Upgrades"],"parameters":[{"name":"upgradeId","in":"path","required":true,"description":"Upgrade id","schema":{"type":"string","format":"uuid"}}],"operationId":"postUpgradesByUpgradeIdCancel"}},"/proformas":{"get":{"summary":"List proformas (?status=unpaid)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getProformas"}},"/proformas/{id}":{"get":{"summary":"One proforma (`data.proforma`, with `items` and `payments` nested inside it), plus paid_amount / remaining_amount / settled — poll this to learn whether a proforma has been paid","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"id","in":"path","required":true,"description":"Proforma id","schema":{"type":"string","format":"uuid"}}],"operationId":"getProformasById"}},"/proformas/{id}/pay":{"post":{"summary":"Pay a proforma from the credit balance (proforma-mode tenants). A fully paid proforma converts into an invoice (returned as `invoice`); a proforma already settled by auto-credit reads status `converted` and answers 400.","x-scope":"billing","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/PayResult"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"id","in":"path","required":true,"description":"Proforma id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayBody"}}}},"operationId":"postProformasByIdPay"}},"/services/{id}/game":{"get":{"summary":"Game server document","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByIdGame"}},"/services/{id}/game/power/{action}":{"post":{"summary":"Game server power (start, stop, restart, kill)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","enum":["start","stop","restart","kill"]}}],"operationId":"postServicesByIdGamePowerByAction"}},"/vps":{"get":{"summary":"List VPS instances with state and addresses","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Vps"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getVps"}},"/vps/{id}":{"get":{"summary":"VPS detail: instance, IPs, capabilities, specs","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Vps"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getVpsById"},"patch":{"summary":"Move this VPS into another project","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"Identical to PATCH /services/{id}; both accept `projectId` as an id, a slug, or null for the default project.","parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAssignBody"}}}},"operationId":"patchVpsById"},"delete":{"summary":"Cancel the VPS: at the end of the paid period by default; immediate:true terminates now and DESTROYS THE DISK","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelBody"}}}},"operationId":"deleteVpsById"}},"/vps/{id}/ips":{"get":{"summary":"IP addresses","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getVpsByIdIps"}},"/vps/{id}/stats":{"get":{"summary":"CPU, memory, disk and network series","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getVpsByIdStats"}},"/vps/{id}/os-images":{"get":{"summary":"Images this service may reinstall — exactly what the reinstall gate accepts (data.templates[]): the plan catalogue, narrowed by the product's linked images WHEN the product links any (a product with no links does not restrict reinstall, although it cannot be ORDERED). An empty list means no image is enabled for this plan — contact support.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getVpsByIdOsImages"}},"/vps/{id}/start":{"post":{"summary":"Power on (refused on a suspended service; 404 \"No VPS instance is linked\" while the build has not produced a machine yet or failed)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JobResult"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postVpsByIdStart"}},"/vps/{id}/stop":{"post":{"summary":"Shut down: ACPI shutdown, forced power-off after the grace window (native VPS); provider stop (plugin VPS)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postVpsByIdStop"}},"/vps/{id}/shutdown":{"post":{"summary":"Same as /stop","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postVpsByIdShutdown"}},"/vps/{id}/reboot":{"post":{"summary":"Reboot","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/JobResult"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postVpsByIdReboot"}},"/vps/{id}/restart":{"post":{"summary":"Reboot (alias)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postVpsByIdRestart"}},"/vps/{id}/power/{action}":{"post":{"summary":"Power action by name","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"$ref":"#/components/schemas/PowerAction"}}],"operationId":"postVpsByIdPowerByAction"}},"/vps/{id}/reinstall":{"post":{"summary":"Reinstall the operating system. ALL DATA ON THE DISK IS ERASED. Native VPS: a catalogue image id and a new root password are required; the job id is returned and progress is visible on GET /vps/{id} (os_installation_status). 1 per 5 minutes.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReinstallBody"}}}},"operationId":"postVpsByIdReinstall"}},"/vps/{id}/password":{"post":{"summary":"Set a new root/administrator password. Native VPS: applied through the guest agent, so the VM must be RUNNING (a stopped VM is refused with 409 — start it first); the job id is returned. Plugin VPS: forwarded to the provider. 1 per 10 minutes.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordBody"}}}},"operationId":"postVpsByIdPassword"}},"/vps/{id}/snapshots":{"get":{"summary":"List snapshots, with the cap. `data.snapshots[]` plus `used` and `max` — the same numbers the create call refuses on, so a client can grey out its own button instead of discovering the 409. The list is this platform's record of what the hypervisor holds; a snapshot taken outside the panel appears after an operator re-reads the host.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Snapshots and the cap","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"snapshots":{"type":"array","items":{"$ref":"#/components/schemas/Snapshot"}},"used":{"type":"integer","description":"Snapshots counting against the cap — failed ones and ones missing from the host do not"},"max":{"type":"integer","description":"0 = this plan does not include snapshots. Includes any extra slots bought as an add-on."}}}}}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getVpsByIdSnapshots"},"post":{"summary":"Take a snapshot of the disk. Returns 201 immediately with the row in `creating`; poll the list until it leaves that state. DISK ONLY — guest RAM is never captured on this path, so a restore always comes back as if the machine had been powered off at that instant. Refusals: 403 snapshots not offered on this VPS, 409 at the cap / a name already in use / another disk job running on this VM, 400 a name outside `[A-Za-z0-9][A-Za-z0-9._-]{0,119}` or starting with a platform-reserved prefix.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":120,"description":"You type this back to restore it, so make it readable"},"description":{"type":"string","maxLength":2000,"nullable":true}}}}}},"operationId":"postVpsByIdSnapshots"}},"/vps/{id}/snapshots/{snapshotId}":{"delete":{"summary":"Delete a snapshot and free the disk it pins. Asynchronous: the row goes to `deleting` and disappears once the hypervisor confirms. The VPS and its current data are untouched.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"snapshotId","in":"path","required":true,"description":"Snapshot id","schema":{"type":"string","format":"uuid"}}],"operationId":"deleteVpsByIdSnapshotsBySnapshotId"}},"/vps/{id}/snapshots/{snapshotId}/revert":{"post":{"summary":"Restore the VPS to this snapshot. DESTRUCTIVE AND NOT REVERSIBLE: everything written to the disk since the snapshot was taken is discarded, and every NEWER snapshot is destroyed with it (see `destroys_on_restore`). `confirm` must be the SNAPSHOT's own name — a request without it is refused 400 and the message lists exactly what would be lost. The VPS is stopped for the restore and started again if it was running.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["VPS"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"snapshotId","in":"path","required":true,"description":"Snapshot id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"type":"string","description":"The snapshot's `name`, typed back"}}}}}},"operationId":"postVpsByIdSnapshotsBySnapshotIdRevert"}},"/dedicated":{"get":{"summary":"List dedicated servers","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getDedicated"}},"/dedicated/{id}":{"get":{"summary":"Hardware, location, provisioning and OS state","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedById"}},"/dedicated/{id}/ips":{"get":{"summary":"Subnets and IP addresses","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdIps"}},"/dedicated/{id}/power-status":{"get":{"summary":"Power state","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdPowerStatus"}},"/dedicated/{id}/power":{"post":{"summary":"Power on / graceful shutdown / graceful restart over the BMC (Redfish). 10 per minute.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedicatedPowerBody"}}}},"operationId":"postDedicatedByIdPower"}},"/dedicated/{id}/power/{action}":{"post":{"summary":"Power action by name (on, off, restart; start/stop/reboot accepted)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","enum":["on","off","restart"]}}],"operationId":"postDedicatedByIdPowerByAction"}},"/dedicated/{id}/provision-status":{"get":{"summary":"Provisioning / install progress","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdProvisionStatus"}},"/dedicated/{id}/os-images":{"get":{"summary":"Images available for reinstall","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdOsImages"}},"/dedicated/{id}/reinstall":{"post":{"summary":"Reinstall the operating system. ALL DATA IS ERASED. Your account SSH keys are installed. Refused while an installation is in progress. 1 per 5 minutes.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["osImageId"],"properties":{"osImageId":{"type":"string","format":"uuid","description":"From GET /dedicated/{id}/os-images"}}}}}},"operationId":"postDedicatedByIdReinstall"}},"/dedicated/{id}/password":{"post":{"summary":"Set a new root password. On a provisioning-managed (Ironic) server this REBUILDS the server with its current image — ALL DATA IS ERASED; on other servers only the stored credential changes. 1 per 10 minutes.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"postDedicatedByIdPassword"}},"/dedicated/{id}/stats":{"get":{"summary":"Hardware statistics","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdStats"}},"/dedicated/{id}/traffic":{"get":{"summary":"Traffic usage","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Dedicated"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"operationId":"getDedicatedByIdTraffic"}},"/locations":{"get":{"summary":"Every datacentre the catalogue can currently be ordered in, with the `value` to send as an order's `location`, and `product_ids` naming the products that reach it. A location appears only while something can actually be built there, so this is shorter than the operator's location list. `?productId=<uuid>` (repeatable, or comma-separated, max 50) narrows it to those products.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"parameters":[{"name":"productId","in":"query","required":false,"schema":{"type":"string"},"description":"One or more product ids, repeated or comma-separated"}],"operationId":"getLocations"}},"/products":{"get":{"summary":"Orderable products with prices per cycle","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"operationId":"getProducts"}},"/products/{id}":{"get":{"summary":"Product with billing cycles, add-on options, `os_images` limited to images the order gate accepts (each carries `orderable`; `os_images_all` includes the rest; `default_os_image_id` is a safe choice), and `locations` — the datacentres this product can actually be built in, each with the `value` to send as the order's `location` and any per-location `surcharge`. `location_required` says whether the order will be refused without one; an empty `locations` beside `location_required: true` means the product is not sellable right now.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Product id","schema":{"type":"string","format":"uuid"}}],"operationId":"getProductsById"}},"/products/{id}/availability":{"get":{"summary":"Can this product be built RIGHT NOW. Read-only and side-effect free — nothing is created and nothing is billed — so it is safe to poll from a monitoring check. `available` is the boolean to read; `code` explains it (`available`, `no_capacity`, `location_unavailable`, `forced_unavailable`, `plan_disabled`, `no_location`, `unknown`, `sold_out`) and `reason` carries the fleet's own sentence. Without `?location=` the answer covers the product and `locations[]` gives the verdict per datacentre; with it, the answer is about that datacentre alone. For a VPS product this runs the plan's real sizing (vCPU, RAM, disk, addresses) through the same placement checks the provisioner applies — overcommit ratios, reserves, absolute sell ceilings and free disk. `code: 'unknown'` means the check could not be computed, NOT that the product is sold out: it never refuses an order.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Product id","schema":{"type":"string","format":"uuid"}},{"name":"location","in":"query","required":false,"schema":{"type":"string"},"description":"A `value` from GET /locations or GET /products/{id} → locations[]. Omit for every location at once."}],"operationId":"getProductsByIdAvailability"}},"/orders":{"get":{"summary":"List orders. `?hostname=` and `?idempotencyKey=` answer \"did the create I attempted actually land?\" after a timeout or a 5xx — `hostname` matches the order, any of its lines and any service built from it, case-insensitively.","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"},{"name":"hostname","in":"query","schema":{"type":"string"},"description":"Orders for this hostname (order, line or resulting service; case-insensitive)"},{"name":"idempotencyKey","in":"query","schema":{"type":"string","maxLength":255},"description":"The order created under this key, if any"}],"operationId":"getOrders"},"post":{"summary":"Create an order. Returns the order, its services and its invoice or proforma plus `document`/`settled`/`next_step`. Unless `settled` is true, pay the document via /invoices/{id}/pay or /proformas/{id}/pay; provisioning starts when it is paid. Hourly products need the minimum credit balance and are charged from credit without a document. Use an image with `orderable: true` from GET /products/{id}. Send an `Idempotency-Key` header (or `idempotencyKey` in the body) to make a retry safe: the key is stored on the order itself, so replaying it answers **200** with `idempotent: true` and the original order instead of creating a second one.","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CreateResult"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderBody"}}}},"operationId":"postOrders"}},"/orders/{id}":{"get":{"summary":"One order: `data.order` with `items[]` and `services[]` nested inside it (upgrades also appear here as orders)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products & Orders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Order id","schema":{"type":"string","format":"uuid"}}],"operationId":"getOrdersById"}},"/invoices":{"get":{"summary":"List invoices (?status=unpaid)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getInvoices"}},"/invoices/{id}":{"get":{"summary":"Invoice with line items, plus paid_amount / remaining_amount / settled","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"id","in":"path","required":true,"description":"Invoice id","schema":{"type":"string","format":"uuid"}}],"operationId":"getInvoicesById"}},"/invoices/{id}/pay":{"post":{"summary":"Pay from the credit balance","x-scope":"billing","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/PayResult"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Billing"],"parameters":[{"name":"id","in":"path","required":true,"description":"Invoice id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayBody"}}}},"operationId":"postInvoicesByIdPay"}},"/vps/{id}/capture":{"post":{"summary":"Capture this VPS into a reusable image you can deploy new servers from. Answers 202 — the image is built on the hypervisor and its status leaves \"capturing\" when it is ready. Charged per GB of stored image per month when the operator prices it.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"202":{"description":"Capture started","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CustomImage"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Custom Images"],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":120,"description":"What you will call this image when ordering from it"},"description":{"type":"string","maxLength":2000}}}}}},"operationId":"postVpsByIdCapture"}},"/custom-images":{"get":{"summary":"Base images you own, newest first","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Custom Images"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":20},"description":"Above 200 is clamped to 200. Default 20 (50 on /vps and /dedicated)."},{"name":"status","in":"query","schema":{"type":"string"},"description":"Filter by status"}],"operationId":"getCustomImages"},"post":{"summary":"Register a base image to deploy VPS orders from","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Custom Images"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomImageBody"}}}},"operationId":"postCustomImages"}},"/custom-images/{id}":{"get":{"summary":"One of your base images","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Custom Images"],"parameters":[{"name":"id","in":"path","required":true,"description":"Custom image id","schema":{"type":"string","format":"uuid"}}],"operationId":"getCustomImagesById"},"delete":{"summary":"Remove a base image. Servers already built from it are untouched.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Custom Images"],"parameters":[{"name":"id","in":"path","required":true,"description":"Custom image id","schema":{"type":"string","format":"uuid"}}],"operationId":"deleteCustomImagesById"}},"/projects":{"get":{"summary":"Your projects, with the resources each holds","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"A key bound to a project sees exactly one entry: its own.","operationId":"getProjects"},"post":{"summary":"Create a project","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Project"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"Refused (403 PROJECT_SCOPE_MISMATCH) for a key that is bound to a project — use an unbound key or the client panel.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBody"}}}},"operationId":"postProjects"}},"/projects/{id}":{"get":{"summary":"One project","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Project"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project id","schema":{"type":"string","format":"uuid"}}],"operationId":"getProjectsById"},"patch":{"summary":"Rename a project, or change its slug, description or colour","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Project"},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBody"}}}},"operationId":"patchProjectsById"},"delete":{"summary":"Delete a project","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"NEVER deletes what the project holds. While it still holds anything the call is refused with 409 and a count; pass `reassignTo` naming the project its resources should move to. The default project cannot be deleted. Any API key bound to the deleted project stops working.","parameters":[{"name":"id","in":"path","required":true,"description":"Project id","schema":{"type":"string","format":"uuid"}},{"name":"reassignTo","in":"query","schema":{"type":"string"},"description":"Project id or slug to move this project's resources into first."}],"operationId":"deleteProjectsById"}},"/projects/{id}/move":{"post":{"summary":"Move resources into this project","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Projects"],"description":"Reports partial success: ids that did not resolve come back in `skipped` with a reason, rather than being silently dropped.","parameters":[{"name":"id","in":"path","required":true,"description":"Project id","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMoveBody"}}}},"operationId":"postProjectsByIdMove"}},"/ssh-keys":{"get":{"summary":"Account SSH keys","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["SSH Keys"],"operationId":"getSshKeys"},"post":{"summary":"Add an SSH key","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["SSH Keys"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SshKeyBody"}}}},"operationId":"postSshKeys"}},"/ssh-keys/{id}":{"delete":{"summary":"Remove an SSH key","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (code BAD_REQUEST, `details[]` lists field errors) or the action does not apply to this service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing, invalid, expired or revoked API key (code UNAUTHORIZED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"Refused: SCOPE_REQUIRED (the `scope` field names it), FORBIDDEN (account permission / IP allowlist / service state), ACCOUNT_SUSPENDED, ACTION_NOT_ALLOWED, FEATURE_DISABLED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found, or not owned by this account (code NOT_FOUND) — the two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict (code CONFLICT or RENEWAL_PENDING), e.g. the instance is still being built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — per-key hourly window (code RATE_LIMITED, see X-RateLimit-* and Retry-After headers) or a per-service cool-down on this action (code ACTION_RATE_LIMITED: power 10/min, reinstall 1/5 min, password reset 1/10 min, renew 1/10 min, cancel 5/min, orders 30/15 min, pay 10/min)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The hosting provider refused or is unreachable (code PROVIDER_ERROR / PROVIDER_UNAVAILABLE) — retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["SSH Keys"],"parameters":[{"name":"id","in":"path","required":true,"description":"Key id","schema":{"type":"string","format":"uuid"}}],"operationId":"deleteSshKeysById"}}}}