{"openapi":"3.0.3","info":{"title":"FluxBilling Reseller API","version":"1","description":"The machine interface a reseller's own platform calls to buy, provision and manage services wholesale. Start with the usage guide at `/guide.md` (signing, ordering, lifecycle, webhooks); this document is the exact route contract. Every response is JSON in the `{success, data}` envelope, except the platform-wide feature gate (`403 {error, message, code: FEATURE_DISABLED}` when the reseller module is off). Every `POST`/`PUT`/`DELETE` must be HMAC-signed (`x-signed: true`)."},"servers":[{"url":"https://my.voxa.host/api/v1/reseller"}],"tags":[{"name":"Docs","description":"Documentation routes — no authentication"},{"name":"Products","description":"The wholesale catalogue and what an order form needs"},{"name":"Orders","description":"Placing orders, idempotency, reconciliation, payment retry"},{"name":"Services","description":"Lifecycle (suspend / unsuspend / terminate / change package) and device control"},{"name":"Game servers","description":"The game module's customer surface (files, backups, schedules, mods, console, SFTP), served for the reseller by the same handlers as the client panel"},{"name":"Plugin UI","description":"A visual plugin's client service page (provider, schema, panel actions) for plugin-provisioned services"},{"name":"Customers","description":"Your end-customer records — optional, used to attribute orders and to bind delegated keys"},{"name":"Account","description":"Saved payment methods and webhooks"}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"rsk_<prefix>_<secret>","description":"Reseller API key minted in the client portal (Reseller → API Settings) or by the operator. The secret is shown once."}},"parameters":{"Signature":{"name":"X-Reseller-Signature","in":"header","required":true,"schema":{"type":"string","pattern":"^hmac-sha256=[0-9a-f]{64}$"},"description":"`hmac-sha256=<hex>` of HMAC_SHA256(signing secret, `\"<X-Reseller-Timestamp>.\" + <raw request body>`). With no timestamp header, sign the raw body alone. For a body-less request the raw body is the empty string (or `{}` if you send that). Required on every POST/PUT/DELETE."},"Timestamp":{"name":"X-Reseller-Timestamp","in":"header","required":false,"schema":{"type":"string"},"description":"Unix time in seconds or milliseconds. Optional but strongly recommended: when present it is bound into the signature and enforced within ±300 s."}},"schemas":{"Envelope":{"type":"object","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"description":"Endpoint-specific payload"},"message":{"type":"string"}}},"ErrorEnvelope":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"description":"A message string — except for request validation, where it is `{ message: \"Validation failed\", details: [{ field, message }] }`","oneOf":[{"type":"string"},{"type":"object","properties":{"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}}}}]},"message":{"type":"string","description":"Present on errors raised by the platform error handler; same text as `error`"}}},"OffsetPagination":{"type":"object","description":"Used by `GET /orders`","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}},"PagePagination":{"type":"object","description":"Used by `GET /services` and `GET /customers`","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"Pricing":{"type":"object","description":"Wholesale prices in the supplier's base currency. A cycle the product is not sold on is `null`. Note the key `semiAnnual` here versus the value `semi-annually` sent on an order.","properties":{"currency":{"type":"string","example":"EUR"},"monthly":{"type":"number","nullable":true},"quarterly":{"type":"number","nullable":true},"semiAnnual":{"type":"number","nullable":true},"annual":{"type":"number","nullable":true},"hourly":{"type":"number","nullable":true},"setupFee":{"type":"number","nullable":true}}},"OptionPricing":{"type":"object","description":"An add-on at your wholesale, per cycle. Wholesale is the supplier's tier option price book when it has a figure for your tier, otherwise the retail figure minus your percentage discount (per product: a per-product override, else the better of your tier's rate — per product category when the supplier prices that way — and your default rate). `setupFee` is wholesale too; `retail` / `retailSetupFee` / `retailOneTime` carry the list prices for comparison and `discountRate` the percentage that applied.","properties":{"currency":{"type":"string","example":"EUR"},"monthly":{"type":"number","nullable":true},"quarterly":{"type":"number","nullable":true},"semiAnnual":{"type":"number","nullable":true},"annual":{"type":"number","nullable":true},"hourly":{"type":"number","nullable":true},"setupFee":{"type":"number","nullable":true},"oneTime":{"type":"number","nullable":true},"retail":{"type":"object","nullable":true,"additionalProperties":{"type":"number","nullable":true}},"retailSetupFee":{"type":"number","nullable":true},"retailOneTime":{"type":"number","nullable":true},"discountRate":{"type":"number","nullable":true,"description":"Percentage applied when no price-book figure exists"}}},"Product":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"currency":{"type":"string","description":"Supplier base currency; every wholesale figure is in it"},"pricing":{"$ref":"#/components/schemas/Pricing"},"specs":{"type":"object","additionalProperties":true},"options":{"type":"array","description":"The add-ons you may order with this product; `id` is what `options[].optionId` on `POST /orders` accepts","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"pricingType":{"type":"string","enum":["recurring","one_time"]},"maxQuantity":{"type":"integer","nullable":true},"pricing":{"$ref":"#/components/schemas/OptionPricing"}}}}}},"ProductSchema":{"type":"object","properties":{"productId":{"type":"string","format":"uuid"},"productName":{"type":"string"},"category":{"type":"string","nullable":true},"billingEnabled":{"type":"boolean","nullable":true},"billingCycles":{"type":"array","items":{"type":"string","enum":["monthly","quarterly","semi-annually","annually","hourly"]},"description":"Exactly the cycles `POST /orders` accepts for this product"},"orderSchema":{"nullable":true,"type":"object","description":"Plugin order form, when the product is plugin-provisioned: `{ fields: [], layout: {} }`","properties":{"fields":{"type":"array","items":{"type":"object"}},"layout":{"type":"object"}}},"pluginDefaults":{"type":"object","additionalProperties":true},"requiredFields":{"type":"array","items":{"type":"string"},"description":"Always contains `billingCycle`; adds `location` when the product prices locations and any required plugin field"},"osImages":{"type":"array","description":"Native VPS only: the OS images an order may name in `configuration.osImageId`","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"family":{"type":"string","nullable":true},"distro":{"type":"string","nullable":true},"version":{"type":"string","nullable":true},"isDefault":{"type":"boolean"}}}},"osImageField":{"type":"string","enum":["osImageId"],"description":"Native VPS only: the configuration key to send the image id under"},"hostnamePattern":{"type":"string","description":"Native VPS only: regex `configuration.hostname` must match"},"locationField":{"type":"string","enum":["location"]},"locationRequired":{"type":"boolean"},"locationPricing":{"type":"array","description":"Present when the product prices locations. Send `value` as `configuration.location`","items":{"type":"object","additionalProperties":true}}}},"OrderCreate":{"type":"object","required":["productId","billingCycle"],"properties":{"productId":{"type":"string","format":"uuid"},"billingCycle":{"type":"string","enum":["monthly","quarterly","semi-annually","annually","hourly"]},"quantity":{"type":"integer","minimum":1,"maximum":100,"default":1,"description":"Creates this many separate services; the setup fee applies to each"},"externalOrderId":{"type":"string","maxLength":100,"description":"YOUR order id — the idempotency key. Always send it. Unique per reseller"},"externalCustomerId":{"type":"string","description":"Your customer id; creates or reuses a customer record and attributes the order to it"},"externalCustomerEmail":{"type":"string","format":"email"},"externalCustomerName":{"type":"string"},"configuration":{"type":"object","additionalProperties":true,"description":"Free-form provisioning configuration. Known keys: `hostname`, `location` (required when the product prices locations), `osImageId` (native VPS), `externalServiceId`, plus the native-VPS first-boot keys `user_data` (a `#cloud-config` document or a `#!` script, max 64 KB, re-applied on reinstall) and `ssh_keys` (OpenSSH public keys authorised for root)","example":{"hostname":"web01","location":"de1"}},"options":{"type":"array","maxItems":50,"description":"Configurable options charged with the order at your wholesale: the tier option price when the supplier set one for your tier, otherwise retail minus your percentage discount (option setup fees follow the same rule)","items":{"type":"object","required":["optionId"],"properties":{"optionId":{"type":"string","format":"uuid"},"quantity":{"type":"integer","minimum":1,"maximum":100,"default":1}}}},"paymentMethodId":{"type":"string","format":"uuid","description":"Charge a specific saved payment method instead of the default (saved-method payment mode only)"}}},"OrderResult":{"type":"object","properties":{"orderId":{"type":"string","format":"uuid"},"orderNumber":{"type":"string","example":"RSL-1735689600000-AB12CD"},"externalOrderId":{"type":"string","nullable":true},"status":{"type":"string","enum":["paid","invoiced","payment_failed","provisioning_failed"]},"paymentStatus":{"type":"string","enum":["paid","pending","failed"]},"paymentMode":{"type":"string","enum":["saved_method","credit","invoice"],"description":"How the supplier collects from you — a supplier-wide setting"},"amount":{"type":"number","description":"What you are charged, in `currency`"},"currency":{"type":"string","description":"Your account currency; falls back to the supplier base currency when no rate is available"},"invoiceId":{"type":"string","format":"uuid","nullable":true},"services":{"type":"array","items":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"status":{"type":"string","example":"pending"}}}},"options":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"setupFee":{"type":"number"}}}},"message":{"type":"string"},"idempotent":{"type":"boolean","description":"Only on the 200 replay: this `externalOrderId` already existed. The replayed row is the reconciliation shape (`provisioningStatus`, `proformaId`, `createdAt`, `services[]`) rather than this one"}}},"OrderRow":{"type":"object","description":"Row shape of `GET /orders` and `GET /orders/{orderId}` (snake_case, straight from the database)","properties":{"id":{"type":"string","format":"uuid"},"order_number":{"type":"string"},"status":{"type":"string","description":"Platform order status (`pending`, `active`, …)"},"billing_cycle":{"type":"string"},"total_amount":{"type":"string","description":"Base-currency total (numeric as string)"},"created_at":{"type":"string","format":"date-time"},"external_order_id":{"type":"string","nullable":true},"payment_status":{"type":"string","enum":["pending","paid","failed","processing","refunded"]},"provisioning_status":{"type":"string","nullable":true,"enum":["provisioned","pending","failed",null]},"provisioning_error":{"type":"string","nullable":true,"description":"Single-order read only"},"wholesale_amount":{"type":"string","description":"What you were charged, in `currency`"},"currency":{"type":"string"},"payment_failed_reason":{"type":"string","nullable":true},"invoice_id":{"type":"string","nullable":true},"external_customer_id":{"type":"string","nullable":true},"external_customer_email":{"type":"string","nullable":true},"external_customer_name":{"type":"string","nullable":true},"product_name":{"type":"string"},"services":{"type":"array","items":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"status":{"type":"string"},"hostname":{"type":"string","nullable":true},"serverIp":{"type":"string","nullable":true}}}}}},"RetryResult":{"type":"object","properties":{"orderId":{"type":"string","format":"uuid"},"externalOrderId":{"type":"string","nullable":true},"status":{"type":"string","enum":["paid","invoiced","provisioning_failed"]},"paymentMode":{"type":"string"},"invoiceId":{"type":"string","nullable":true},"services":{"type":"array","items":{"type":"object","properties":{"serviceId":{"type":"string"},"status":{"type":"string"}}}}}},"Service":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"externalServiceId":{"type":"string","nullable":true,"description":"`configuration.externalServiceId` from the order, if you sent one"},"externalCustomerId":{"type":"string","nullable":true},"productName":{"type":"string"},"status":{"type":"string","enum":["pending","pending_payment","installing","active","suspended","provisioning_failed","cancelled","terminated","fraud"],"description":"Platform service status (the nine values the platform stores; there is no provisioning)"},"serverIp":{"type":"string","nullable":true},"hostname":{"type":"string","nullable":true},"serverLocation":{"type":"string","nullable":true,"description":"Single-service read only"},"serverPort":{"type":"integer","nullable":true,"description":"Single-service read only"},"billingCycle":{"type":"string"},"wholesaleAmount":{"type":"string","description":"Per-cycle wholesale amount in the supplier base currency (numeric as string)"},"nextDueDate":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"Capabilities":{"type":"object","description":"What this service can be asked to do. Read it before offering a button — the supplier can switch controls off per product","properties":{"backend":{"type":"string","nullable":true,"enum":["vps","dedicated","upstream","plugin",null],"description":"`null` = no remote controls at all"},"power":{"type":"boolean"},"powerActions":{"type":"array","items":{"type":"string","enum":["start","stop","restart"]}},"stats":{"type":"boolean"},"console":{"type":"boolean"},"reinstall":{"type":"boolean"},"password":{"type":"boolean"},"backups":{"type":"boolean"}}},"OsTemplates":{"type":"object","properties":{"templates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Image UUID on native VPS / dedicated; provider template name on plugin backends"},"name":{"type":"string"}},"additionalProperties":true}},"platform":{"type":"string","description":"`native` for VPS, the plugin slug for plugin backends; absent on dedicated"}}},"ServiceDocument":{"type":"object","description":"Everything the supplier's own service page renders, keyed by `kind`. Render the section named by `kind`; `features` says which panels apply and `capabilities` which controls the service accepts","required":["kind","serviceId","service","capabilities","features","options","upgrades","network"],"properties":{"kind":{"type":"string","enum":["dedicated","vps","ip-transit","colocation","game","plugin","generic"]},"serviceId":{"type":"string","format":"uuid"},"generatedAt":{"type":"string","format":"date-time"},"service":{"type":"object","additionalProperties":true,"description":"The service as the supplier's client panel sees it: `id`, `name`, `hostname`, `status`, `serverIp`, `serverLocation`, `serverPort`, `billingCycle`, `nextDueDate`, `createdAt`, `deliveredAt`, `productName`, `productSpecs`, `osImage {name, logoUrl}`"},"capabilities":{"$ref":"#/components/schemas/Capabilities"},"features":{"type":"object","description":"Panel switches — `true` means the supplier's own page shows that panel for this service","properties":{"power":{"type":"boolean"},"console":{"type":"boolean"},"reinstall":{"type":"boolean"},"password_reset":{"type":"boolean"},"stats":{"type":"boolean"},"backups":{"type":"boolean"},"snapshots":{"type":"boolean"},"subnets":{"type":"boolean"},"nics":{"type":"boolean"},"storage":{"type":"boolean"},"location":{"type":"boolean"},"traffic":{"type":"boolean"},"hardware_health":{"type":"boolean"},"rdns":{"type":"boolean"},"rescue":{"type":"boolean"},"ssh_keys":{"type":"boolean"}}},"options":{"$ref":"#/components/schemas/ServiceOptions"},"upgrades":{"$ref":"#/components/schemas/ServiceUpgrades"},"network":{"$ref":"#/components/schemas/ServiceNetwork"},"dedicated":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: dedicated` — `specs`, `location`, `datacenter`, `rack`, `provisioning`, `os_installation`, `features` (reinstall / password_reset / rescue / rdns / hardware_health), `nics[]`, `storage[]`"},"vps":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: vps` — `capabilities` (per-product switches), `ipAddresses[]`, `osName`, `location`"},"ipTransit":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: ip-transit` — `portDetails`, `bgp`, `selfService`, `allocations[]`, `bandwidth`"},"colocation":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: colocation` — `device`, `crossConnects[]`, `ipamAllocations[]`"},"game":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: game` — the game server document (`game_state`, ports, players, backups quota)"},"plugin":{"type":"object","additionalProperties":true,"nullable":true,"description":"`kind: plugin` — provider slug plus the provider's sanitised service data"}}},"ServiceOptions":{"type":"object","description":"Add-ons on the service and add-ons still available to it. Prices are what YOU pay per cycle (`priceBasis: wholesale`)","properties":{"priceBasis":{"type":"string","enum":["wholesale","retail"]},"active":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"quantity":{"type":"integer"},"status":{"type":"string"},"amount":{"type":"number","nullable":true,"description":"Unit price per cycle at your wholesale"},"setupFee":{"type":"number","nullable":true}}}},"available":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"price":{"type":"number","nullable":true},"setupFee":{"type":"number","nullable":true},"maxQuantity":{"type":"integer","nullable":true}}}}}},"ServiceOptionsChange":{"type":"object","description":"What `PUT .../options` did to the service, and what it cost you","properties":{"serviceId":{"type":"string","format":"uuid"},"added":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"quantity":{"type":"integer"},"unitPrice":{"type":"number"},"setupFee":{"type":"number"}}}},"increased":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"delta":{"type":"integer"},"unitPrice":{"type":"number"}}}},"decreased":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"delta":{"type":"integer"}}}},"removed":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"quantity":{"type":"integer"}}}},"unchanged":{"type":"array","items":{"type":"object","properties":{"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"quantity":{"type":"integer"}}}},"charge":{"type":"object","nullable":true,"description":"`null` when nothing had to be paid","properties":{"orderId":{"type":"string","format":"uuid","description":"Retry a failed charge with `POST /orders/{orderId}/retry`"},"amount":{"type":"number"},"currency":{"type":"string"},"baseAmount":{"type":"number"},"baseCurrency":{"type":"string"},"paymentMode":{"type":"string","enum":["saved_method","credit","invoice"]},"paymentStatus":{"type":"string","enum":["paid","invoiced","failed"]},"invoiceId":{"type":"string","format":"uuid","nullable":true},"proformaId":{"type":"string","format":"uuid","nullable":true},"reason":{"type":"string","nullable":true}}},"options":{"type":"array","description":"The live add-on rows after the change","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string","format":"uuid"},"optionId":{"type":"string","format":"uuid"},"name":{"type":"string"},"quantity":{"type":"integer"},"status":{"type":"string"},"unitPrice":{"type":"number","nullable":true},"nextDueDate":{"type":"string","nullable":true}}}}}},"ServiceUpgrades":{"type":"object","description":"Upgrade paths the supplier enabled from this service's product, priced at wholesale; `pendingUpgrade` is set while one is in flight","properties":{"available":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"productId":{"type":"string","format":"uuid"},"name":{"type":"string"},"price":{"type":"number","nullable":true}}}},"addons":{"type":"object","additionalProperties":true,"nullable":true},"pendingUpgrade":{"type":"object","additionalProperties":true,"nullable":true},"unavailableReason":{"type":"string","description":"Present when the upgrade catalogue could not be read"}}},"ServiceNetwork":{"type":"object","description":"Addresses on the service. Dedicated servers list subnets, addresses and rDNS records; a VPS its addresses; IP transit and colocation their IPAM allocations","properties":{"kind":{"type":"string"},"subnets":{"type":"array","items":{"type":"object","additionalProperties":true}},"ipAddresses":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string","format":"uuid"},"ip_address":{"type":"string"},"gateway":{"type":"string","nullable":true},"reverse_dns":{"type":"string","nullable":true}}}},"allocations":{"type":"array","items":{"type":"object","additionalProperties":true}},"rdns":{"type":"array","nullable":true,"items":{"type":"object","additionalProperties":true}}}},"ServiceTraffic":{"type":"object","description":"Bandwidth for the requested range. Rates are BITS per second; totals are BYTES. Native VPS, dedicated servers and IP transit","properties":{"kind":{"type":"string"},"range":{"type":"string","enum":["1h","6h","24h","7d","30d"]},"collecting":{"type":"boolean","description":"VPS: no samples yet — the graph is empty, not broken"},"samples":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"time":{"type":"string","format":"date-time"},"in":{"type":"integer","description":"bits/sec in"},"out":{"type":"integer","description":"bits/sec out"}}}},"daily":{"type":"array","description":"VPS only: the nightly rx/tx rollup, which survives sample retention and counter resets — the series to quote or bill from","items":{"type":"object","properties":{"day":{"type":"string","example":"2026-09-14"},"rx_bytes":{"type":"integer"},"tx_bytes":{"type":"integer"}}}},"summary":{"type":"object","additionalProperties":true,"nullable":true,"description":"`avgIn`/`avgOut`, `maxIn`/`maxOut`, `p95In`/`p95Out` (bits/sec) and `totalSamples`"},"monthTotal":{"type":"object","nullable":true,"additionalProperties":true,"properties":{"total_bytes_in":{"type":"integer"},"total_bytes_out":{"type":"integer"}},"description":"Month-to-date, in bytes"}}},"ServiceStats":{"type":"object","description":"Resource usage. The shape is the backend's: a native VPS returns the block below; a dedicated server returns hardware specs (`cpu`, `ram`, `storage` are strings, not utilisation) plus `powerState`, `health` and the same `network` block from its switch port; a plugin returns the provider's own object. Every figure the supplier cannot read right now is `null`, never `0`","properties":{"platform":{"type":"string","example":"native"},"collecting":{"type":"boolean","description":"True until two samples exist — the VM is fine, the graph is just empty"},"stats":{"type":"object","additionalProperties":true,"properties":{"status":{"type":"string","example":"running"},"cpu":{"type":"object","properties":{"usage":{"type":"number","nullable":true,"description":"Percent of the whole VM"},"cores":{"type":"integer","nullable":true,"description":"vCPU count"}}},"memory":{"type":"object","properties":{"percentage":{"type":"number","nullable":true},"used":{"type":"integer","nullable":true,"description":"bytes"},"cached":{"type":"integer","nullable":true,"description":"bytes"},"total":{"type":"integer","nullable":true,"description":"bytes"},"source":{"type":"string","nullable":true,"enum":["guest","host_rss",null],"description":"`guest` is the guest's own figure; `host_rss` is the hypervisor process and runs high"}}},"disk":{"type":"object","properties":{"percentage":{"type":"number","nullable":true},"used":{"type":"integer","nullable":true,"description":"bytes the guest has written"},"total":{"type":"integer","nullable":true,"description":"bytes the guest FORMATTED — what it actually fills up at"},"allocated":{"type":"integer","nullable":true,"description":"bytes purchased (the sum of the VM's volumes)"},"source":{"type":"string","nullable":true,"enum":["guest","guest_daily",null],"description":"`guest_daily` is the once-a-day OS sweep, up to 24 h old"},"read_bps":{"type":"integer","nullable":true,"description":"bytes/sec"},"write_bps":{"type":"integer","nullable":true,"description":"bytes/sec"},"read_iops":{"type":"integer","nullable":true},"write_iops":{"type":"integer","nullable":true}}},"network":{"type":"object","properties":{"rx_bps":{"type":"integer","nullable":true,"description":"BITS per second in, right now"},"tx_bps":{"type":"integer","nullable":true,"description":"BITS per second out, right now"},"netin_bytes":{"type":"integer","nullable":true,"description":"Cumulative bytes in since the VM last BOOTED — resets on reboot and migration. Always null on a dedicated server, whose port is sampled rather than read"},"netout_bytes":{"type":"integer","nullable":true,"description":"Cumulative bytes out since the VM last booted"},"month_netin_bytes":{"type":"integer","nullable":true,"description":"Bytes in this calendar month, from the nightly rollup — survives reboots and sample retention. Quote this one"},"month_netout_bytes":{"type":"integer","nullable":true,"description":"Bytes out this calendar month"},"sampledAt":{"type":"string","format":"date-time","nullable":true,"description":"Dedicated only: when the port was last read"}}}}},"series":{"type":"array","description":"Up to 24 h of derived samples: `t`, `cpu_pct`, `mem_used_bytes`, `mem_pct`, `disk_used_bytes`, `disk_pct`, `disk_rd_bps`/`disk_wr_bps`, `net_rx_bps`/`net_tx_bps` (bits/sec) and per-device `disks[]` / `nics[]`","items":{"type":"object","additionalProperties":true}}},"additionalProperties":true},"ConsoleSession":{"type":"object","description":"A one-shot browser console session on the SUPPLIER. Open your viewer against `origin` (the websocket lives there, not on your platform)","properties":{"kind":{"type":"string"},"sessionId":{"type":"string"},"token":{"type":"string"},"wsPath":{"type":"string"},"origin":{"type":"string","format":"uri"},"viewerKind":{"type":"string","description":"`novnc` for a VPS, `kvm` / `html5` for a dedicated server"},"rfbPassword":{"type":"string","nullable":true},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"ConsoleCast":{"type":"object","description":"A supplier-hosted console PAGE. `url` is the whole thing: open it in a tab or an iframe, no account with the supplier needed — which is why the URL is a credential. It is returned once, at creation; the list endpoint never repeats it","properties":{"id":{"type":"string","format":"uuid","description":"Revoke with this"},"serviceId":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri","nullable":true,"description":"Creation only — `null` in listings"},"ticket":{"type":"string","description":"Creation only: the secret inside `url`"},"label":{"type":"string","nullable":true,"description":"Shown in the page header; defaults to the hostname"},"viewOnly":{"type":"boolean","description":"Read-only, enforced by the supplier's relay rather than by the page"},"status":{"type":"string","enum":["pending","open","expired","revoked"]},"openExpiresAt":{"type":"string","format":"date-time","description":"Deadline for the FIRST open"},"viewerTtlSeconds":{"type":"integer","description":"Length of the viewing window, which starts at that first open"},"viewerExpiresAt":{"type":"string","format":"date-time","nullable":true,"description":"Null until the link is opened"},"firstOpenedAt":{"type":"string","format":"date-time","nullable":true},"lastOpenedAt":{"type":"string","format":"date-time","nullable":true},"openCount":{"type":"integer","description":"Each open mints a fresh console session — a refresh or a reconnect is one more"},"revokedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"SshKey":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"fingerprint":{"type":"string"},"type":{"type":"string"},"attached":{"type":"boolean","description":"Attached to this service (applied on its next reinstall)"}},"additionalProperties":true},"LifecycleResult":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["suspended","active","terminated"]},"actions":{"type":"array","items":{"type":"object"},"description":"Provider-side steps that ran"},"alreadyTerminated":{"type":"boolean","description":"Terminate only: the service was already terminated; nothing ran"}}},"PackageChange":{"type":"object","properties":{"serviceId":{"type":"string","format":"uuid"},"upgradeId":{"type":"string","format":"uuid","nullable":true},"status":{"type":"string","description":"Upgrade request status, e.g. `pending`, `awaiting_admin`"},"billingDocumentType":{"type":"string","nullable":true,"enum":["invoice","proforma",null],"description":"`null` when the change costs nothing and executes immediately"},"billingDocumentId":{"type":"string","format":"uuid","nullable":true},"billingDocumentNumber":{"type":"string","nullable":true},"orderId":{"type":"string","format":"uuid","nullable":true},"message":{"type":"string"}}},"Customer":{"type":"object","description":"A `reseller_customers` row (snake_case)","properties":{"id":{"type":"string","format":"uuid"},"reseller_id":{"type":"string","format":"uuid"},"external_customer_id":{"type":"string"},"external_customer_email":{"type":"string","nullable":true},"external_customer_name":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":true},"service_count":{"type":"string","description":"List only; a customer-bound key gets a reduced row without it"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"PaymentMethod":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","example":"card"},"label":{"type":"string"},"cardBrand":{"type":"string","nullable":true},"cardLastFour":{"type":"string","nullable":true},"isDefault":{"type":"boolean"},"lastUsedAt":{"type":"string","format":"date-time","nullable":true}}},"WebhookDelivery":{"type":"object","description":"Body of every webhook delivery. Headers: `X-Webhook-Signature` (`hmac-sha256=<hex>` over the raw body, same secret), `X-Webhook-Event`, `X-Webhook-Id` (dedupe key), `X-Webhook-Timestamp`","properties":{"event":{"type":"string","enum":["order.paid","order.invoiced","order.payment_failed","service.provisioned","service.provisioning_failed","service.suspended","service.unsuspended","service.terminated","webhook.test"]},"timestamp":{"type":"string","format":"date-time","description":"Same value as `X-Webhook-Timestamp`; new on every attempt"},"data":{"type":"object","additionalProperties":true,"description":"Order events: `orderId`, `orderNumber`, `externalOrderId`, `externalCustomerId`, `status`, `paymentMode`, and where known `amount`, `invoiceId`, `paymentError`, `provisioningError`, `services[]`. Service events: `serviceId`, `orderId`, `externalOrderId`, `externalCustomerId`, `status`, `serverIp`, `hostname`, and `reason` where known"}}}}},"paths":{"/docs":{"get":{"summary":"Human-readable documentation page (guide + endpoint index) — no authentication","tags":["Docs"],"security":[],"responses":{"200":{"description":"text/html"},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"operationId":"getDocs"}},"/guide.md":{"get":{"summary":"Usage guide in Markdown: signing, ordering, lifecycle, webhooks, WHMCS — no authentication","tags":["Docs"],"security":[],"responses":{"200":{"description":"text/markdown"},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"operationId":"getGuideMd"}},"/openapi.json":{"get":{"summary":"This document — no authentication","tags":["Docs"],"security":[],"responses":{"200":{"description":"application/json"},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"operationId":"getOpenapiJson"}},"/products":{"get":{"summary":"Wholesale catalogue: every product enabled for you, with your prices per cycle","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK — the top level also carries `currency`","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products"],"operationId":"getProducts"}},"/products/{productId}":{"get":{"summary":"One product with your wholesale prices","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/Product"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products"],"parameters":[{"name":"productId","in":"path","required":true,"description":"Product id from `GET /products`","schema":{"type":"string","format":"uuid"}}],"operationId":"getProductsByProductId"}},"/products/{productId}/schema":{"get":{"summary":"What an order for this product needs: accepted cycles, required fields, OS images, priced locations, plugin form","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/ProductSchema"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Products"],"parameters":[{"name":"productId","in":"path","required":true,"description":"Product id from `GET /products`","schema":{"type":"string","format":"uuid"}}],"operationId":"getProductsByProductIdSchema"}},"/orders":{"post":{"summary":"Place an order. Send `externalOrderId` — it is your idempotency key","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Already existed for this `externalOrderId` (`idempotent: true`); nothing was charged again","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/OrderResult"}}}}}},"201":{"description":"Created — read `data.status`","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/OrderResult"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"**Payment succeeded but the service could not be created.** The charge stands, the supplier is alerted. Do not retry — quote `data.orderId`. Body carries `success:false`, `error` and the same `data` object with `status: \"provisioning_failed\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Orders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreate"}}}},"x-signed":true,"parameters":[{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"operationId":"postOrders"},"get":{"summary":"List your orders — reconcile with `?externalOrderId=` after a timed-out create","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK — every row carries `services[]`","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/OrderRow"}},"pagination":{"$ref":"#/components/schemas/OffsetPagination"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Orders"],"parameters":[{"name":"externalOrderId","in":"query","schema":{"type":"string","maxLength":100}},{"name":"status","in":"query","schema":{"type":"string","enum":["pending","processing","paid","failed","refunded"]},"description":"Filters on payment status"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"operationId":"getOrders"}},"/orders/{orderId}":{"get":{"summary":"One order, with its services and any provisioning error","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/OrderRow"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Orders"],"parameters":[{"name":"orderId","in":"path","required":true,"description":"Order id (`orderId` from `POST /orders`)","schema":{"type":"string","format":"uuid"}}],"operationId":"getOrdersByOrderId"}},"/orders/{orderId}/retry":{"post":{"summary":"Retry payment on a `payment_failed` order; creates the services on success","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/RetryResult"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"502":{"description":"Payment succeeded but the service could not be created — same contract as `POST /orders`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Orders"],"parameters":[{"name":"orderId","in":"path","required":true,"description":"Order id (`orderId` from `POST /orders`)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"paymentMethodId":{"type":"string","format":"uuid"}}}}}},"x-signed":true,"operationId":"postOrdersByOrderIdRetry"}},"/services":{"get":{"summary":"List your services","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/Service"}},"pagination":{"$ref":"#/components/schemas/PagePagination"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","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,"default":20}},{"name":"status","in":"query","schema":{"type":"string"},"description":"Platform service status, e.g. `active`, `suspended`, `terminated`"},{"name":"externalCustomerId","in":"query","schema":{"type":"string"},"description":"Only services attributed to this customer of yours"}],"operationId":"getServices"}},"/services/{serviceId}":{"get":{"summary":"One service","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/Service"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceId"},"delete":{"summary":"Terminate — irreversible, and the ONLY call that stops your wholesale billing. Idempotent","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/LifecycleResult"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"Send no body and sign the empty string (with a timestamp), or send `{}` and sign that. A second call on a terminated service answers 200 with `alreadyTerminated: true`.","x-signed":true,"operationId":"deleteServicesByServiceId"}},"/services/{serviceId}/power":{"post":{"summary":"Power action","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Provider result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"424":{"description":"Dedicated server: the management controller accepted the call but the action failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["start","stop","restart","shutdown"],"description":"`shutdown` is a graceful stop; check `powerActions` in capabilities"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdPower"}},"/services/{serviceId}/suspend":{"post":{"summary":"Suspend your customer's service. Does NOT pause what you owe","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/LifecycleResult"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdSuspend"}},"/services/{serviceId}/unsuspend":{"post":{"summary":"Lift a suspension","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/LifecycleResult"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdUnsuspend"}},"/services/{serviceId}/change-package":{"post":{"summary":"Move the service to another product (`_ChangePackage`). Asynchronous: 202 with a billing document","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"202":{"description":"Accepted — applies once `billingDocumentId` is settled (immediately when `billingDocumentType` is null)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/PackageChange"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["productId"],"properties":{"productId":{"type":"string","format":"uuid","description":"Target product — must be in your catalogue and priced on this service's cycle"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdChangePackage"}},"/services/{serviceId}/capabilities":{"get":{"summary":"Which controls this service supports — read before offering any button","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/Capabilities"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdCapabilities"}},"/services/{serviceId}/os-templates":{"get":{"summary":"Valid `osTemplate` values for a reinstall","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/OsTemplates"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdOsTemplates"}},"/services/{serviceId}/stats":{"get":{"summary":"Resource usage: CPU, memory, disk and network in/out","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/ServiceStats"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"description":"Live utilisation for the service. A native VPS reports CPU, memory, disk (usage AND I/O) and network — both the instantaneous bits/sec rate and the cumulative netin/netout byte counters, since-boot and month-to-date. A dedicated server has no agent in the customer's OS, so its `cpu`/`ram`/`storage` are hardware specs and only `network` and `powerState` are live. Game servers have no telemetry and answer 400. Poll no faster than the supplier samples (~10 min for a VPS); anything unreadable is `null`, never `0`.","operationId":"getServicesByServiceIdStats"}},"/services/{serviceId}/console":{"get":{"summary":"Open a one-shot console session (VNC/KVM) — short-lived URL, fetch at click time","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Backend-specific session: native VPS `{type:\"novnc\", sessionId, token, wsPath, expiresAt, websocketUrl}` (point a VNC-over-websocket client at `websocketUrl`); dedicated `{type:\"kvm\", available, …}`; a plugin may return its provider's URL. No browser URL for VPS/dedicated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdConsole"}},"/services/{serviceId}/capture":{"post":{"summary":"Capture this VPS into a reusable image you can deploy new servers from. The server keeps running. Answers 202 — poll `GET /images` until the image leaves `capturing`. The image is stored on the node the server runs on, so servers you deploy from it are built there too, and its storage is charged monthly by size when the supplier prices it.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"202":{"description":"`data` is the image row, `status: \"capturing\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":120},"description":{"type":"string","maxLength":2000}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdCapture"}},"/images":{"get":{"summary":"Images you hold, newest first","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"operationId":"getImages"}},"/images/{imageId}":{"delete":{"summary":"Delete an image and stop its storage charge. Servers already built from it are untouched.","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message` names the image","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"imageId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"x-signed":true,"operationId":"deleteImagesByImageId"}},"/services/{serviceId}/reinstall":{"post":{"summary":"Reinstall the operating system. Destroys data","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"OS reinstall initiated\"`; `data` is the backend's job result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"The provider plugin refused the reinstall","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"osTemplate":{"type":"string","description":"From `GET .../os-templates`: an image UUID on native VPS / dedicated, a provider template name on plugin backends"},"osImageId":{"type":"string","format":"uuid","description":"Explicit spelling of the UUID form; either this or `osTemplate` is required"},"password":{"type":"string","minLength":8,"description":"Root password. Required on native VPS; bare metal generates its own"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdReinstall"}},"/services/{serviceId}/password":{"post":{"summary":"Reset the root password","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Password changed successfully\"`; bare metal returns the generated password in `data`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":8,"description":"Required on every backend except bare metal, which generates one and returns it"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdPassword"}},"/services/{serviceId}/backups":{"get":{"summary":"List backups / snapshots","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Native VPS: `data.snapshots[]` plus `used`/`max`; other backends `data.backups[]` — shape is the backend's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdBackups"},"post":{"summary":"Create a backup / snapshot","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Backup creation initiated\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdBackups"}},"/services/{serviceId}/backups/{backupId}/restore":{"post":{"summary":"Restore a backup / snapshot. Destroys the current disk state","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Backup restore initiated\"`; `data` is the backend's job result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"backupId","in":"path","required":true,"description":"Backup / snapshot id from `GET .../backups` (`snapshots[].id` on a native VPS)","schema":{"type":"string","maxLength":200}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"string","description":"Native VPS: the snapshot's name, typed back as confirmation"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdBackupsByBackupIdRestore"}},"/services/{serviceId}/backups/{backupId}":{"delete":{"summary":"Delete a backup / snapshot","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Backup deleted\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"backupId","in":"path","required":true,"description":"Backup / snapshot id from `GET .../backups` (`snapshots[].id` on a native VPS)","schema":{"type":"string","maxLength":200}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdBackupsByBackupId"}},"/services/{serviceId}/document":{"get":{"summary":"The whole service page in one read: kind, service, capabilities, feature switches, kind section, add-ons and upgrades at wholesale, network","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/ServiceDocument"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"description":"Everything the supplier's own client panel renders for this service, so your storefront can show the same page. `kind` names the section to render (`dedicated`, `vps`, `ip-transit`, `colocation`, `game`, `plugin`, `generic`); `features` says which panels apply. Live sub-resources (traffic, health, network, console) have their own routes because they hit hardware.","operationId":"getServicesByServiceIdDocument"}},"/services/{serviceId}/traffic":{"get":{"summary":"Network in/out over time (VPS, dedicated, IP transit)","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/ServiceTraffic"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"range","in":"query","schema":{"type":"string","enum":["1h","6h","24h","7d","30d"],"default":"24h"}}],"operationId":"getServicesByServiceIdTraffic"}},"/services/{serviceId}/health":{"get":{"summary":"Hardware health from the management controller (dedicated): temperatures, fans, power supplies","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`data.{available, thermal, power, cachedAt}` — cached for 60 s; `available: false` with a `reason` when the controller cannot be reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdHealth"}},"/services/{serviceId}/network":{"get":{"summary":"Subnets, addresses, allocations and rDNS records","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/ServiceNetwork"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdNetwork"}},"/services/{serviceId}/rdns":{"put":{"summary":"Set or clear reverse DNS on one of the server's addresses (dedicated)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"rDNS updated\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ipAddressId"],"properties":{"ipAddressId":{"type":"string","format":"uuid","description":"`ipAddresses[].id` from `GET .../network`"},"hostname":{"type":"string","nullable":true,"maxLength":255,"description":"Omit or send null to clear"}}}}}},"x-signed":true,"operationId":"putServicesByServiceIdRdns"}},"/services/{serviceId}/ssh-keys":{"get":{"summary":"SSH keys attached to the service — applied on its next reinstall (dedicated)","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/SshKey"}}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdSshKeys"},"post":{"summary":"Attach an SSH key: an existing `sshKeyId`, or a `publicKey` (+ `name`) to store and attach in one call","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"SSH key attached; applied on the next reinstall\"`, `data.sshKeyId`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sshKeyId":{"type":"string","format":"uuid"},"publicKey":{"type":"string","description":"OpenSSH public key line (ssh-ed25519 / ssh-rsa / ecdsa)"},"name":{"type":"string","maxLength":100}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdSshKeys"}},"/services/{serviceId}/ssh-keys/{keyId}":{"delete":{"summary":"Detach an SSH key from the service","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"SSH key detached\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"keyId","in":"path","required":true,"description":"SSH key id (`sshKeyId` from `GET .../ssh-keys`)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdSshKeysByKeyId"}},"/services/{serviceId}/console-session":{"post":{"summary":"Create a browser console session your OWN viewer can open — the websocket stays on the supplier (`origin`)","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/ConsoleSession"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","description":"Dedicated servers: `html5` (default) or `kvm`"}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdConsoleSession"}},"/services/{serviceId}/console-cast":{"post":{"summary":"Cast the console into a page you do not host — returns a URL to open","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Console link created\"`; `data.url` is the page — it is shown once","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ConsoleCast"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"For a partner with no VNC client of their own. The supplier serves the console page; you hand out the URL, iframe it, or put it behind a button. TWO CLOCKS: `openTtlSeconds` bounds the FIRST open, `viewerTtlSeconds` is the viewing window that starts there — inside it the link may be re-opened, and each open mints a fresh console session (that is what survives a refresh or a reconnect).","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","maxLength":120,"description":"Shown in the page header; defaults to the hostname"},"viewOnly":{"type":"boolean","default":false,"description":"Stream the screen, refuse keyboard and mouse. Enforced by the relay, not the page"},"openTtlSeconds":{"type":"integer","minimum":60,"maximum":604800,"default":900},"viewerTtlSeconds":{"type":"integer","minimum":300,"maximum":43200,"default":3600}}}}}},"x-signed":true,"operationId":"postServicesByServiceIdConsoleCast"},"get":{"summary":"Console links on this service that are still live","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`data.links[]` of ConsoleCast, newest first, each with `status` and both timestamps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"includeFinished","in":"query","required":false,"schema":{"type":"boolean"},"description":"Also list expired and revoked links"}],"description":"URLs are never repeated here — a link's address exists once, in the creation response.","operationId":"getServicesByServiceIdConsoleCast"}},"/services/{serviceId}/console-cast/{castId}":{"delete":{"summary":"Revoke a console link","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Console link revoked\"`","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ConsoleCast"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"castId","in":"path","required":true,"description":"Console link id (`data.id` from the creation response)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"Idempotent. Stops the link minting anything further; it does NOT cut a stream already open on it — end that with the console session, or let the viewing window run out. No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdConsoleCastByCastId"}},"/services/{serviceId}/options":{"get":{"summary":"Add-ons on the service and add-ons still available to it, priced at wholesale","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/ServiceOptions"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdOptions"},"put":{"summary":"Set the add-ons the service carries (absolute target). Additions and top-ups are charged at wholesale in your payment mode; removals are free","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"200":{"description":"Applied (paid, or nothing to charge)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ServiceOptionsChange"}}}}}},"202":{"description":"Invoiced — additions are `pending_payment` until the document is paid","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ServiceOptionsChange"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"402":{"description":"Payment failed: nothing changed; `data.charge` names the order to retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"The service converges on `options`: an option not listed is removed, a listed one is added or its quantity adjusted. New add-ons and quantity increases are charged (first cycle on the service's own billing cycle, plus the add-on's setup fee) exactly like an order — saved method / credit / invoice. `200` paid or nothing to charge, `202` invoiced (additions activate when the document is paid), `402` payment failed: NOTHING changed, `data.charge.orderId` retries through `POST /orders/{orderId}/retry` and then applies the whole change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["options"],"properties":{"options":{"type":"array","maxItems":50,"items":{"type":"object","required":["optionId"],"properties":{"optionId":{"type":"string","format":"uuid","description":"From `available[]` / `active[]` of `GET .../options`"},"quantity":{"type":"integer","minimum":1,"maximum":100,"default":1}}}},"externalReference":{"type":"string","maxLength":255,"nullable":true,"description":"Your idempotency key for the charge, stored as the order's external id"},"paymentMethodId":{"type":"string","format":"uuid","nullable":true,"description":"Saved-method mode only: charge this method instead of the default"}}}}}},"x-signed":true,"operationId":"putServicesByServiceIdOptions"}},"/services/{serviceId}/options/{serviceOptionId}":{"delete":{"summary":"Remove one add-on from the service. Free and immediate; the next renewal bills less","x-scope":"orders","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Add-on removed\"`; `data.removed` + `data.options[]` (what remains)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"serviceOptionId","in":"path","required":true,"description":"`active[].id` from `GET .../options`","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdOptionsByServiceOptionId"}},"/services/{serviceId}/upgrades":{"get":{"summary":"Upgrade paths from this service's product, priced at wholesale — feed `POST .../change-package`","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/ServiceUpgrades"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdUpgrades"}},"/services/{serviceId}/rescue":{"post":{"summary":"Boot a dedicated server into the rescue environment. Returns the one-time rescue password","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message`, `data.{status: \"in_progress\", rescue_password}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Provisioning backend unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`. Only from the `active` or `error` provisioning state; the supplier can switch rescue off.","x-signed":true,"operationId":"postServicesByServiceIdRescue"}},"/services/{serviceId}/unrescue":{"post":{"summary":"Leave the rescue environment and reboot into the installed OS","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message`, `data.{status: \"exiting\"}`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"Provisioning backend unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdUnrescue"}},"/services/{serviceId}/game":{"get":{"summary":"The game server document: `{ server, capabilities }` — the one document the whole game panel renders from","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGame"}},"/services/{serviceId}/game/addons":{"get":{"summary":"Slot / RAM / port add-ons the server holds and can take","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameAddons"}},"/services/{serviceId}/game/vars":{"patch":{"summary":"Save start-up variables (`{ vars }`); applied on the next start","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"patchServicesByServiceIdGameVars"}},"/services/{serviceId}/game/power/{action}":{"post":{"summary":"Power verb: `start`, `stop`, `restart`, `kill`","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdGamePowerByAction"}},"/services/{serviceId}/game/console":{"post":{"summary":"Open a console session; dial the websocket at `origin` + `ws_path` with `token`","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"201":{"description":"`data.{session_id, token, ws_path, origin, wsOrigin, input_allowed, expires_at}` — open `wsOrigin + ws_path?token=` from your viewer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdGameConsole"}},"/services/{serviceId}/game/files":{"get":{"summary":"List a directory (`?path=`)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameFiles"}},"/services/{serviceId}/game/files/read":{"get":{"summary":"Read a text file (`?path=`)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameFilesRead"}},"/services/{serviceId}/game/files/contents":{"get":{"summary":"Alias of `files/read`","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameFilesContents"}},"/services/{serviceId}/game/files/download":{"get":{"summary":"Download a file (`?path=`) as `application/octet-stream`","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The file, `application/octet-stream` with a `Content-Disposition` filename"},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameFilesDownload"}},"/services/{serviceId}/game/files/{op}":{"post":{"summary":"File operation: `write`, `mkdir`, `rename`, `delete`, `compress`, `decompress`, `chmod`, `download-url`, or `upload` with `{ path, name, content }` (base64)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"op","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdGameFilesByOp"}},"/services/{serviceId}/game/sftp":{"get":{"summary":"SFTP host, port and username","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameSftp"}},"/services/{serviceId}/game/sftp/rotate":{"post":{"summary":"Rotate the SFTP password; the new one is returned once","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdGameSftpRotate"}},"/services/{serviceId}/game/backups":{"get":{"summary":"Backups and the quota","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameBackups"},"post":{"summary":"Take a backup (`{ name?, ignore? }`)","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdGameBackups"}},"/services/{serviceId}/game/backups/{gameBackupId}":{"patch":{"summary":"Rename / lock a backup","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameBackupId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"patchServicesByServiceIdGameBackupsByGameBackupId"},"delete":{"summary":"Delete a backup","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameBackupId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdGameBackupsByGameBackupId"}},"/services/{serviceId}/game/backups/{gameBackupId}/restore":{"post":{"summary":"Restore a backup over the live files","x-scope":"destructive","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameBackupId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdGameBackupsByGameBackupIdRestore"}},"/services/{serviceId}/game/schedules":{"get":{"summary":"Scheduled tasks","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameSchedules"},"post":{"summary":"Create a scheduled task","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdGameSchedules"}},"/services/{serviceId}/game/schedules/{gameScheduleId}":{"patch":{"summary":"Edit a scheduled task","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameScheduleId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"patchServicesByServiceIdGameSchedulesByGameScheduleId"},"delete":{"summary":"Delete a scheduled task","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameScheduleId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdGameSchedulesByGameScheduleId"}},"/services/{serviceId}/game/schedules/{gameScheduleId}/run":{"post":{"summary":"Run a scheduled task now","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameScheduleId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"postServicesByServiceIdGameSchedulesByGameScheduleIdRun"}},"/services/{serviceId}/game/calendar":{"get":{"summary":"Upcoming runs and wipes","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameCalendar"}},"/services/{serviceId}/game/mods":{"get":{"summary":"Installed mods / plugins","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameMods"},"post":{"summary":"Install a mod version","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdGameMods"}},"/services/{serviceId}/game/mods/sources":{"get":{"summary":"Mod sources this game supports","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameModsSources"}},"/services/{serviceId}/game/mods/search":{"get":{"summary":"Search a mod source (`?source=&q=`)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameModsSearch"}},"/services/{serviceId}/game/mods/versions":{"get":{"summary":"Versions of a mod (`?source=&projectId=`)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameModsVersions"}},"/services/{serviceId}/game/mods/project":{"get":{"summary":"A mod's project page (`?source=&projectId=`)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdGameModsProject"}},"/services/{serviceId}/game/mods/upload":{"post":{"summary":"Adopt an uploaded mod file into the mod list","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdGameModsUpload"}},"/services/{serviceId}/game/mods/{gameModId}":{"delete":{"summary":"Remove a mod","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The module's own shape — identical to the client panel's","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Game servers"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"gameModId","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"deleteServicesByServiceIdGameModsByGameModId"}},"/services/{serviceId}/provider":{"get":{"summary":"The visual-plugin provider behind the service (`provider: null` on native / bare-metal)","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The plugin handler's own envelope (`provider` / `data`), exactly as the client panel receives it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Plugin UI"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdProvider"}},"/services/{serviceId}/ui-schema":{"get":{"summary":"The plugin’s client service-page schema, if it ships one","x-scope":"read","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The plugin handler's own envelope (`provider` / `data`), exactly as the client panel receives it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Plugin UI"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}}],"operationId":"getServicesByServiceIdUiSchema"}},"/services/{serviceId}/ui-action/{action}":{"post":{"summary":"Run a plugin panel action (`{ params }`) — the same actions the client page runs","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"The plugin handler's own envelope (`provider` / `data`), exactly as the client panel receives it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Plugin UI"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Same body the client panel sends"}}}},"x-signed":true,"operationId":"postServicesByServiceIdUiActionByAction"}},"/services/{serviceId}/transit-config":{"put":{"summary":"Self-service BGP edits on an IP transit service: ASN, IRR AS-SET, announced prefixes, route type","x-scope":"services","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"BGP configuration updated\"`, `data.updated[]` names the fields that changed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Services"],"parameters":[{"name":"serviceId","in":"path","required":true,"description":"Service id (`services[].serviceId` from an order)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customerAsn":{"type":"integer","nullable":true,"minimum":1,"maximum":4294967295},"irrAsSet":{"type":"string","maxLength":100},"announcedPrefixes":{"type":"array","maxItems":100,"items":{"type":"string","description":"IPv4 or IPv6 CIDR"}},"routeType":{"type":"string","enum":["full_table","default_route","partial"]}}}}}},"x-signed":true,"operationId":"putServicesByServiceIdTransitConfig"}},"/customers":{"get":{"summary":"List your customer records (a delegated key sees only its bound customer)","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/Customer"}},"pagination":{"$ref":"#/components/schemas/PagePagination"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Customers"],"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"search","in":"query","schema":{"type":"string","maxLength":255},"description":"Matches external id, email or name"}],"operationId":"getCustomers"},"post":{"summary":"Create a customer record, or return the existing one for this `externalCustomerId`","x-scope":"customers","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK — 200 whether created or found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Customer"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Customers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["externalCustomerId"],"properties":{"externalCustomerId":{"type":"string","maxLength":255},"externalCustomerEmail":{"type":"string","format":"email"},"externalCustomerName":{"type":"string","maxLength":255}}}}}},"x-signed":true,"parameters":[{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"operationId":"postCustomers"}},"/customers/{customerId}":{"put":{"summary":"Update a customer record","x-scope":"customers","security":[{"ApiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Customer"}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Customers"],"parameters":[{"name":"customerId","in":"path","required":true,"description":"Customer record id (`id` from `GET /customers`)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"externalCustomerEmail":{"type":"string","format":"email"},"externalCustomerName":{"type":"string","maxLength":255},"metadata":{"type":"object","additionalProperties":true}}}}}},"x-signed":true,"operationId":"putCustomersByCustomerId"},"delete":{"summary":"Delete a customer record. Refused (400) while the customer has a non-terminated service; history is detached and kept","x-scope":"customers","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Customer deleted\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Customers"],"parameters":[{"name":"customerId","in":"path","required":true,"description":"Customer record id (`id` from `GET /customers`)","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"x-signed":true,"operationId":"deleteCustomersByCustomerId"}},"/payment-methods":{"get":{"summary":"Your saved payment methods on the supplier","x-scope":"account","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/PaymentMethod"}}}}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"operationId":"getPaymentMethods"}},"/payment-methods/{methodId}/default":{"put":{"summary":"Choose the saved method every auto-charge lands on","x-scope":"account","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Default payment method updated\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"parameters":[{"name":"methodId","in":"path","required":true,"description":"Saved payment method id from `GET /payment-methods`","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"operationId":"putPaymentMethodsByMethodIdDefault"}},"/account/webhook":{"put":{"summary":"Set the URL webhook deliveries are sent to","x-scope":"account","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`data.webhookUrl`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhookUrl"],"properties":{"webhookUrl":{"type":"string","format":"uri","description":"http(s) with an explicit scheme, public host only (private and loopback addresses are refused). Redirects are not followed on delivery"}}}}}},"x-signed":true,"parameters":[{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"operationId":"putAccountWebhook"}},"/webhooks/test":{"post":{"summary":"Queue a `webhook.test` delivery to your webhook URL","x-scope":"account","security":[{"ApiKey":[]}],"responses":{"200":{"description":"`message: \"Test webhook queued for delivery\"`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Validation failed (`error` is then an object with `message` and `details[]` of `{field, message}`), a refused cycle/quantity/minimum, `Webhook secret not configured` or `Invalid signature format`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"Missing or unknown API key, `Request signature required for this operation`, `Invalid signature`, or `Request timestamp outside the allowed window`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"`API key is missing the required scope: <scope>`, a control the supplier switched off for this product, or a suspended/terminated service (a non-active reseller profile answers 401 like an unknown key)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"Not found — or not owned by this reseller (or by the customer a delegated key is bound to). The two are never distinguished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"409":{"description":"State conflict: wrong service status for the transition, quantity cap reached, no upgrade path, an upgrade already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"Rate limit exceeded — see the `X-RateLimit-*` response headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}},"tags":["Account"],"description":"No body is needed: sign the empty string (with a timestamp) or send and sign `{}`.","x-signed":true,"parameters":[{"$ref":"#/components/parameters/Signature"},{"$ref":"#/components/parameters/Timestamp"}],"operationId":"postWebhooksTest"}}}}