{"components":{"responses":{"BadRequest":{"content":{"application/json":{"example":{"message":"invalid request body"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request was malformed or failed validation."},"Forbidden":{"content":{"application/json":{"example":{"message":"this API token is read-only (missing 'write' scope)"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The token lacks the required scope or the endpoint is not token-accessible."},"NotFound":{"content":{"application/json":{"example":{"message":"service not found"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The resource does not exist or you do not own it."},"Unauthorized":{"content":{"application/json":{"example":{"message":"invalid session"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Missing or invalid API token."}},"schemas":{"AccountAttack":{"allOf":[{"$ref":"#/components/schemas/ServiceAttackEvent"},{"properties":{"serviceId":{"description":"The service whose IP this attack targeted.","type":"string"}},"required":["serviceId"],"type":"object"}],"example":{"action":"flowspec","direction":"incoming","durationSeconds":95,"hasDetails":false,"id":"atk_7b1e05","peakGbps":88.2,"peakMpps":13.1,"serviceId":"svc_8f2k41","startedAt":"2026-07-04T15:08:00Z","status":"active","targetIp":"185.248.171.7","vector":"udp_flood"}},"AccountAttacksResult":{"example":{"attacks":[{"action":"flowspec","direction":"incoming","durationSeconds":380,"endedAt":"2026-07-04T15:14:20Z","hasDetails":true,"id":"atk_9d3f21","peakGbps":42.6,"peakMpps":6.3,"serviceId":"svc_8f2k41","startedAt":"2026-07-04T15:08:00Z","status":"ended","targetIp":"185.248.171.7","vector":"syn_flood"}],"limit":20,"page":1,"total":1},"properties":{"attacks":{"items":{"$ref":"#/components/schemas/AccountAttack"},"type":"array"},"limit":{"type":"integer"},"page":{"type":"integer"},"total":{"type":"integer"}},"required":["attacks","total","page","limit"],"type":"object"},"AutoTopUpConfig":{"description":"Automatic top-up rule — when enabled and the balance drops under thresholdUsd, the saved card is charged amountUsd.","example":{"amountUsd":50,"enabled":true,"lastAttemptAt":"2026-07-02T04:12:00Z","methodId":"pm_9Fb2Lq","thresholdUsd":10},"properties":{"amountUsd":{"maximum":10000,"minimum":5,"type":"number"},"enabled":{"type":"boolean"},"lastAttemptAt":{"format":"date-time","type":"string"},"lastError":{"description":"Why the most recent automatic charge failed","type":"string","when it did.":null},"methodId":{"description":"Saved payment method to charge; empty means the default card.","type":"string"},"thresholdUsd":{"type":"number"}},"required":["enabled","thresholdUsd","amountUsd"],"type":"object"},"Backup":{"properties":{"cpu":{"type":"integer"},"createdAt":{"format":"date-time","type":"string"},"description":{"type":"string"},"diskGb":{"format":"int64","type":"integer"},"error":{"type":"string"},"id":{"type":"string"},"instanceId":{"type":"string"},"memoryMb":{"format":"int64","type":"integer"},"sizeBytes":{"format":"int64","type":"integer"},"status":{"enum":["creating","ready","error"],"type":"string"},"template":{"type":"string"}},"required":["id","instanceId","status","createdAt"],"type":"object"},"BalanceTopUp":{"description":"One balance top-up attempt. The balance is credited when status reaches succeeded.","example":{"amountUsd":50,"createdAt":"2026-07-04T15:08:00Z","id":"top_6Yh1Pd","kind":"manual","provider":"stripe","settledAt":"2026-07-04T15:08:03Z","status":"succeeded"},"properties":{"amountUsd":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"detail":{"description":"Failure reason","type":"string","when there is one.":null},"id":{"type":"string"},"kind":{"enum":["manual","auto"],"type":"string"},"provider":{"type":"string"},"settledAt":{"format":"date-time","type":"string"},"status":{"enum":["pending","succeeded","failed","canceled"],"type":"string"}},"required":["id","amountUsd","provider","status","kind","createdAt"],"type":"object"},"CancellationState":{"description":"A service's end-of-period cancellation status.","properties":{"cancelAtPeriodEnd":{"description":"When true","the service stops renewing and lapses at expiresAt.":null,"type":"boolean"},"expiresAt":{"description":"When the current paid period ends. Absent when the service has no expiry.","format":"date-time","type":"string"},"serviceId":{"type":"string"},"status":{"description":"The service's current lifecycle status (e.g. active","suspended).":null,"type":"string"}},"required":["serviceId","cancelAtPeriodEnd","status"],"type":"object"},"CardIntent":{"description":"A Stripe PaymentIntent to confirm in the browser (Stripe.js) with the returned client secret.","example":{"amountUsd":59.29,"clientSecret":"pi_3Pjk2fLxCZ8h9Qw1_secret_9AbQ7Kd","currency":"USD","invoiceId":"inv_3Ab9Xz","publishableKey":"pk_live_51Hxa9RKk3mNqPz8w","status":"requires_confirmation"},"properties":{"amountUsd":{"type":"number"},"clientSecret":{"type":"string"},"currency":{"type":"string"},"invoiceId":{"description":"Present for invoice payments; empty for balance top-ups.","type":"string"},"publishableKey":{"type":"string"},"status":{"type":"string"}},"required":["clientSecret","publishableKey","amountUsd","currency","status"],"type":"object"},"CloudInstanceLine":{"description":"One line of the Cloud Instances category and the bounds a configuration must fit.","example":{"blurb":"Lean on cores. For game servers, encoders and CI runners.","key":"compute","maxDiskGb":1000,"maxRamGb":128,"maxVcpu":32,"minDiskGb":20,"minRamGb":1,"minVcpu":1,"name":"Compute Optimized"},"properties":{"blurb":{"type":"string"},"key":{"enum":["compute","memory","storage"],"type":"string"},"maxDiskGb":{"type":"integer"},"maxRamGb":{"description":"Maximum RAM in GB (absolute","independent of vCPU).":null,"type":"number"},"maxVcpu":{"type":"integer"},"minDiskGb":{"type":"integer"},"minRamGb":{"description":"Minimum RAM in GB (absolute","independent of vCPU).":null,"type":"number"},"minVcpu":{"type":"integer"},"name":{"type":"string"}},"required":["key","name","minVcpu","maxVcpu","minRamGb","maxRamGb","minDiskGb","maxDiskGb"],"type":"object"},"CloudInstancePreset":{"description":"A ready-made instance. Order it as-is or resize vCPU/RAM later within its line.","example":{"diskGb":80,"displayName":"Compute · 4 vCPU / 8 GB","hourlyUsd":0.058904,"line":"compute","monthlyUsd":43,"planKey":"ci-compute-4-8","ramGb":8,"vcpu":4},"properties":{"diskGb":{"type":"integer"},"displayName":{"type":"string"},"hourlyUsd":{"type":"number"},"line":{"type":"string"},"monthlyUsd":{"type":"number"},"planKey":{"type":"string"},"ramGb":{"type":"integer"},"vcpu":{"type":"integer"}},"required":["planKey","displayName","line","vcpu","ramGb","diskGb","monthlyUsd","hourlyUsd"],"type":"object"},"CloudInstanceRates":{"description":"Per-resource prices the category charges. Monthly figures; an hour costs monthly / hoursPerMonth.","example":{"diskGbMonthlyUsd":0.1,"hoursPerMonth":730,"ipv4MonthlyUsd":3,"ramGbMonthlyUsd":2,"vcpuMonthlyUsd":4},"properties":{"diskGbMonthlyUsd":{"type":"number"},"hoursPerMonth":{"type":"number"},"ipv4MonthlyUsd":{"type":"number"},"ramGbMonthlyUsd":{"type":"number"},"vcpuMonthlyUsd":{"type":"number"}},"required":["vcpuMonthlyUsd","ramGbMonthlyUsd","diskGbMonthlyUsd","ipv4MonthlyUsd","hoursPerMonth"],"type":"object"},"CloudInstanceResize":{"description":"The sizing a resize accepted and what it costs.","example":{"billingMode":"hourly","diskGb":80,"hourlyUsd":0.10274,"monthlyUsd":75,"ramGb":16,"requiresReboot":true,"vcpu":8},"properties":{"billingMode":{"enum":["cycle","hourly"],"type":"string"},"diskGb":{"type":"integer"},"hourlyUsd":{"type":"number"},"monthlyUsd":{"type":"number"},"ramGb":{"type":"integer"},"requiresReboot":{"type":"boolean"},"vcpu":{"type":"integer"}},"required":["vcpu","ramGb","diskGb","monthlyUsd","hourlyUsd","billingMode","requiresReboot"],"type":"object"},"CreditEntry":{"description":"One movement in the store-credit ledger (positive = grant/refund, negative = applied).","properties":{"amountUsd":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"invoiceId":{"description":"Present when the movement relates to an invoice.","type":"string"},"reason":{"type":"string"}},"required":["id","amountUsd","reason","createdAt"],"type":"object"},"DNSRecord":{"description":"A Layer 7 DNS record.","example":{"id":"rec_2Bd7Km","name":"@","proxied":true,"ttl":3600,"type":"A","value":"185.248.171.7"},"properties":{"id":{"description":"Stable record id; present on per-record read responses (absent on the bulk replace).","readOnly":true,"type":"string"},"name":{"description":"Record name; @ for the zone root.","type":"string"},"priority":{"description":"Priority for MX/SRV records. The per-record endpoints return it here and strip it from value; the bulk replace may instead embed it as the leading token of value.","type":"integer"},"proxied":{"description":"Whether traffic is proxied through the CDN (A/AAAA only).","type":"boolean"},"ttl":{"description":"Seconds.","type":"integer"},"type":{"enum":["A","AAAA","CNAME","MX","TXT","SPF","SRV","CAA"],"type":"string"},"value":{"type":"string"}},"required":["type","name","value","ttl"],"type":"object"},"DailyAttacks":{"description":"One day's attack count in a 30-day series.","properties":{"attacks":{"type":"integer"},"date":{"description":"YYYY-MM-DD (UTC).","type":"string"}},"required":["date","attacks"],"type":"object"},"DedicatedDrive":{"description":"One physical drive read live from the server's BMC (Redfish).","properties":{"capacityBytes":{"format":"int64","type":"integer"},"health":{"type":"string"},"mediaType":{"description":"HDD or SSD.","type":"string"},"model":{"type":"string"},"name":{"type":"string"},"protocol":{"description":"SATA, SAS or NVMe.","type":"string"},"serialNumber":{"type":"string"}},"type":"object"},"Error":{"description":"A human-readable error. Never contains internal or infrastructure detail.","properties":{"message":{"description":"What went wrong","in plain language.":null,"type":"string"}},"required":["message"],"type":"object"},"Firewall":{"properties":{"enabled":{"description":"Master switch. Off by default (opt-in); when off the VPS is unfiltered. When on, the node applies a default-deny-inbound / allow-outbound+established base policy plus the rules.","type":"boolean"},"rules":{"items":{"$ref":"#/components/schemas/FirewallRule"},"type":"array"}},"required":["enabled","rules"],"type":"object"},"FirewallRule":{"example":{"action":"allow","direction":"inbound","portEnd":0,"portStart":443,"preset":"https","protocol":"tcp","sourceCidr":"0.0.0.0/0"},"properties":{"action":{"enum":["allow","deny"],"type":"string"},"direction":{"enum":["inbound","outbound"],"type":"string"},"id":{"description":"Server-assigned rule id (present on stored rules).","type":"string"},"portEnd":{"description":"End of a port range; 0 for a single port (portStart).","type":"integer"},"portStart":{"description":"Port, or start of a port range. 0 = not port-based (icmp, or match every port).","type":"integer"},"preset":{"description":"Known-service label (ssh/http/https/dns/mysql/rdp/…) so the UI can render it as a toggle; empty for a custom rule.","type":"string"},"protocol":{"enum":["tcp","udp","icmp"],"type":"string"},"sourceCidr":{"description":"Source IP or CIDR the rule matches; empty or 0.0.0.0/0 means anywhere. A bare IP is normalized to /32 (or /128).","type":"string"}},"required":["direction","protocol","action"],"type":"object"},"HourlyUsageRecord":{"description":"One billed period of an hourly Cloud service, with the full price breakdown. CPU and RAM are only charged for the seconds the instance ran; disk and IPv4 meter around the clock.","example":{"cpuUsd":0.021918,"createdAt":"2026-07-04T15:00:05Z","diskGb":80,"diskUsd":0.010959,"id":"hus_2Wc7Rk","ipCount":1,"ipUsd":0.00411,"periodEnd":"2026-07-04T15:00:00Z","periodStart":"2026-07-04T14:00:00Z","ramMb":8192,"ramUsd":0.021918,"runningSeconds":3600,"serviceId":"svc_8f2k41","totalSeconds":3600,"totalUsd":0.058904,"vcpu":4},"properties":{"cpuUsd":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"diskGb":{"type":"integer"},"diskUsd":{"type":"number"},"id":{"type":"string"},"ipCount":{"type":"integer"},"ipUsd":{"type":"number"},"periodEnd":{"format":"date-time","type":"string"},"periodStart":{"format":"date-time","type":"string"},"ramMb":{"type":"integer"},"ramUsd":{"type":"number"},"runningSeconds":{"type":"integer"},"serviceId":{"type":"string"},"totalSeconds":{"type":"integer"},"totalUsd":{"type":"number"},"vcpu":{"type":"integer"}},"required":["id","serviceId","periodStart","periodEnd","runningSeconds","totalSeconds","vcpu","ramMb","diskGb","ipCount","cpuUsd","ramUsd","diskUsd","ipUsd","totalUsd"],"type":"object"},"Invoice":{"example":{"amountUsd":59.29,"createdAt":"2026-07-01T12:00:05Z","creditAppliedUsd":0,"currency":"USD","discountUsd":0,"dueDate":"2026-07-08T12:00:05Z","id":"inv_3Ab9Xz","invoiceNumber":"SCDN-2026-004182","lineItems":[{"amountUsd":49,"description":"Cloud VPS 4 vCPU — monthly","lineTotal":49,"quantity":1}],"paidAt":"2026-07-01T12:03:11Z","period":"Jul 2026","reverseChargeApplied":false,"service":"Cloud VPS 4 vCPU","status":"paid","subtotalUsd":49,"userEmail":"you@example.com","vatAmountUsd":10.29,"vatRatePercent":21},"properties":{"amountUsd":{"description":"Gross total (subtotal + VAT − credit).","type":"number"},"couponCode":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"creditAppliedUsd":{"type":"number"},"currency":{"type":"string"},"discountUsd":{"type":"number"},"dueDate":{"format":"date-time","type":"string"},"id":{"type":"string"},"invoiceNumber":{"type":"string"},"lineItems":{"items":{"$ref":"#/components/schemas/InvoiceLineItem"},"type":"array"},"paidAt":{"description":"Absent until paid.","format":"date-time","type":"string"},"period":{"type":"string"},"reverseChargeApplied":{"type":"boolean"},"service":{"description":"Human label for what the invoice is for.","type":"string"},"status":{"enum":["paid","unpaid","overdue","cancelled","refunded"],"type":"string"},"subtotalUsd":{"type":"number"},"userEmail":{"format":"email","type":"string"},"vatAmountUsd":{"type":"number"},"vatRatePercent":{"type":"number"}},"required":["id","invoiceNumber","amountUsd","currency","status","createdAt","dueDate"],"type":"object"},"InvoiceLineItem":{"example":{"amountUsd":49,"description":"Cloud VPS 4 vCPU — monthly","lineTotal":49,"quantity":1},"properties":{"amountUsd":{"description":"Unit price.","type":"number"},"description":{"type":"string"},"lineTotal":{"description":"amountUsd × quantity.","type":"number"},"quantity":{"type":"integer"}},"required":["description","amountUsd","quantity","lineTotal"],"type":"object"},"KbArticleSummary":{"properties":{"categorySlug":{"example":"ddos-layer7","type":"string"},"excerpt":{"type":"string"},"id":{"type":"string"},"position":{"type":"integer"},"slug":{"example":"restore-visitor-ip","type":"string"},"status":{"example":"published","type":"string"},"title":{"type":"string"}},"type":"object"},"Layer7ActivationState":{"example":{"currentNameservers":["ns1.oldhost.com","ns2.oldhost.com"],"dnsRecords":[{"id":"rec_2Bd7Km","name":"@","proxied":true,"ttl":3600,"type":"A","value":"185.248.171.7"},{"id":"rec_5Xk9Wp","name":"www","proxied":true,"ttl":3600,"type":"CNAME","value":"example.com"}],"domain":"example.com","domainId":"dom_4Qm7Zt","nameservers":["gwen.ns.sprintcdn.com","hank.ns.sprintcdn.com"],"serviceId":"svc_l7a1b2","status":"pending_ns"},"properties":{"currentNameservers":{"description":"The domain's nameservers as currently seen.","items":{"type":"string"},"type":"array"},"dnsRecords":{"items":{"$ref":"#/components/schemas/DNSRecord"},"type":"array"},"domain":{"type":"string"},"domainId":{"type":"string"},"nameservers":{"description":"The nameservers to delegate to.","items":{"type":"string"},"type":"array"},"serviceId":{"type":"string"},"status":{"description":"e.g. pending_ns, active, failed.","type":"string"}},"required":["serviceId","domainId","domain","status","nameservers","dnsRecords"],"type":"object"},"LoadBalancer":{"description":"A kernel-level (IPVS) load balancer. It owns a public IPv4 and forwards traffic exclusively onto backends' private-network addresses — backends never receive traffic on their public IPs through it.","example":{"backendCount":3,"id":"clb_a1b2c3d4e5f60718293a4b5c","listenerCount":2,"name":"web-frontend","networkId":"pnet_1f2e3d4c5b6a7f8e9d0c1b2a","networkName":"production","privateIp":"10.100.0.4","publicIp":"203.0.113.10","status":"active"},"properties":{"backendCount":{"type":"integer"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"listenerCount":{"type":"integer"},"name":{"type":"string"},"networkId":{"description":"The private network the balancer forwards into. Backends must be members of it.","type":"string"},"networkName":{"type":"string"},"privateIp":{"description":"The balancer's address inside the private network — the source backends see.","type":"string"},"publicIp":{"description":"The balancer's own public IPv4 (point your DNS here).","type":"string"},"status":{"enum":["provisioning","active","error"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","name","networkId","publicIp","privateIp","status"],"type":"object"},"LoadBalancerBackend":{"description":"One backend server with its live health. Backends must be members of the balancer's private network; failed health checks pull a backend out of rotation automatically and it returns on recovery.","example":{"health":"healthy","hostname":"web-01","id":"lbb_c3d4e5f60718293a4b5c6d7e","instanceId":"vm_0a1b2c3d4e5f60718293a4b5","memberId":"pnm_9a8b7c6d5e4f3a2b1c0d9e8f","privateIp":"10.100.0.2","serviceId":"svc_1024","state":"active","weight":100},"properties":{"createdAt":{"format":"date-time","type":"string"},"health":{"enum":["unknown","healthy","unhealthy"],"type":"string"},"hostname":{"type":"string"},"id":{"type":"string"},"instanceId":{"type":"string"},"memberId":{"description":"The private-network membership backing this backend.","type":"string"},"privateIp":{"description":"The address traffic is forwarded to (always inside the private network).","type":"string"},"serviceId":{"type":"string"},"state":{"description":"draining = removal in progress; established connections finish, no new ones are scheduled.","enum":["active","draining"],"type":"string"},"weight":{"description":"Scheduling weight for weighted algorithms (default 100).","type":"integer"}},"required":["id","memberId","privateIp","weight","state","health"],"type":"object"},"LoadBalancerListener":{"description":"One forwarding rule: traffic to the balancer's public IP on port/protocol is balanced onto every backend's targetPort.","example":{"algorithm":"rr","id":"lbl_b2c3d4e5f60718293a4b5c6d","port":443,"protocol":"tcp","targetPort":8443},"properties":{"algorithm":{"description":"Balancing algorithm: round-robin, weighted round-robin, least-connection, weighted least-connection, source-hash (session affinity).","enum":["rr","wrr","lc","wlc","sh"],"type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"port":{"description":"The public port on the balancer.","type":"integer"},"protocol":{"enum":["tcp","udp"],"type":"string"},"targetPort":{"description":"The backend port traffic is forwarded to.","type":"integer"}},"required":["id","protocol","port","targetPort","algorithm"],"type":"object"},"NetworkProtectionOverview":{"example":{"daily":[{"attacks":0,"date":"2026-07-03"},{"attacks":2,"date":"2026-07-04"}],"ips":[{"createdAt":"2026-05-20T10:00:00Z","id":"pip_3Nf8Qa","ip":"185.248.171.0/24","method":"gre","stats":{"activeNow":true,"attacksBlocked":12,"lastAttack":"2026-07-04T15:08:00Z","peakGbps":88.2,"peakMpps":13.1},"status":"active"}],"summary":{"activeAttacks":1,"attacksBlocked30d":12,"peakMitigatedGbps":88.2,"protectedIps":1}},"properties":{"daily":{"description":"Exactly 30 continuous UTC buckets, oldest first.","items":{"$ref":"#/components/schemas/DailyAttacks"},"type":"array"},"ips":{"items":{"$ref":"#/components/schemas/ProtectedIP"},"type":"array"},"summary":{"properties":{"activeAttacks":{"type":"integer"},"attacksBlocked30d":{"type":"integer"},"peakMitigatedGbps":{"type":"number"},"protectedIps":{"type":"integer"}},"required":["protectedIps","attacksBlocked30d","peakMitigatedGbps","activeAttacks"],"type":"object"}},"required":["ips","daily","summary"],"type":"object"},"NetworkSamplePoint":{"properties":{"at":{"format":"date-time","type":"string"},"inBps":{"type":"number"},"inPps":{"type":"number"},"linkUp":{"type":"boolean"},"outBps":{"type":"number"},"outPps":{"type":"number"}},"required":["at","inBps","outBps","inPps","outPps","linkUp"],"type":"object"},"OrderView":{"description":"One row of the account's order history.","example":{"amountUsd":59.29,"billingCycleMonths":1,"createdAt":"2026-07-01T12:00:00Z","id":"ord_5Tn8kW","invoiceId":"inv_3Ab9Xz","paymentStatus":"paid","planName":"Cloud VPS 4 vCPU","provisioningStatus":"provisioned","serviceId":"svc_8f2k41","serviceType":"cloud-vps"},"properties":{"amountUsd":{"description":"Total for the billing cycle.","type":"number"},"billingCycleMonths":{"type":"integer"},"couponCode":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"invoiceId":{"description":"The invoice raised for this order.","type":"string"},"paymentStatus":{"description":"e.g. pending, paid, cancelled.","type":"string"},"planName":{"type":"string"},"provisioningStatus":{"description":"e.g. pending, provisioned, failed.","type":"string"},"serviceId":{"description":"The service this order became","once provisioned.":null,"type":"string"},"serviceType":{"type":"string"}},"required":["id","serviceType","planName","amountUsd","billingCycleMonths","paymentStatus","provisioningStatus","createdAt"],"type":"object"},"Plan":{"description":"A catalog product plan and its pricing model.","example":{"currency":"USD","displayName":"Cloud VPS 4 vCPU","isActive":true,"metadata":{"bandwidth_tb":20,"ram_gb":8,"storage_gb":80,"vcpu":4},"planKey":"cloud-vps-4","priceUsd":49,"pricingMode":"fixed","productType":"cloud-vps"},"properties":{"currency":{"type":"string"},"displayName":{"type":"string"},"isActive":{"type":"boolean"},"metadata":{"additionalProperties":true,"description":"Free-form specs (vCPU/RAM/disk/ports, add-on pricing, quote_only, …).","type":"object"},"planKey":{"type":"string"},"priceUsd":{"type":"number"},"pricingMode":{"enum":["fixed","formula_cloud_custom","formula_ddos_bandwidth"],"type":"string"},"productType":{"type":"string"}},"required":["productType","planKey","displayName","pricingMode","priceUsd","currency","isActive"],"type":"object"},"PrivateNetwork":{"description":"One isolated L2 network owned by the account. The address range (a /24) and the network id on the wire are assigned automatically — networks of different accounts can never communicate.","example":{"cidr":"10.100.0.0/24","id":"pnet_1f2e3d4c5b6a7f8e9d0c1b2a","memberCount":3,"name":"production","status":"active","vni":10000},"properties":{"cidr":{"description":"The network's private range, allocated from the platform pool.","type":"string"},"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"memberCount":{"type":"integer"},"name":{"description":"Your label for the network.","type":"string"},"status":{"enum":["active"],"type":"string"},"updatedAt":{"format":"date-time","type":"string"},"vni":{"description":"The network's overlay id (informational).","type":"integer"}},"required":["id","name","cidr","vni","status"],"type":"object"},"PrivateNetworkMember":{"description":"One device (Cloud VPS / Cloud Instance) attached to a private network. The private address and MAC are assigned automatically; the NIC hot-plugs with no restart.","example":{"hostname":"web-01","id":"pnm_9a8b7c6d5e4f3a2b1c0d9e8f","instanceId":"vm_0a1b2c3d4e5f60718293a4b5","macAddress":"52:54:00:3c:9f:41","networkId":"pnet_1f2e3d4c5b6a7f8e9d0c1b2a","privateIp":"10.100.0.2","serviceId":"svc_1024","status":"active"},"properties":{"createdAt":{"format":"date-time","type":"string"},"hostname":{"type":"string"},"id":{"type":"string"},"instanceId":{"description":"The underlying cloud server id.","type":"string"},"macAddress":{"type":"string"},"networkId":{"type":"string"},"privateIp":{"description":"The device's address inside the network.","type":"string"},"serviceId":{"description":"The service the device belongs to.","type":"string"},"status":{"description":"attaching while the NIC is being plugged; active once the hypervisor applied it.","enum":["attaching","active","error","detaching"],"type":"string"}},"required":["id","networkId","instanceId","privateIp","macAddress","status"],"type":"object"},"ProtectedIP":{"properties":{"createdAt":{"format":"date-time","type":"string"},"id":{"type":"string"},"ip":{"description":"Canonical IP or CIDR prefix.","type":"string"},"method":{"enum":["physical","gre","ipsec"],"type":"string"},"stats":{"$ref":"#/components/schemas/ProtectedIPStats"},"status":{"type":"string"}},"required":["id","ip","method","status","createdAt","stats"],"type":"object"},"ProtectedIPStats":{"properties":{"activeNow":{"type":"boolean"},"attacksBlocked":{"type":"integer"},"lastAttack":{"description":"Absent when never attacked.","format":"date-time","type":"string"},"peakGbps":{"type":"number"},"peakMpps":{"type":"number"}},"required":["attacksBlocked","peakGbps","peakMpps","activeNow"],"type":"object"},"ProtectionToggleResult":{"properties":{"enabled":{"type":"boolean"},"fnmDetail":{"description":"Reason when not synced (empty on success).","type":"string"},"fnmSynced":{"description":"Whether the mitigation platform accepted the change.","type":"boolean"},"ok":{"type":"boolean"}},"required":["ok","enabled","fnmSynced","fnmDetail"],"type":"object"},"ReinstallProgress":{"description":"Live progress of a dedicated server OS reinstall.","properties":{"percent":{"type":"integer"},"serviceId":{"type":"string"},"stage":{"description":"requested, wiping, installer, bootloader, complete, …","type":"string"},"startedAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["serviceId","stage","percent"],"type":"object"},"SavedMethod":{"description":"A saved payment card. Display fields only — never the full card number.","example":{"brand":"visa","createdAt":"2026-03-12T09:45:00Z","expMonth":11,"expYear":2028,"id":"pm_9Fb2Lq","isDefault":true,"last4":"4242"},"properties":{"brand":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"expMonth":{"type":"integer"},"expYear":{"type":"integer"},"id":{"type":"string"},"isDefault":{"type":"boolean"},"last4":{"type":"string"}},"required":["id","brand","last4","expMonth","expYear","isDefault","createdAt"],"type":"object"},"ServiceAttackDetail":{"allOf":[{"$ref":"#/components/schemas/ServiceAttackEvent"},{"properties":{"details":{"additionalProperties":true,"description":"Raw attack telemetry from the mitigation platform (per-protocol breakdown, sampled flows). Schema varies by platform version; absent when no deep dive was captured.","type":"object"}},"type":"object"}],"example":{"action":"flowspec","details":{"protocols":{"tcp":0.72,"udp":0.28},"sampledFlows":128,"topSourceAsns":[24940,16509]},"direction":"incoming","durationSeconds":380,"endedAt":"2026-07-04T15:14:20Z","hasDetails":true,"id":"atk_9d3f21","peakGbps":42.6,"peakMpps":6.3,"startedAt":"2026-07-04T15:08:00Z","status":"ended","targetIp":"185.248.171.7","vector":"syn_flood"}},"ServiceAttackEvent":{"description":"A single recorded DDoS attack against one of the service's IPs.","example":{"action":"flowspec","direction":"incoming","durationSeconds":380,"endedAt":"2026-07-04T15:14:20Z","hasDetails":true,"id":"atk_9d3f21","peakGbps":42.6,"peakMpps":6.3,"startedAt":"2026-07-04T15:08:00Z","status":"ended","targetIp":"185.248.171.7","vector":"syn_flood","volumeAuthoritative":true},"properties":{"action":{"description":"Mitigation taken, e.g. flowspec, ban.","type":"string"},"direction":{"description":"incoming or outgoing.","type":"string"},"durationSeconds":{"type":"integer"},"endedAt":{"description":"Absent while the attack is ongoing.","format":"date-time","type":"string"},"hasDetails":{"description":"Whether a per-attack deep dive is available at the attack-detail endpoint.","type":"boolean"},"id":{"type":"string"},"peakGbps":{"description":"Peak attack volume in Gbps. Provisional while the attack is active and volumeAuthoritative is false.","type":"number"},"peakMpps":{"description":"Peak attack rate in Mpps. Provisional while the attack is active and volumeAuthoritative is false.","type":"number"},"startedAt":{"format":"date-time","type":"string"},"status":{"enum":["active","ended"],"type":"string"},"targetIp":{"type":"string"},"vector":{"description":"Attack vector slug, e.g. syn_flood, udp_flood.","type":"string"},"volumeAuthoritative":{"description":"True once the peak is measured by the router's authoritative counters rather than the detector's initial estimate. While an attack is active and this is false, the volume is still being calculated and peakGbps/peakMpps are provisional.","type":"boolean"}},"required":["id","targetIp","vector","peakGbps","peakMpps","status","startedAt","durationSeconds"],"type":"object"},"ServiceDDoSOverview":{"example":{"daily":[{"attacks":0,"date":"2026-07-03"},{"attacks":2,"date":"2026-07-04"}],"events":[{"action":"flowspec","direction":"incoming","durationSeconds":380,"endedAt":"2026-07-04T15:14:20Z","hasDetails":true,"id":"atk_9d3f21","peakGbps":42.6,"peakMpps":6.3,"startedAt":"2026-07-04T15:08:00Z","status":"ended","targetIp":"185.248.171.7","vector":"syn_flood"}],"eventsTotal":14,"ips":["185.248.171.7"],"limit":20,"page":1,"protectionEnabled":true,"summary":{"activeAttacks":1,"attacksBlocked30d":14,"lastAttack":"2026-07-04T15:08:00Z","peakGbps":88.2,"peakMpps":13.1}},"properties":{"daily":{"items":{"$ref":"#/components/schemas/DailyAttacks"},"type":"array"},"events":{"items":{"$ref":"#/components/schemas/ServiceAttackEvent"},"type":"array"},"eventsTotal":{"type":"integer"},"ips":{"description":"The service's own IP addresses.","items":{"type":"string"},"type":"array"},"limit":{"type":"integer"},"page":{"type":"integer"},"protectionEnabled":{"description":"Customer protection preference (defaults to true).","type":"boolean"},"summary":{"properties":{"activeAttacks":{"type":"integer"},"attacksBlocked30d":{"type":"integer"},"lastAttack":{"description":"Absent if never attacked.","format":"date-time","type":"string"},"peakGbps":{"type":"number"},"peakMpps":{"type":"number"}},"required":["attacksBlocked30d","peakGbps","peakMpps","activeAttacks"],"type":"object"}},"required":["ips","protectionEnabled","daily","summary","events","eventsTotal","page","limit"],"type":"object"},"ServicePTRRecord":{"description":"One IP's reverse-DNS (PTR) entry.","example":{"ip":"185.248.171.7","ptr":"mail.example.com"},"properties":{"ip":{"type":"string"},"ptr":{"description":"The PTR hostname; empty when unset.","type":"string"}},"required":["ip","ptr"],"type":"object"},"ServiceView":{"description":"A provisioned service on the account.","example":{"billingMode":"monthly","config":{"diskGb":80,"hostname":"web-01","primaryIp":"185.248.171.7","ramGb":8,"region":"eu-ams-1","template":"ubuntu-24.04","vcpu":4},"createdAt":"2026-06-01T12:00:00Z","expiresAt":"2026-07-01T12:00:00Z","id":"svc_8f2k41","orderId":"ord_5Tn8kW","planName":"Cloud VPS 4 vCPU","serviceType":"cloud-vps","status":"active"},"properties":{"billingMode":{"description":"hourly services meter against the account balance and have no fixed expiry.","enum":["monthly","hourly"],"type":"string"},"config":{"additionalProperties":true,"description":"Free-form per-service configuration blob (contents vary by serviceType).","type":"object"},"createdAt":{"format":"date-time","type":"string"},"expiresAt":{"description":"Absent for services without a fixed expiry.","format":"date-time","type":"string"},"id":{"type":"string"},"orderId":{"type":"string"},"planName":{"type":"string"},"powerState":{"description":"Last-known run state of a built cloud instance (running, stopped, suspended). Absent for other service types and unbuilt instances — a powered-off VPS is active + stopped, never pending.","type":"string"},"serviceType":{"enum":["cloud-vps","gpu-vps","cloud-instance","dedicated-server","layer7-protection","ddos-l34","network-protection","ip-transit"],"type":"string"},"status":{"description":"Billing lifecycle: e.g. active, pending (not built yet), suspended, terminated.","type":"string"}},"required":["id","serviceType","planName","status","createdAt","config"],"type":"object"},"Snapshot":{"properties":{"createdAt":{"format":"date-time","type":"string"},"current":{"type":"boolean"},"description":{"type":"string"},"name":{"type":"string"},"state":{"enum":["running","shutoff","disk-snapshot"],"type":"string"}},"required":["name","state","createdAt","current"],"type":"object"},"User":{"description":"The authenticated account. Billing-profile fields appear once a profile is saved.","example":{"address":"Herengracht 182","city":"Amsterdam","companyName":"Rivera Labs","country":"NL","createdAt":"2026-03-12T09:41:00Z","email":"you@example.com","firstName":"Alex","id":"usr_7Qk2mN9x","lastName":"Rivera","linkedProviders":{"github":false,"google":true},"phone":"+31 20 555 0142","postalCode":"1016 BR","vatNumber":"NL004495445B01"},"properties":{"address":{"type":"string"},"city":{"type":"string"},"companyName":{"type":"string"},"country":{"description":"ISO 3166-1 alpha-2 country code.","type":"string"},"createdAt":{"format":"date-time","type":"string"},"email":{"format":"email","type":"string"},"firstName":{"type":"string"},"id":{"type":"string"},"lastName":{"type":"string"},"linkedProviders":{"additionalProperties":{"type":"boolean"},"description":"Which social identity providers are linked, e.g. google/github booleans.","type":"object"},"phone":{"type":"string"},"postalCode":{"type":"string"},"vatNumber":{"type":"string"}},"required":["id","email","createdAt"],"type":"object"},"VPSManagementView":{"description":"Runtime details for a Cloud/GPU VPS.","example":{"addonFlags":{"backups":true,"extraIp":true},"backupEnabled":true,"hostname":"web-01","planName":"Cloud VPS 4 vCPU","primaryIp":"185.248.171.7","rescue":false,"rootPassword":"T3mp-Xy8Q2k-Rn4","serviceId":"svc_8f2k41","serviceType":"cloud-vps","status":"running","template":"ubuntu-24.04","templates":["ubuntu-24.04","debian-12","almalinux-9"],"usageHistory":[{"cpuUsage":12.4,"diskUsage":41,"netIn":184000,"netOut":98230,"ramUsage":38.1,"timestamp":"2026-07-04T15:00:00Z"}],"vpsId":"vm_10472"},"properties":{"addonFlags":{"additionalProperties":{"type":"boolean"},"type":"object"},"backupEnabled":{"type":"boolean"},"hostname":{"type":"string"},"planName":{"type":"string"},"primaryIp":{"type":"string"},"rescue":{"description":"Whether the instance is booted into rescue mode.","type":"boolean"},"rootPassword":{"description":"Current root password for the instance.","type":"string"},"serviceId":{"type":"string"},"serviceType":{"type":"string"},"status":{"type":"string"},"template":{"description":"Installed OS image key.","type":"string"},"templates":{"description":"OS images available for reinstall.","items":{"type":"string"},"type":"array"},"usageHistory":{"description":"Recent CPU/RAM/disk/network samples (omitted when unavailable).","items":{"$ref":"#/components/schemas/VPSUsagePoint"},"type":"array"},"vpsId":{"type":"string"}},"required":["serviceId","vpsId","serviceType","planName","hostname","template","primaryIp","status"],"type":"object"},"VPSPlanChangeOverview":{"properties":{"currentDiskGb":{"type":"integer"},"currentMonthlyUsd":{"type":"number"},"currentName":{"type":"string"},"currentPlan":{"type":"string"},"currentRamGb":{"type":"integer"},"currentVcpu":{"type":"integer"},"line":{"type":"string"},"options":{"items":{"$ref":"#/components/schemas/VPSPlanOption"},"type":"array"},"pendingReboot":{"description":"A paid change is staged","type":"boolean","waiting for a reboot to apply.":null},"serviceId":{"type":"string"}},"required":["serviceId","line","currentPlan","options"],"type":"object"},"VPSPlanOption":{"description":"A plan the VPS can move to within its line.","properties":{"deltaMonthly":{"type":"number"},"diskGb":{"description":"The plan's included disk.","type":"integer"},"effectiveUsd":{"description":"Tier price plus, on a downgrade, the retained-disk surcharge.","type":"number"},"keptDiskGb":{"description":"The disk the VPS actually keeps (never shrinks).","type":"integer"},"kind":{"enum":["upgrade","downgrade"],"type":"string"},"monthlyUsd":{"description":"The tier price per month.","type":"number"},"name":{"type":"string"},"planKey":{"type":"string"},"proratedDueUsd":{"description":"Charged now (\u003e0) or credited (\u003c0) for the rest of the period.","type":"number"},"ramGb":{"type":"integer"},"vcpu":{"type":"integer"}},"required":["planKey","name","vcpu","ramGb","diskGb","keptDiskGb","monthlyUsd","effectiveUsd","kind","proratedDueUsd"],"type":"object"},"VPSUsagePoint":{"properties":{"cpuUsage":{"type":"number"},"diskUsage":{"type":"number"},"netIn":{"type":"number"},"netOut":{"type":"number"},"ramUsage":{"type":"number"},"timestamp":{"format":"date-time","type":"string"}},"required":["timestamp","cpuUsage","ramUsage","diskUsage","netIn","netOut"],"type":"object"}},"securitySchemes":{"bearerToken":{"description":"A personal API token prefixed with `scdn_`.","scheme":"bearer","type":"http"}}},"info":{"contact":{"name":"SprintCDN Support","url":"https://sprintcdn.com/contact"},"description":"The SprintCDN API lets you build on top of your account: manage Cloud VPS and\ndedicated servers, configure Layer 7 CDN/WAF, read DDoS attack telemetry,\nhandle billing and place orders — everything you can do in the customer panel.\n\n## Base URL\n\nAll endpoints are served under a single versioned base URL:\n\n```\nhttps://api.sprintcdn.com/api/v1\n```\n\nEvery path in this document is relative to that base.\n\n## Authentication\n\nAuthenticate with a personal API token. Create one in the panel under\n**Settings → API**, then send it as a Bearer token on every request:\n\n```\nAuthorization: Bearer scdn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n```\n\nTokens start with the `scdn_` prefix. Keep them secret — a token carries the\nfull access of its scopes. A token can be revoked at any time from the panel,\nand blocking an account immediately invalidates all of its tokens.\n\n## Scopes\n\nEach token has one of two scopes:\n\n| Scope   | Grants |\n|---------|--------|\n| `read`  | Read-only access: `GET` and `HEAD` requests to any resource you own. |\n| `write` | Everything `read` allows, plus mutations (`POST`, `PUT`, `PATCH`, `DELETE`) — power actions, reinstalls, DNS changes, orders and payments. |\n\nA `read` token that attempts a mutation receives `403 Forbidden`.\n\n## What tokens cannot do\n\nFor safety, API tokens are **never** allowed to touch the account-security\nsurface, even with `write` scope: they cannot change your password, manage\ntwo-factor authentication, list or revoke sessions, or create and delete API\ntokens. Those actions are available only to a signed-in browser session. The\nsingle exception is `GET /auth/me`, which lets a token confirm which account\nit belongs to.\n\n## Errors\n\nErrors use standard HTTP status codes and return a JSON body with a single\nhuman-readable `message` field:\n\n```json\n{ \"message\": \"this API token is read-only (missing 'write' scope)\" }\n```\n\n| Status | Meaning |\n|--------|---------|\n| `400`  | The request was malformed or failed validation. |\n| `401`  | Missing or invalid token. |\n| `403`  | The token lacks the required scope, or the endpoint is not token-accessible. |\n| `404`  | The resource does not exist or you do not own it. |\n| `409`  | Conflict — e.g. a duplicate resource. |\n| `429`  | Rate limited — slow down and retry later. |\n| `5xx`  | Something went wrong on our side; the response never leaks internal detail. |\n\n## Money and time\n\nAll monetary amounts are in US dollars as JSON numbers, in fields ending\n`Usd`. All timestamps are RFC 3339 strings in UTC (e.g.\n`2026-07-04T12:30:00Z`). Nullable timestamps are omitted when empty.\n","license":{"name":"Proprietary"},"summary":"Programmatic access to SprintCDN — servers, CDN/WAF, DDoS protection, billing and ordering.","title":"SprintCDN API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/auth/me":{"get":{"description":"Returns the account the API token belongs to. The only `/auth/*` endpoint a token may call — use it to validate a token.","operationId":"getCurrentUser","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"user":{"$ref":"#/components/schemas/User"}},"required":["user"],"type":"object"}}},"description":"The authenticated account."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Who am I","tags":["Account"]}},"/billing/balance":{"get":{"description":"The account's available store credit and its ledger (grants, refunds, applications), newest first.","operationId":"getBillingBalance","responses":{"200":{"content":{"application/json":{"schema":{"example":{"balanceUsd":24.8,"currency":"USD","ledger":[{"amountUsd":50,"createdAt":"2026-07-04T15:08:03Z","id":"cr_1Zt6Hn","reason":"Top-up via stripe"},{"amountUsd":-12.5,"createdAt":"2026-07-01T12:03:11Z","id":"cr_0Kp9Rd","invoiceId":"inv_3Ab9Xz","reason":"Applied to invoice SCDN-2026-004182"}]},"properties":{"balanceUsd":{"type":"number"},"currency":{"type":"string"},"ledger":{"items":{"$ref":"#/components/schemas/CreditEntry"},"type":"array"}},"required":["balanceUsd","currency","ledger"],"type":"object"}}},"description":"Credit balance and ledger."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Store-credit balance","tags":["Billing"]}},"/billing/coupons/validate":{"post":{"description":"Checks a coupon or affiliate code against a prospective order. Validity is in the body, not the status.","operationId":"validateCoupon","requestBody":{"content":{"application/json":{"schema":{"example":{"amountUsd":49,"billingCycleMonths":1,"code":"WELCOME10","email":"you@example.com","productType":"cloud-vps"},"properties":{"amountUsd":{"description":"Pre-discount total.","type":"number"},"billingCycleMonths":{"description":"Normalized to 1, 3, 6 or 12.","type":"integer"},"code":{"type":"string"},"email":{"format":"email","type":"string"},"productType":{"type":"string"}},"required":["code"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"example":{"discountUsd":4.9,"finalUsd":44.1,"message":"","percentOff":10,"valid":true},"properties":{"discountUsd":{"type":"number"},"finalUsd":{"type":"number"},"message":{"description":"Present when invalid.","type":"string"},"percentOff":{"type":"number"},"valid":{"type":"boolean"}},"required":["valid"],"type":"object"}}},"description":"The validation result."},"400":{"$ref":"#/components/responses/BadRequest"}},"summary":"Validate a coupon","tags":["Ordering"]}},"/billing/invoices":{"get":{"operationId":"listInvoices","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoices":{"items":{"$ref":"#/components/schemas/Invoice"},"type":"array"}},"required":["invoices"],"type":"object"}}},"description":"The account's invoices."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List invoices","tags":["Billing"]}},"/billing/invoices/{invoiceId}":{"get":{"operationId":"getInvoice","parameters":[{"in":"path","name":"invoiceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"}},"required":["invoice"],"type":"object"}}},"description":"One invoice."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get an invoice","tags":["Billing"]}},"/billing/invoices/{invoiceId}/pdf":{"get":{"operationId":"downloadInvoicePdf","parameters":[{"in":"path","name":"invoiceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/pdf":{"schema":{"format":"binary","type":"string"}}},"description":"The invoice as a PDF document."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Download invoice PDF","tags":["Billing"]}},"/billing/payment-methods":{"get":{"operationId":"listPaymentMethods","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cardEnabled":{"type":"boolean"},"methods":{"items":{"$ref":"#/components/schemas/SavedMethod"},"type":"array"}},"required":["methods","cardEnabled"],"type":"object"}}},"description":"Saved payment methods."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List saved cards","tags":["Billing"]}},"/billing/payments/card":{"post":{"description":"Settles an invoice and triggers provisioning of anything it covers. Requires the `write` scope.","operationId":"payInvoiceByCard","requestBody":{"content":{"application/json":{"schema":{"example":{"cardLast4":"4242","invoiceId":"inv_3Ab9Xz"},"properties":{"cardLast4":{"description":"Optional display last-4 recorded on the payment.","type":"string"},"invoiceId":{"type":"string"}},"required":["invoiceId"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"}},"required":["invoice"],"type":"object"}}},"description":"The now-paid invoice."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Pay an invoice by card","tags":["Billing"]}},"/billing/payments/crypto":{"post":{"description":"Creates a cryptocurrency payment for an invoice and returns checkout details. Requires the `write` scope.","operationId":"payInvoiceByCrypto","requestBody":{"content":{"application/json":{"schema":{"example":{"currency":"BTC","invoiceId":"inv_3Ab9Xz"},"properties":{"currency":{"description":"Crypto currency, e.g. BTC.","type":"string"},"invoiceId":{"type":"string"}},"required":["invoiceId","currency"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"example":{"invoice":{"amountUsd":59.29,"currency":"USD","id":"inv_3Ab9Xz","invoiceNumber":"SCDN-2026-004182","status":"unpaid"},"payment":{"address":"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq","amount":"0.00090012","checkoutUrl":"https://nowpayments.io/payment/?iid=4937261","currency":"BTC","invoiceId":"inv_3Ab9Xz","provider":"nowpayments","status":"waiting","transactionId":"np_4937261"}},"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"},"payment":{"properties":{"address":{"type":"string"},"amount":{"type":"string"},"checkoutUrl":{"format":"uri","type":"string"},"currency":{"type":"string"},"invoiceId":{"type":"string"},"provider":{"type":"string"},"status":{"type":"string"},"transactionId":{"type":"string"}},"type":"object"}},"type":"object"}}},"description":"Payment created."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Start a crypto payment","tags":["Billing"]}},"/billing/topup/auto":{"get":{"description":"The account's automatic top-up rule. When enabled and the balance drops under the threshold, the chosen saved card is charged the configured amount.","operationId":"getAutoTopUp","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"autoTopUp":{"$ref":"#/components/schemas/AutoTopUpConfig"}},"required":["autoTopUp"],"type":"object"}}},"description":"The current rule."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Auto top-up rule","tags":["Billing"]},"put":{"description":"Enabling needs a saved card and an amount between $5 and $10000.","operationId":"setAutoTopUp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopUpConfig"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"autoTopUp":{"$ref":"#/components/schemas/AutoTopUpConfig"}},"required":["autoTopUp"],"type":"object"}}},"description":"The saved rule."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Save the auto top-up rule","tags":["Billing"]}},"/billing/topup/charge":{"post":{"description":"Charges one of the account's saved cards immediately (the default card when methodId is omitted) and credits the balance once the payment settles — usually within the same call.","operationId":"chargeTopUp","requestBody":{"content":{"application/json":{"schema":{"example":{"amountUsd":50,"methodId":"pm_9Fb2Lq"},"properties":{"amountUsd":{"maximum":10000,"minimum":5,"type":"number"},"methodId":{"description":"A saved payment method id; omit for the default card.","type":"string"}},"required":["amountUsd"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"topup":{"$ref":"#/components/schemas/BalanceTopUp"}},"required":["topup"],"type":"object"}}},"description":"The top-up attempt."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Identity verification is required before card payments."},"503":{"description":"Card payments are not configured."}},"summary":"Top up with a saved card","tags":["Billing"]}},"/billing/topup/intent":{"post":{"description":"Creates a Stripe PaymentIntent for the amount; confirm its client secret in the browser. The balance is credited when the payment settles. Amounts are limited to $5–$10000.","operationId":"createTopUpIntent","requestBody":{"content":{"application/json":{"schema":{"properties":{"amountUsd":{"maximum":10000,"minimum":5,"type":"number"}},"required":["amountUsd"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"intent":{"$ref":"#/components/schemas/CardIntent"}},"required":["intent"],"type":"object"}}},"description":"The intent to confirm."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"Identity verification is required before card payments."},"503":{"description":"Card payments are not configured."}},"summary":"Start a balance top-up with a new card","tags":["Billing"]}},"/billing/topup/invoice":{"post":{"description":"Raises an unpaid invoice with a \"Balance top-up $X\" line item. Pay it like any other invoice — card, crypto, or a transfer recorded by support; the balance is credited the top-up amount when the invoice is paid. VAT (when enabled) is added on top so the credited amount is exactly what was requested. Amounts are limited to $5–$10000.","operationId":"createTopUpInvoice","requestBody":{"content":{"application/json":{"schema":{"properties":{"amountUsd":{"maximum":10000,"minimum":5,"type":"number"}},"required":["amountUsd"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"}},"required":["invoice"],"type":"object"}}},"description":"The invoice to pay."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Top up by invoice (any payment method)","tags":["Billing"]}},"/billing/topups":{"get":{"description":"The account's top-up attempts, newest first.","operationId":"listTopUps","parameters":[{"in":"query","name":"limit","schema":{"maximum":200,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"topups":{"items":{"$ref":"#/components/schemas/BalanceTopUp"},"type":"array"}},"required":["topups"],"type":"object"}}},"description":"Top-ups."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Top-up history","tags":["Billing"]}},"/billing/usage":{"get":{"description":"The per-hour breakdown behind hourly-billed Cloud services — what was allocated, how long it ran, and what each resource cost. Defaults to the last 7 days.","operationId":"listHourlyUsage","parameters":[{"in":"query","name":"from","schema":{"format":"date-time","type":"string"}},{"in":"query","name":"to","schema":{"format":"date-time","type":"string"}},{"description":"Limit the log to one service.","in":"query","name":"serviceId","schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"maximum":1000,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"example":{"from":"2026-06-28T00:00:00Z","to":"2026-07-05T00:00:00Z","usage":[{"cpuUsd":0.021918,"createdAt":"2026-07-04T15:00:05Z","diskGb":80,"diskUsd":0.010959,"id":"hus_2Wc7Rk","ipCount":1,"ipUsd":0.00411,"periodEnd":"2026-07-04T15:00:00Z","periodStart":"2026-07-04T14:00:00Z","ramMb":8192,"ramUsd":0.021918,"runningSeconds":3600,"serviceId":"svc_8f2k41","totalSeconds":3600,"totalUsd":0.058904,"vcpu":4}]},"properties":{"from":{"format":"date-time","type":"string"},"to":{"format":"date-time","type":"string"},"usage":{"items":{"$ref":"#/components/schemas/HourlyUsageRecord"},"type":"array"}},"required":["from","to","usage"],"type":"object"}}},"description":"Usage records."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Hourly usage log","tags":["Cloud Instances"]}},"/billing/vat-info":{"get":{"description":"Whether VAT applies to the account and at what rate.","operationId":"getVatInfo","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"VAT details."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"VAT applicability","tags":["Billing"]}},"/catalog/addons":{"get":{"operationId":"listAddons","parameters":[{"in":"query","name":"productType","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Add-ons available for the product type."}},"security":[],"summary":"List add-ons","tags":["Catalog"]}},"/catalog/cloud-instances":{"get":{"description":"The build-your-own compute category in one call — the three lines with their bounds, the per-resource rates a configurator prices with, the presets (with effective monthly and hourly prices), whether hourly billing is on, and the minimum order.","operationId":"getCloudInstanceCatalog","responses":{"200":{"content":{"application/json":{"schema":{"example":{"hourlyEnabled":true,"lines":[{"blurb":"Lean on cores. For game servers, encoders and CI runners.","key":"compute","maxDiskGb":1000,"maxRamGb":128,"maxVcpu":32,"minDiskGb":20,"minRamGb":1,"minVcpu":1,"name":"Compute Optimized"},{"blurb":"Room for large working sets. For databases, caches and JVMs.","key":"memory","maxDiskGb":1000,"maxRamGb":384,"maxVcpu":32,"minDiskGb":20,"minRamGb":4,"minVcpu":1,"name":"Memory Optimized"},{"blurb":"From 100 GB of replicated NVMe. For file storage, backups and analytics.","key":"storage","maxDiskGb":4000,"maxRamGb":256,"maxVcpu":32,"minDiskGb":100,"minRamGb":2,"minVcpu":1,"name":"Storage Optimized"}],"minMonthlyUsd":10,"presets":[{"diskGb":80,"displayName":"Compute · 4 vCPU / 8 GB","hourlyUsd":0.058904,"line":"compute","monthlyUsd":43,"planKey":"ci-compute-4-8","ramGb":8,"vcpu":4},{"diskGb":80,"displayName":"Memory · 4 vCPU / 32 GB","hourlyUsd":0.124658,"line":"memory","monthlyUsd":91,"planKey":"ci-memory-4-32","ramGb":32,"vcpu":4}],"rates":{"diskGbMonthlyUsd":0.1,"hoursPerMonth":730,"ipv4MonthlyUsd":3,"ramGbMonthlyUsd":2,"vcpuMonthlyUsd":4}},"properties":{"hourlyEnabled":{"type":"boolean"},"lines":{"items":{"$ref":"#/components/schemas/CloudInstanceLine"},"type":"array"},"minMonthlyUsd":{"description":"The smallest monthly total the category sells. Orders and resizes priced under it are rejected.","type":"number"},"presets":{"items":{"$ref":"#/components/schemas/CloudInstancePreset"},"type":"array"},"rates":{"$ref":"#/components/schemas/CloudInstanceRates"}},"required":["lines","rates","presets","hourlyEnabled","minMonthlyUsd"],"type":"object"}}},"description":"Lines, rates and presets."}},"security":[],"summary":"Cloud Instances catalog","tags":["Cloud Instances"]}},"/catalog/os-images":{"get":{"operationId":"listOsImages","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Available OS images."}},"security":[],"summary":"List installable OS images","tags":["Catalog"]}},"/catalog/plans":{"get":{"description":"The public product catalog. Optionally filter by product type.","operationId":"listPlans","parameters":[{"in":"query","name":"productType","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"plans":{"items":{"$ref":"#/components/schemas/Plan"},"type":"array"}},"required":["plans"],"type":"object"}}},"description":"Active plans."}},"security":[],"summary":"List product plans","tags":["Catalog"]}},"/catalog/vps/templates":{"get":{"operationId":"listVpsTemplates","parameters":[{"in":"query","name":"productType","required":false,"schema":{"enum":["cloud-vps","gpu-vps"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"templates":{"items":{"type":"string"},"type":"array"}},"required":["templates"],"type":"object"}}},"description":"Installable templates for the VPS type."}},"security":[],"summary":"List VPS OS templates","tags":["Catalog"]}},"/kb":{"get":{"description":"Every category with its published article summaries, localised to `locale` (falls back to English per field). Public — no token required.","operationId":"getKnowledgebase","parameters":[{"description":"Locale code (en, de, fr, es, it, nl, pl, ru, ja, zh).","in":"query","name":"locale","required":false,"schema":{"example":"pl","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"kb":{"properties":{"categories":{"items":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/KbArticleSummary"},"type":"array"},"description":{"type":"string"},"icon":{"example":"shield","type":"string"},"position":{"type":"integer"},"slug":{"example":"ddos-layer7","type":"string"},"title":{"type":"string"}},"type":"object"},"type":"array"}},"type":"object"}},"type":"object"}}},"description":"Categories with article summaries."}},"security":[],"summary":"Knowledgebase overview","tags":["Knowledgebase"]}},"/kb/articles/{slug}":{"get":{"description":"One published article (Markdown body) in the requested locale, plus up to five related articles from the same category. Public — no token required.","operationId":"getKnowledgebaseArticle","parameters":[{"in":"path","name":"slug","required":true,"schema":{"example":"restore-visitor-ip","type":"string"}},{"in":"query","name":"locale","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"article":{"allOf":[{"$ref":"#/components/schemas/KbArticleSummary"},{"properties":{"body":{"description":"Markdown source.","type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"type":"object"}]},"related":{"items":{"$ref":"#/components/schemas/KbArticleSummary"},"type":"array"}},"type":"object"}}},"description":"The article and related summaries."},"404":{"$ref":"#/components/responses/NotFound"}},"security":[],"summary":"Read one article","tags":["Knowledgebase"]}},"/kb/search":{"get":{"description":"Full-text search over published article titles and bodies in the requested locale. Public — no token required.","operationId":"searchKnowledgebase","parameters":[{"description":"Search phrase.","in":"query","name":"q","required":true,"schema":{"type":"string"}},{"in":"query","name":"locale","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KbArticleSummary"},"type":"array"}},"type":"object"}}},"description":"Matching article summaries (up to 25)."}},"security":[],"summary":"Search articles","tags":["Knowledgebase"]}},"/layer7/domains":{"post":{"description":"Onboards a domain to the CDN/WAF on the chosen plan. Scans the domain's\ncurrent DNS and returns the nameservers to delegate to plus the discovered\nrecords. Paid plans return an invoice to settle first. Requires the `write` scope.\n","operationId":"addLayer7Domain","requestBody":{"content":{"application/json":{"schema":{"example":{"domain":"example.com","plan":"layer7-pro"},"properties":{"domain":{"type":"string"},"plan":{"description":"A layer7-protection plan key.","type":"string"}},"required":["domain","plan"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"example":{"dnsRecords":[{"id":"rec_2Bd7Km","name":"@","proxied":true,"ttl":3600,"type":"A","value":"185.248.171.7"},{"id":"rec_5Xk9Wp","name":"www","proxied":true,"ttl":3600,"type":"CNAME","value":"example.com"}],"domainId":"dom_4Qm7Zt","invoice":{"amountUsd":24.2,"currency":"USD","id":"inv_7Fd2Qm","invoiceNumber":"SCDN-2026-004190","status":"unpaid"},"nameservers":["gwen.ns.sprintcdn.com","hank.ns.sprintcdn.com"],"ok":true,"orderId":"ord_9Lm3Vt","paymentRequired":true,"serviceId":"svc_l7a1b2","status":"pending_payment"},"properties":{"dnsRecords":{"items":{"$ref":"#/components/schemas/DNSRecord"},"type":"array"},"domainId":{"type":"string"},"invoice":{"$ref":"#/components/schemas/Invoice"},"nameservers":{"items":{"type":"string"},"type":"array"},"ok":{"type":"boolean"},"orderId":{"type":"string"},"paymentRequired":{"type":"boolean"},"serviceId":{"type":"string"},"status":{"type":"string"}},"type":"object"}}},"description":"Domain added (or an invoice to pay first)."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The domain is already assigned to another service."}},"summary":"Add a domain","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/domains/{domainId}":{"put":{"description":"Replaces the domain's entire DNS record set and pushes it to our\nauthoritative DNS. Note `domainId` is the domain-entity id (from the\nactivation state), not the service id. Requires the `write` scope.\n","operationId":"replaceLayer7DnsRecords","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"dnsRecords":{"items":{"$ref":"#/components/schemas/DNSRecord"},"type":"array"}},"required":["dnsRecords"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Records replaced."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Replace all DNS records","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/domains/{domainId}/check-ns":{"post":{"description":"Re-validates that the domain is delegated to our nameservers. Requires the `write` scope.","operationId":"checkLayer7Nameservers","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"active":{"type":"boolean"},"ok":{"type":"boolean"}},"type":"object"}}},"description":"Delegation status."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Re-check nameserver delegation","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/domains/{domainId}/dns-records":{"get":{"description":"Returns every DNS record for the domain, each with its stable id. For MX/SRV records the priority is returned as a separate field.","operationId":"listLayer7DnsRecords","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"records":{"items":{"$ref":"#/components/schemas/DNSRecord"},"type":"array"}},"required":["records"],"type":"object"}}},"description":"The domain's DNS records."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List DNS records","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Adds a single DNS record to the domain and returns it with its new id.\nFor MX/SRV set the `priority` field and leave the priority out of `value`.\nRequires the `write` scope.\n","operationId":"addLayer7DnsRecord","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSRecord"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"record":{"$ref":"#/components/schemas/DNSRecord"}},"required":["record"],"type":"object"}}},"description":"The created record."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Add a DNS record","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/domains/{domainId}/dns-records/{recordId}":{"delete":{"description":"Removes a single DNS record identified by its id. Requires the `write` scope.","operationId":"deleteLayer7DnsRecord","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}},{"in":"path","name":"recordId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Record deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Delete a DNS record","tags":["Layer 7 CDN \u0026 WAF"]},"patch":{"description":"Replaces a single DNS record identified by its id. Requires the `write` scope.","operationId":"updateLayer7DnsRecord","parameters":[{"in":"path","name":"domainId","required":true,"schema":{"type":"string"}},{"in":"path","name":"recordId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSRecord"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"record":{"$ref":"#/components/schemas/DNSRecord"}},"required":["record"],"type":"object"}}},"description":"The updated record."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Update a DNS record","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}":{"delete":{"description":"Cancels and tears down the CDN/WAF service. Requires the `write` scope.","operationId":"deleteLayer7Service","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Cancelled."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Cancel a Layer 7 service","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/activation":{"get":{"description":"The domain's delegation status, nameservers and current DNS records.","operationId":"getLayer7Activation","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"activation":{"$ref":"#/components/schemas/Layer7ActivationState"}},"required":["activation"],"type":"object"}}},"description":"Activation state."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Domain activation state","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/analytics":{"get":{"description":"Requests, unique visitors, geography, status codes, top paths and browsers over a window. Sub-24h ranges require a professional or enterprise plan.","operationId":"getLayer7Analytics","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"range","required":false,"schema":{"default":"24h","enum":["1h","3h","6h","12h","24h","7d","30d"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"analytics":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"Analytics for the window."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The range requires a higher plan."},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Traffic analytics","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache-stats":{"get":{"operationId":"getLayer7CacheStats","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cacheStats":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"Cache hit ratio and bandwidth saved over 24h."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Cache statistics","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache/browser-ttl":{"get":{"operationId":"getLayer7BrowserTtl","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ttlHours":{"type":"integer"}},"type":"object"}}},"description":"Browser TTL in hours."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get browser cache TTL","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7BrowserTtl","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"ttlHours":{"type":"integer"}},"required":["ttlHours"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set browser cache TTL","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache/development-mode":{"get":{"operationId":"getLayer7DevMode","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"type":"object"}}},"description":"Development-mode state."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get development mode","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"A 3-hour cache bypass. Requires the `write` scope.","operationId":"setLayer7DevMode","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set development mode","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache/level":{"get":{"operationId":"getLayer7CacheLevel","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"level":{"enum":["standard","no_query_string","ignore_query_string"],"type":"string"}},"type":"object"}}},"description":"The current caching level."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get caching level","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7CacheLevel","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"level":{"enum":["standard","no_query_string","ignore_query_string"],"type":"string"}},"required":["level"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set caching level","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache/purge-everything":{"post":{"description":"Requires the `write` scope.","operationId":"purgeLayer7Cache","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Purged."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Purge all cache","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/cache/purge-url":{"post":{"description":"Requires the `write` scope.","operationId":"purgeLayer7Urls","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"urls":{"items":{"format":"uri","type":"string"},"type":"array"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Purged."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Purge specific URLs","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/firewall/rules":{"get":{"operationId":"getLayer7FirewallRules","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Required for multi-domain services.","in":"query","name":"domain","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"firewall":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"The firewall rule set for the domain."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get firewall (WAF) rules","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Replaces the full rule set for one domain. Requires the `write` scope.","operationId":"setLayer7FirewallRules","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"description":"A full firewall rules config (domain plus rules array).","type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Saved."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Replace firewall (WAF) rules","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/network":{"get":{"operationId":"getLayer7Network","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"IP geolocation/ASN":null,"content":{"application/json":{"schema":{"properties":{"settings":{"properties":{"ipAsn":{"type":"boolean"},"ipGeolocation":{"type":"boolean"},"maxUploadSize":{"type":"string"},"webSockets":{"type":"boolean"}},"type":"object"}},"type":"object"}}},"description":"WebSockets","max upload size.":null},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get network settings","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Larger upload sizes require higher plans. Requires the `write` scope.","operationId":"setLayer7Network","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"ipAsn":{"type":"boolean"},"ipGeolocation":{"type":"boolean"},"maxUploadSize":{"enum":["100mb","200mb","250mb","300mb","400mb","450mb","500mb"],"type":"string"},"webSockets":{"type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The chosen size requires a higher plan."}},"summary":"Update network settings","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/page-rules":{"get":{"operationId":"getLayer7PageRules","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"domain","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"pageRules":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"The page-rule set for the domain."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get page rules","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Replaces the full page-rule set for one domain (per-URL cache, redirects, HTTPS). Requires the `write` scope.","operationId":"setLayer7PageRules","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Saved."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Replace page rules","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/performance":{"get":{"operationId":"getLayer7Performance","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"HTTP/3":null,"content":{"application/json":{"schema":{"properties":{"settings":{"properties":{"http2":{"type":"boolean"},"http3":{"type":"boolean"},"imageOptimizationWebp":{"type":"boolean"},"imageResize":{"type":"boolean"}},"type":"object"}},"type":"object"}}},"description":"HTTP/2","image optimization.":null},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get performance settings","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7Performance","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"http2":{"type":"boolean"},"http3":{"type":"boolean"},"imageOptimizationWebp":{"type":"boolean"},"imageResize":{"type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Update performance settings","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/protection":{"get":{"operationId":"getLayer7Protection","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"settings":{"properties":{"paused":{"type":"boolean"},"securityLevel":{"enum":["essentially_off","low","medium","high","under_attack"],"type":"string"},"underAttack":{"type":"boolean"}},"type":"object"}},"type":"object"}}},"description":"Quick protection controls."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get protection settings","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7Protection","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"paused":{"type":"boolean"},"securityLevel":{"enum":["essentially_off","low","medium","high","under_attack"],"type":"string"},"underAttack":{"type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Update protection settings","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl":{"get":{"operationId":"getLayer7Certificates","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"certificates":{"items":{"additionalProperties":true,"type":"object"},"type":"array"}},"type":"object"}}},"description":"Certificate status per domain."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List SSL certificates","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl/custom-certificate":{"post":{"description":"Applies a customer-provided TLS certificate and key. Requires the `write` scope.","operationId":"uploadLayer7Certificate","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"tlsCert":"-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIJAKZ...\n-----END CERTIFICATE-----\n","tlsKey":"-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0...\n-----END PRIVATE KEY-----\n"},"properties":{"tlsCert":{"description":"PEM certificate.","type":"string"},"tlsKey":{"description":"PEM private key.","type":"string"}},"required":["tlsCert","tlsKey"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Applied."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Upload a custom certificate","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl/encryption-mode":{"get":{"operationId":"getLayer7EncryptionMode","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"mode":{"enum":["flexible","full","full_strict"],"type":"string"}},"type":"object"}}},"description":"The current mode."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get encryption mode","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7EncryptionMode","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"mode":{"enum":["flexible","full","full_strict"],"type":"string"}},"required":["mode"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set encryption mode","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl/hsts":{"get":{"operationId":"getLayer7Hsts","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"type":"object"}}},"description":"State."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get HSTS","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7Hsts","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set HSTS","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl/https-rewrite":{"get":{"operationId":"getLayer7HttpsRewrite","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"type":"object"}}},"description":"State."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get Always-Use-HTTPS","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7HttpsRewrite","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set Always-Use-HTTPS","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/ssl/minimum-tls-version":{"get":{"operationId":"getLayer7MinTls","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"maximumTlsVersion":{"type":"string"},"minimumTlsVersion":{"type":"string"}},"type":"object"}}},"description":"The min/max TLS versions."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get minimum TLS version","tags":["Layer 7 CDN \u0026 WAF"]},"post":{"description":"Requires the `write` scope.","operationId":"setLayer7MinTls","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"minimumTlsVersion":{"enum":["TLSv1.1","TLSv1.2","TLSv1.3"],"type":"string"}},"required":["minimumTlsVersion"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Set minimum TLS version","tags":["Layer 7 CDN \u0026 WAF"]}},"/layer7/services/{id}/upgrade":{"post":{"description":"Raises an invoice for a plan upgrade. Requires the `write` scope.","operationId":"upgradeLayer7Plan","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"targetPlan":{"enum":["professional","enterprise"],"type":"string"}},"required":["targetPlan"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoiceId":{"type":"string"},"ok":{"type":"boolean"}},"type":"object"}}},"description":"Invoice raised."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Upgrade the plan","tags":["Layer 7 CDN \u0026 WAF"]}},"/orders":{"get":{"description":"The account's orders, newest first, each linked to the service it became once provisioned.","operationId":"listOrders","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"orders":{"items":{"$ref":"#/components/schemas/OrderView"},"type":"array"}},"required":["orders"],"type":"object"}}},"description":"The account's orders."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Order history","tags":["Ordering"]}},"/orders/complete":{"post":{"description":"Raises an invoice and creates a provisioning order for one product line.\nWhen called with a token, the order is attached to your account and free\n($0) tiers are auto-provisioned. Payment is a separate step (see the\nBilling endpoints). The price is recomputed server-side; `amountUsd` must\nmatch or the request is rejected.\n","operationId":"placeOrder","requestBody":{"content":{"application/json":{"schema":{"example":{"amountUsd":49,"billingCycleMonths":1,"productConfig":{"hostname":"web-01","operatingSystem":"ubuntu-24.04","sshKey":"ssh-ed25519 AAAA... you@example.com"},"productPlan":"cloud-vps-4","productType":"cloud-vps"},"properties":{"address":{"type":"string"},"amountUsd":{"description":"Total for the whole billing cycle; must match the server price.","type":"number"},"billingCycleMonths":{"description":"1, 3, 6 or 12 for prepaid cycles; 0 = hourly (Cloud services only, paid from the account balance — needs the minimum balance and an existing account).","type":"integer"},"city":{"type":"string"},"companyName":{"type":"string"},"country":{"type":"string"},"couponCode":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"postalCode":{"type":"string"},"productConfig":{"additionalProperties":true,"description":"Per-product configuration (hostname, OS, sshKey, domain, disks, …).","type":"object"},"productPlan":{"description":"Plan key from the catalog.","type":"string"},"productType":{"enum":["cloud-vps","gpu-vps","dedicated-server","layer7-protection","ddos-l34","network-protection","ip-transit"],"type":"string"},"referralCode":{"type":"string"},"vatNumber":{"type":"string"}},"required":["productType","productPlan","amountUsd"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"quoteOnly":{"type":"boolean"}},"type":"object"}}},"description":"A quote-only tier — our team will follow up (no invoice raised)."},"201":{"content":{"application/json":{"schema":{"example":{"autoProvisioned":false,"invoice":{"amountUsd":59.29,"createdAt":"2026-07-05T09:14:00Z","currency":"USD","dueDate":"2026-07-12T09:14:00Z","id":"inv_3Ab9Xz","invoiceNumber":"SCDN-2026-004182","status":"unpaid"},"token":"scdn_live_9c1a7f3e2b8d4c6a","user":{"createdAt":"2026-03-12T09:41:00Z","email":"you@example.com","firstName":"Alex","id":"usr_7Qk2mN9x","lastName":"Rivera"}},"properties":{"autoProvisioned":{"description":"True when the total was ≤ 0 and the service was provisioned immediately.","type":"boolean"},"invoice":{"$ref":"#/components/schemas/Invoice"},"token":{"type":"string"},"user":{"$ref":"#/components/schemas/User"}},"type":"object"}}},"description":"Order placed; an invoice was raised."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The configuration is out of stock, or the domain is already taken."}},"summary":"Place an order","tags":["Ordering"]}},"/portal/affiliate":{"get":{"description":"Stats, referral code, commission ledger and payout history.","operationId":"getAffiliate","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Affiliate dashboard."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Affiliate dashboard","tags":["Affiliate"]}},"/portal/affiliate/convert":{"post":{"description":"Requires the `write` scope.","operationId":"convertAffiliateEarnings","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Converted."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Convert earnings to account credit","tags":["Affiliate"]}},"/portal/affiliate/payout":{"post":{"description":"Requires the `write` scope.","operationId":"requestAffiliatePayout","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Payout requested."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Request a payout","tags":["Affiliate"]}},"/portal/affiliate/request":{"post":{"description":"Requires the `write` scope.","operationId":"requestAffiliateAccess","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Request submitted."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Request affiliate access","tags":["Affiliate"]}},"/portal/attacks":{"get":{"description":"Every DDoS attack recorded against any of the account's services, newest first, each tagged with the service it targeted.","operationId":"listAccountAttacks","parameters":[{"in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountAttacksResult"}}},"description":"Paginated attacks across all services."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Account-wide attack history","tags":["Network \u0026 DDoS"]}},"/portal/attacks/active":{"get":{"description":"The account's ongoing attacks only (status active), each tagged with the service it targets. A cheap poll target for building live attack alerts.","operationId":"listActiveAccountAttacks","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"attacks":{"items":{"$ref":"#/components/schemas/AccountAttack"},"type":"array"}},"required":["attacks"],"type":"object"}}},"description":"The currently-active attacks."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Currently-active attacks","tags":["Network \u0026 DDoS"]}},"/portal/dedicated/{id}":{"get":{"description":"Hardware, network, location and live BMC/switch telemetry for a bare-metal server.","operationId":"getDedicated","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"dedicated":{"additionalProperties":true,"description":"Server detail (hardware, network, powerState, optional system/metrics/network telemetry).","type":"object"}},"required":["dedicated"],"type":"object"}}},"description":"Dedicated server details."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get a dedicated server","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/console":{"get":{"description":"Pre-flights the server's BMC VNC console and returns a proxied WebSocket\nURL to connect to it (the API host bridges to the BMC; its address is\nnever exposed). Returns `502` with a message when the server has no BMC\nyet or its VNC console is unreachable.\n","operationId":"getDedicatedConsole","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"password":{"type":"string"},"websocket_url":{"type":"string"}},"required":["websocket_url"],"type":"object"}}},"description":"A proxied console WebSocket URL and its one-time password."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The BMC console is unavailable or unreachable."}},"summary":"Open the BMC console","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/disks":{"get":{"description":"The server's physical drives, read live from its BMC (Redfish) — used to\noffer disk/RAID layout choices before a reinstall. If the BMC can't be\nreached the response is still 200 with an empty `disks` array and a masked\n`error` string, so a picker degrades gracefully instead of failing.\n","operationId":"getDedicatedDisks","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"disks":{"items":{"$ref":"#/components/schemas/DedicatedDrive"},"type":"array"},"error":{"description":"Present only when the BMC could not be read.","type":"string"}},"required":["disks"],"type":"object"}}},"description":"The server's drives (possibly empty with an error note)."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List physical drives","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/network/history":{"get":{"description":"24 hours of switch-port traffic, averaged into 5-minute buckets.","operationId":"getDedicatedNetworkHistory","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"samples":{"items":{"$ref":"#/components/schemas/NetworkSamplePoint"},"nullable":true,"type":"array"}},"type":"object"}}},"description":"Traffic samples (may be null when unavailable)."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Network traffic history","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/power":{"post":{"description":"Control the server's power through its BMC. Requires the `write` scope.","operationId":"dedicatedPower","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"action":{"enum":["on","boot","off","shutdown","reboot","restart","reset","cycle"],"type":"string"}},"required":["action"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Done."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The BMC power call failed."}},"summary":"Power action","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/reinstall":{"post":{"description":"Reinstalls the server, optionally with a custom disk/RAID layout. Requires the `write` scope.","operationId":"dedicatedReinstall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"os":"ubuntu-24.04","partitions":[{"fs":"ext4","mount":"/","raid":"raid1","sizeMiB":0}],"rootPassword":"N3w-R00t-Pw-7xQ2"},"properties":{"os":{"description":"OS image key.","type":"string"},"partitions":{"description":"Optional custom disk/RAID layout.","items":{"properties":{"fs":{"enum":["ext4","xfs"],"type":"string"},"mount":{"description":"e.g. /, /home, /var.","type":"string"},"raid":{"enum":["","raid0","raid1","raid5","raid6","raid10"],"type":"string"},"sizeMiB":{"description":"0 fills the remaining space (at most one filler).","type":"integer"}},"type":"object"},"type":"array"},"rootPassword":{"description":"Optional; generated or reused when omitted.","type":"string"}},"required":["os"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Reinstall started."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Reinstall the OS","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/reinstall/progress":{"get":{"description":"Live progress of an in-flight OS reinstall. `active` is false when no\nreinstall is running (or once the installer has phoned home at 100%);\n`progress` carries the current stage and percent while it runs.\n","operationId":"getDedicatedReinstallProgress","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"active":{"type":"boolean"},"progress":{"$ref":"#/components/schemas/ReinstallProgress"}},"required":["active"],"type":"object"}}},"description":"The current reinstall progress."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Reinstall progress","tags":["Dedicated Servers"]}},"/portal/dedicated/{id}/uplink":{"get":{"description":"The server's current uplink speed tier, its plan's included speed, the\nphysical port speed, and the sellable tiers. Each Gbps above the current\nspeed is billed at `perGbpsUsd` per month on upgrade.\n","operationId":"getDedicatedUplink","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"perGbpsUsd":{"description":"Monthly price per additional Gbps.","type":"number"},"uplink":{"properties":{"appliedGbps":{"description":"Applied tier in Gbps (0 = plan default / full port).","type":"integer"},"catalogGbps":{"description":"The plan's included uplink speed in Gbps.","type":"integer"},"portGbps":{"description":"Physical port speed in Gbps.","type":"integer"},"tiers":{"items":{"properties":{"name":{"type":"string"},"speedGbps":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"}},"type":"object"}}},"description":"Current uplink and available tiers."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Uplink speed","tags":["Dedicated Servers"]},"post":{"description":"Raise an invoice to upgrade the uplink to a faster tier. The added Gbps\nabove the current speed are billed monthly at `perGbpsUsd` each. The new\nspeed is applied on the switch only once the returned invoice is paid.\n","operationId":"upgradeDedicatedUplink","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"speedGbps":{"description":"Target uplink speed in Gbps (above the current speed).","type":"integer"}},"required":["speedGbps"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"invoice":{"$ref":"#/components/schemas/Invoice"}},"type":"object"}}},"description":"The upgrade invoice to pay."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Upgrade uplink speed","tags":["Dedicated Servers"]}},"/portal/kyc":{"get":{"operationId":"getKycStatus","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Verification status."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get KYC status","tags":["KYC"]},"post":{"description":"Requires the `write` scope.","operationId":"submitKyc","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Submitted."},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Submit documents for review","tags":["KYC"]}},"/portal/kyc/documents":{"get":{"operationId":"listKycDocuments","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Uploaded documents."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List uploaded documents","tags":["KYC"]},"post":{"description":"Multipart upload (field: file). Requires the `write` scope.","operationId":"uploadKycDocument","requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"file":{"format":"binary","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Uploaded."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Upload a document or selfie","tags":["KYC"]}},"/portal/load-balancers":{"get":{"operationId":"listLoadBalancers","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ipMonthlyUsd":{"description":"Monthly recurring fee (USD) for a balancer's dedicated public IPv4 address, billed from creation.","type":"number"},"loadBalancers":{"items":{"$ref":"#/components/schemas/LoadBalancer"},"type":"array"}},"required":["loadBalancers"],"type":"object"}}},"description":"The account's load balancers."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List load balancers","tags":["Load Balancers"]},"post":{"description":"Provisions a new load balancer in front of one of your private networks. The public IPv4 carries a monthly fee (ipMonthlyUsd on the list response). Billing is pay-first: the fee is charged from your account balance if funded (the invoice is marked paid from balance) and the balancer goes live with a public IP; otherwise the balancer is created in `pending` status with NO public IP and an unpaid invoice — the public IP is assigned only once that invoice is paid (a later balance top-up or a direct payment activates it). All backend traffic flows exclusively over the private network. Requires an existing private network and the `write` scope. Add listeners and backends afterwards.","operationId":"createLoadBalancer","requestBody":{"content":{"application/json":{"schema":{"example":{"name":"web-frontend","networkId":"pnet_1f2e3d4c5b6a7f8e9d0c1b2a"},"properties":{"name":{"type":"string"},"networkId":{"description":"The private network the balancer forwards into.","type":"string"}},"required":["name","networkId"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"loadBalancer":{"$ref":"#/components/schemas/LoadBalancer"}},"required":["loadBalancer"],"type":"object"}}},"description":"The new balancer."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Create a load balancer","tags":["Load Balancers"]}},"/portal/load-balancers/{id}":{"delete":{"description":"Tears the balancer down and releases its public IPv4. Backends themselves are untouched. Requires the `write` scope.","operationId":"deleteLoadBalancer","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Delete a load balancer","tags":["Load Balancers"]},"get":{"description":"The balancer plus its listeners and backends with live health.","operationId":"getLoadBalancer","parameters":[{"description":"The load balancer id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"backends":{"items":{"$ref":"#/components/schemas/LoadBalancerBackend"},"type":"array"},"listeners":{"items":{"$ref":"#/components/schemas/LoadBalancerListener"},"type":"array"},"loadBalancer":{"$ref":"#/components/schemas/LoadBalancer"}},"required":["loadBalancer","listeners","backends"],"type":"object"}}},"description":"Balancer details."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get a load balancer","tags":["Load Balancers"]}},"/portal/load-balancers/{id}/backends":{"post":{"description":"Adds one of your cloud servers (by service id) as a backend. The server must already be a member of the balancer's private network — traffic is forwarded exclusively to its private address. Requires the `write` scope.","operationId":"addLoadBalancerBackend","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"serviceId":"svc_1024","weight":100},"properties":{"serviceId":{"type":"string"},"weight":{"description":"Scheduling weight for weighted algorithms (default 100).","type":"integer"}},"required":["serviceId"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"backend":{"$ref":"#/components/schemas/LoadBalancerBackend"}},"required":["backend"],"type":"object"}}},"description":"The new backend."},"400":{"content":{"application/json":{"example":{"message":"the server must join this load balancer's private network first"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The server is not a member of the balancer's network."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Add a backend","tags":["Load Balancers"]}},"/portal/load-balancers/{id}/backends/{backendId}":{"delete":{"description":"Starts connection draining: the backend stops receiving new connections immediately, established connections are allowed to finish, and the backend disappears from the balancer once the drain window (about a minute) passes. Requires the `write` scope.","operationId":"removeLoadBalancerBackend","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"backendId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"draining":{"type":"boolean"},"ok":{"type":"boolean"}},"type":"object"}}},"description":"Draining started."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Remove a backend (connection draining)","tags":["Load Balancers"]},"patch":{"description":"Applied live. Requires the `write` scope.","operationId":"updateLoadBalancerBackend","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"backendId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"weight":50},"properties":{"weight":{"maximum":10000,"minimum":1,"type":"integer"}},"required":["weight"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Updated."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Change a backend's weight","tags":["Load Balancers"]}},"/portal/load-balancers/{id}/listeners":{"post":{"description":"Adds a TCP or UDP forwarding rule. Applied live — existing listeners and connections are not interrupted. Requires the `write` scope.","operationId":"addLoadBalancerListener","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"algorithm":"rr","port":443,"protocol":"tcp","targetPort":8443},"properties":{"algorithm":{"description":"Defaults to rr.","enum":["rr","wrr","lc","wlc","sh"],"type":"string"},"port":{"type":"integer"},"protocol":{"enum":["tcp","udp"],"type":"string"},"targetPort":{"type":"integer"}},"required":["protocol","port","targetPort"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"listener":{"$ref":"#/components/schemas/LoadBalancerListener"}},"required":["listener"],"type":"object"}}},"description":"The new listener."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Add a listener","tags":["Load Balancers"]}},"/portal/load-balancers/{id}/listeners/{listenerId}":{"delete":{"description":"Requires the `write` scope.","operationId":"deleteLoadBalancerListener","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"listenerId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Removed."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Remove a listener","tags":["Load Balancers"]},"patch":{"description":"Changes the balancing algorithm and/or target port in place, with no interruption to traffic. Requires the `write` scope.","operationId":"updateLoadBalancerListener","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"listenerId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"algorithm":"wlc"},"properties":{"algorithm":{"enum":["rr","wrr","lc","wlc","sh"],"type":"string"},"targetPort":{"description":"Omit or 0 to keep the current target port.","type":"integer"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"listener":{"$ref":"#/components/schemas/LoadBalancerListener"}},"required":["listener"],"type":"object"}}},"description":"The updated listener."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Update a listener","tags":["Load Balancers"]}},"/portal/network-protection/{id}/ips":{"get":{"description":"Protected IPs plus a 30-day attack summary for a network-protection or DDoS-L34 service.","operationId":"listProtectedIps","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkProtectionOverview"}}},"description":"Protected IPs and summary."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List protected IPs","tags":["Network \u0026 DDoS"]},"post":{"description":"Protects an IP or CIDR prefix (up to 256 per service). Requires the `write` scope.","operationId":"addProtectedIp","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"ip":{"description":"An IP address or CIDR prefix.","type":"string"},"method":{"default":"physical","enum":["physical","gre","ipsec"],"type":"string"}},"required":["ip"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ip":{"$ref":"#/components/schemas/ProtectedIP"}},"required":["ip"],"type":"object"}}},"description":"The IP was added."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The IP or prefix is already protected."}},"summary":"Add a protected IP","tags":["Network \u0026 DDoS"]}},"/portal/network-protection/{id}/ips/{ipId}":{"delete":{"description":"Requires the `write` scope.","operationId":"removeProtectedIp","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"ipId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Removed."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Remove a protected IP","tags":["Network \u0026 DDoS"]}},"/portal/private-networks":{"get":{"description":"Every private network on the account, with member counts.","operationId":"listPrivateNetworks","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"privateNetworks":{"items":{"$ref":"#/components/schemas/PrivateNetwork"},"type":"array"}},"required":["privateNetworks"],"type":"object"}}},"description":"The account's private networks."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List private networks","tags":["Private Networks"]},"post":{"description":"Creates a new isolated network. You only choose a name — the platform automatically assigns the first free private range (a /24) and the network's overlay id; the range returns to the pool when the network is deleted. Requires at least one active cloud service (Cloud VPS / Cloud Instance) on the account and the `write` scope.","operationId":"createPrivateNetwork","requestBody":{"content":{"application/json":{"schema":{"example":{"name":"production"},"properties":{"name":{"description":"Your label for the network.","type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"privateNetwork":{"$ref":"#/components/schemas/PrivateNetwork"}},"required":["privateNetwork"],"type":"object"}}},"description":"The new network."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Create a private network","tags":["Private Networks"]}},"/portal/private-networks/{id}":{"delete":{"description":"Detaches every member and removes the network; its address range returns to the platform pool. Refused while a load balancer still fronts the network — delete the balancer first. Requires the `write` scope.","operationId":"deletePrivateNetwork","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Deleted."},"400":{"content":{"application/json":{"example":{"message":"this network still has a load balancer — delete it first"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The network is still in use."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Delete a private network","tags":["Private Networks"]},"get":{"description":"The network plus every attached device with its private address and live attach status.","operationId":"getPrivateNetwork","parameters":[{"description":"The network id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"members":{"items":{"$ref":"#/components/schemas/PrivateNetworkMember"},"type":"array"},"privateNetwork":{"$ref":"#/components/schemas/PrivateNetwork"}},"required":["privateNetwork","members"],"type":"object"}}},"description":"Network details."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get a private network","tags":["Private Networks"]}},"/portal/private-networks/{id}/members":{"post":{"description":"Attaches one of your Cloud VPS / Cloud Instances (by service id) to the network. A private address and MAC are assigned automatically and the network interface hot-plugs into the running server — no restart. On most Linux images the address is configured inside the guest automatically; otherwise configure the shown address on the new interface. Requires the `write` scope.","operationId":"attachPrivateNetworkMember","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"serviceId":"svc_1024"},"properties":{"serviceId":{"description":"A cloud service on your account.","type":"string"}},"required":["serviceId"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"member":{"$ref":"#/components/schemas/PrivateNetworkMember"}},"required":["member"],"type":"object"}}},"description":"The new member."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Attach a server to the network","tags":["Private Networks"]}},"/portal/private-networks/{id}/members/{memberId}":{"delete":{"description":"Removes the device's private interface (live) and frees its address. Refused while the device is still a load balancer backend — remove it from the balancer first. Requires the `write` scope.","operationId":"detachPrivateNetworkMember","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"memberId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Detached."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Detach a server from the network","tags":["Private Networks"]}},"/portal/services/{id}/cancellation":{"get":{"description":"Returns whether the service is set to cancel at the end of its current paid period, along with its status and expiry.","operationId":"getServiceCancellation","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cancellation":{"$ref":"#/components/schemas/CancellationState"}},"required":["cancellation"],"type":"object"}}},"description":"The current cancellation state."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Get cancellation status","tags":["Services"]},"post":{"description":"Schedules the service to stop renewing at the end of its current paid\nperiod (`cancel: true`), or clears a pending cancellation so it renews\nnormally (`cancel: false`). The service keeps running until `expiresAt`;\ncancelling also voids any unpaid renewal invoice so nothing is\nauto-charged. Requires the `write` scope.\n","operationId":"setServiceCancellation","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"cancel":{"description":"True to cancel at period end","false to resume renewals.":null,"type":"boolean"}},"required":["cancel"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cancellation":{"$ref":"#/components/schemas/CancellationState"}},"required":["cancellation"],"type":"object"}}},"description":"The resulting cancellation state."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Cancel or resume a service","tags":["Services"]}},"/portal/services/{id}/ddos":{"get":{"description":"The same attack telemetry the panel shows for a service: a 30-day summary,\na daily series, and a paginated list of recorded attack events against the\nservice's own IPs. Works for any service that has IPs (VPS, dedicated,\nnetwork-protection).\n","operationId":"getServiceDdos","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"page","required":false,"schema":{"default":1,"type":"integer"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceDDoSOverview"}}},"description":"DDoS overview."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"DDoS overview and attack history","tags":["Network \u0026 DDoS"]}},"/portal/services/{id}/ddos/attacks/{attackId}":{"get":{"description":"Full detail for one recorded attack against the service, including the raw\ntelemetry captured at detection time (per-protocol breakdown, sampled\nflows) when available. Use the `hasDetails` flag on an event to know\nwhether a deep dive exists.\n","operationId":"getServiceAttackDetail","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"attackId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"attack":{"$ref":"#/components/schemas/ServiceAttackDetail"}},"required":["attack"],"type":"object"}}},"description":"The attack detail."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Attack deep dive","tags":["Network \u0026 DDoS"]}},"/portal/services/{id}/ddos/protection":{"post":{"description":"Turns automatic mitigation on or off for the service — the false-positive\nescape hatch. Disabling whitelists the service's IPs and lifts any active\nmitigation immediately. Requires the `write` scope.\n","operationId":"setServiceDdosProtection","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtectionToggleResult"}}},"description":"The stored preference (authoritative even if the mitigation platform was unreachable)."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Toggle DDoS protection","tags":["Network \u0026 DDoS"]}},"/portal/services/{id}/rdns":{"get":{"description":"The current PTR for each IP the service owns, read from the authoritative reverse zones.","operationId":"getServiceRDNS","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"records":{"items":{"$ref":"#/components/schemas/ServicePTRRecord"},"type":"array"}},"required":["records"],"type":"object"}}},"description":"Reverse DNS records."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Reverse DNS (PTR) records","tags":["Network \u0026 DDoS"]},"put":{"description":"Sets (or clears, when `ptr` is empty) the PTR for one of the service's IPs. The IP must belong to the service. Requires the `write` scope.","operationId":"setServiceRDNS","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"ip":"185.248.171.7","ptr":"mail.example.com"},"properties":{"ip":{"type":"string"},"ptr":{"description":"PTR hostname; empty clears the record.","type":"string"}},"required":["ip"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"record":{"$ref":"#/components/schemas/ServicePTRRecord"}},"required":["record"],"type":"object"}}},"description":"The updated record."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Reverse DNS is not available (no managed reverse zone","or DNS unconfigured).":null}},"summary":"Set an IP's reverse DNS","tags":["Network \u0026 DDoS"]}},"/portal/tickets":{"get":{"operationId":"listTickets","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"The account's tickets."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List support tickets","tags":["Support"]},"post":{"description":"Requires the `write` scope.","operationId":"createTicket","requestBody":{"content":{"application/json":{"schema":{"example":{"message":"I added the domain an hour ago and the certificate is still pending. Anything I need to do?","title":"SSL not provisioning on example.com"},"properties":{"message":{"type":"string"},"title":{"type":"string"}},"required":["title","message"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Ticket created."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Open a support ticket","tags":["Support"]}},"/portal/tickets/{ticketId}/messages":{"get":{"operationId":"listTicketMessages","parameters":[{"in":"path","name":"ticketId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"The thread."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List ticket messages","tags":["Support"]},"post":{"description":"Requires the `write` scope.","operationId":"replyToTicket","parameters":[{"in":"path","name":"ticketId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"message":"Thanks — I've delegated the nameservers, please re-check when you can."},"properties":{"message":{"type":"string"}},"required":["message"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Reply added."},"400":{"$ref":"#/components/responses/BadRequest"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Reply to a ticket","tags":["Support"]}},"/portal/vps/{id}":{"delete":{"description":"Permanently deletes an hourly Cloud Instance: destroys the VM and its disk, releases its IP and stops billing. The current, incomplete hour is settled before teardown, so the instance is charged for what it used up to deletion. Only hourly `cloud-instance` services can be deleted this way — a prepaid (cycle-billed) VPS, a dedicated server or any other service is rejected with 400. Requires the `write` scope.","operationId":"deleteVps","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"The instance was deleted."},"400":{"content":{"application/json":{"example":{"message":"only hourly Cloud Instances can be deleted here"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The service is not an hourly Cloud Instance, so it cannot be deleted here."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"content":{"application/json":{"example":{"message":"this instance is already deleted"},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The instance is already deleted."}},"summary":"Delete an hourly Cloud Instance","tags":["Cloud Instances"]},"get":{"description":"Runtime details for a Cloud or GPU VPS, including the current root password and recent usage samples.","operationId":"getVps","parameters":[{"description":"The service id.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"vps":{"$ref":"#/components/schemas/VPSManagementView"}},"required":["vps"],"type":"object"}}},"description":"VPS details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get a VPS","tags":["Cloud VPS"]}},"/portal/vps/{id}/backups":{"get":{"operationId":"listVpsBackups","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"backups":{"items":{"$ref":"#/components/schemas/Backup"},"nullable":true,"type":"array"}},"type":"object"}}},"description":"Backups for the instance."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List backups","tags":["Cloud VPS"]}},"/portal/vps/{id}/console":{"get":{"description":"Returns a one-time WebSocket URL and VNC password for an in-browser console session.","operationId":"getVpsConsole","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"password":{"type":"string"},"websocketUrl":{"type":"string"}},"type":"object"}}},"description":"Console session details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The VM's VNC endpoint could not be reached."}},"summary":"Open a VNC console","tags":["Cloud VPS"]}},"/portal/vps/{id}/firewall":{"get":{"description":"The per-VPS firewall — the master switch plus its rules. Off by default; while disabled the VPS is unfiltered.","operationId":"getVpsFirewall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"firewall":{"$ref":"#/components/schemas/Firewall"}},"required":["firewall"],"type":"object"}}},"description":"The instance's firewall."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Get the VPS firewall","tags":["Cloud VPS"]},"put":{"description":"Replaces the whole firewall — the master switch and the full rule set (the full desired state). Requires the `write` scope.","operationId":"setVpsFirewall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Firewall"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"firewall":{"$ref":"#/components/schemas/Firewall"}},"required":["firewall"],"type":"object"}}},"description":"The updated firewall."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Replace the VPS firewall","tags":["Cloud VPS"]}},"/portal/vps/{id}/firewall/rules":{"post":{"description":"Appends one allow/deny rule to the VPS firewall. Requires the `write` scope.","operationId":"addVpsFirewallRule","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirewallRule"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"rule":{"$ref":"#/components/schemas/FirewallRule"}},"required":["rule"],"type":"object"}}},"description":"The created rule."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Add a firewall rule","tags":["Cloud VPS"]}},"/portal/vps/{id}/firewall/rules/{ruleId}":{"delete":{"description":"Removes one rule from the VPS firewall. Requires the `write` scope.","operationId":"deleteVpsFirewallRule","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"ruleId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Rule deleted."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Delete a firewall rule","tags":["Cloud VPS"]}},"/portal/vps/{id}/hostname":{"put":{"description":"Requires the `write` scope.","operationId":"vpsSetHostname","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"hostname":{"type":"string"}},"required":["hostname"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Hostname changed."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Change the hostname","tags":["Cloud VPS"]}},"/portal/vps/{id}/plan":{"get":{"description":"Lists the plans this VPS can move to **within its own product line** (a\nStandard VPS never sees the 100 Gbps or GPU lines). Each option carries\nthe effective monthly price — the tier price plus, for a downgrade, a\nper-GB surcharge for the disk kept above the target tier (disk never\nshrinks) — and the prorated amount due now for the rest of the period.\n","operationId":"getVpsPlanOptions","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VPSPlanChangeOverview"}}},"description":"The current plan and the same-line options."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"List plan upgrade/downgrade options","tags":["Cloud VPS"]},"post":{"description":"Moves the VPS to another plan in its line. The prorated difference is\nsettled first — charged (from store credit, else an invoice to pay) on an\nupgrade, credited to balance on a downgrade. When it's applied outright\n`applied` is true and the new vCPU/RAM take effect on the VPS's next\nreboot; otherwise `invoice.id` is an invoice to pay before the change\nlands. Requires the `write` scope.\n","operationId":"changeVpsPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"planKey":"cloud-vps-8"},"properties":{"planKey":{"description":"A plan key in the same line as the current plan.","type":"string"}},"required":["planKey"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"applied":{"type":"boolean"},"invoice":{"properties":{"id":{"type":"string"}},"type":"object"}},"required":["applied"],"type":"object"}}},"description":"Applied, or an invoice to pay first."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Change plan (upgrade/downgrade)","tags":["Cloud VPS"]}},"/portal/vps/{id}/power":{"post":{"description":"Boot, shut down or reboot the instance. Requires the `write` scope.","operationId":"vpsPower","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"action":{"enum":["boot","shutdown","reboot"],"type":"string"}},"required":["action"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Done."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Power action","tags":["Cloud VPS"]}},"/portal/vps/{id}/reinstall":{"post":{"description":"Reinstalls the instance from a template. A fresh root password is generated and readable afterward via `GET /portal/vps/{id}`. Requires the `write` scope.","operationId":"vpsReinstall","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"sshKey":"ssh-ed25519 AAAA... you@example.com","template":"ubuntu-24.04"},"properties":{"sshKey":{"description":"Optional public key; reuses the order key when blank.","type":"string"},"template":{"description":"OS image key (must be a supported template).","type":"string"}},"required":["template"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Reinstall started."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Reinstall the OS","tags":["Cloud VPS"]}},"/portal/vps/{id}/rescue":{"delete":{"description":"Returns the instance to normal disk boot. Requires the `write` scope.","operationId":"vpsExitRescue","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Rescue exited."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Exit rescue mode","tags":["Cloud VPS"]},"post":{"description":"Boots the instance from the rescue live environment. Requires the `write` scope.","operationId":"vpsEnterRescue","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Rescue entered."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Enter rescue mode","tags":["Cloud VPS"]}},"/portal/vps/{id}/root-password":{"post":{"description":"Sets a new root password (or generates one when omitted). The effective password is readable via `GET /portal/vps/{id}`. Requires the `write` scope.","operationId":"vpsResetPassword","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"password":"N3w-R00t-Pw-7xQ2"},"properties":{"password":{"description":"New password; generated when empty.","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"type":"object"}}},"description":"Password reset."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Reset the root password","tags":["Cloud VPS"]}},"/portal/vps/{id}/snapshots":{"get":{"operationId":"listVpsSnapshots","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"snapshots":{"items":{"$ref":"#/components/schemas/Snapshot"},"type":"array"}},"required":["snapshots"],"type":"object"}}},"description":"Snapshots for the instance."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List snapshots","tags":["Cloud VPS"]}},"/portal/vps/{serviceId}/resize":{"post":{"description":"Moves the instance's vCPU and RAM up or down inside its line (disk stays). The new sizing applies on the next reboot; hourly metering picks it up on its own, monthly instances renew at the new price.","operationId":"resizeCloudInstance","parameters":[{"in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"example":{"ramGb":16,"vcpu":8},"properties":{"ramGb":{"minimum":1,"type":"integer"},"vcpu":{"maximum":32,"minimum":1,"type":"integer"}},"required":["vcpu","ramGb"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"resize":{"$ref":"#/components/schemas/CloudInstanceResize"}},"required":["resize"],"type":"object"}}},"description":"The accepted sizing and its price."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Resize a Cloud Instance","tags":["Cloud Instances"]}},"/services":{"get":{"description":"All provisioned services on the account. Optionally filter by type.","operationId":"listServices","parameters":[{"description":"Return only services of this type.","in":"query","name":"serviceType","required":false,"schema":{"enum":["cloud-vps","gpu-vps","dedicated-server","layer7-protection","ddos-l34","network-protection","ip-transit"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"services":{"items":{"$ref":"#/components/schemas/ServiceView"},"type":"array"}},"required":["services"],"type":"object"}}},"description":"The account's services."},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"List services","tags":["Services"]}}},"security":[{"bearerToken":[]}],"servers":[{"description":"Production","url":"https://api.sprintcdn.com/api/v1"}],"tags":[{"description":"Identity of the authenticated account.","name":"Account"},{"description":"All provisioned services on the account.","name":"Services"},{"description":"Manage Cloud and GPU VPS instances on the KVM cluster.","name":"Cloud VPS"},{"description":"Hourly, resizable KVM compute metered from your account balance — the catalog, resizing, deletion and the per-hour usage log. vCPU and RAM are billed only while the instance runs; disk and IPv4 meter around the clock.","name":"Cloud Instances"},{"description":"Manage bare-metal dedicated servers.","name":"Dedicated Servers"},{"description":"Protected IPs and DDoS attack telemetry.","name":"Network \u0026 DDoS"},{"description":"Isolated per-account L2 networks connecting Cloud VPS and Cloud Instances. Addressing is allocated automatically from the platform pool; devices attach live, with no restart.","name":"Private Networks"},{"description":"Kernel-level (IPVS) load balancers with their own public IPv4, balancing TCP/UDP traffic onto private-network members with health checks and connection draining.","name":"Load Balancers"},{"description":"Domains, DNS, SSL/TLS, cache, firewall, page rules and analytics.","name":"Layer 7 CDN \u0026 WAF"},{"description":"Invoices, payments and saved payment methods.","name":"Billing"},{"description":"Place orders and validate coupons.","name":"Ordering"},{"description":"Public product catalog, plans and configuration options.","name":"Catalog"},{"description":"Support tickets.","name":"Support"},{"description":"Affiliate program dashboard, conversions and payouts.","name":"Affiliate"},{"description":"Identity verification.","name":"KYC"},{"description":"Public help-center content — categories and localised articles. No token required.","name":"Knowledgebase"}]}