{"openapi":"3.0.3","info":{"title":"Faastic API","version":"1","description":"Manage your servers, load balancers, shared hosting, DNS, domains, firewalls, networks and billing from scripts, Terraform, the CLI and AI assistants (MCP: https://<api host>/mcp with the same token). Authenticate with an organization API token: `Authorization: Bearer fst_…` (create one under Team → API tokens). A `read` token can only GET; `read_write` can do everything its creator can in that organization, except manage members and tokens. A token can also be narrowed to feature areas (servers, hosting, domains, dns, billing …) and to chosen projects or services; anything outside answers 403. Limit: 300 requests per minute per token."},"servers":[{"url":"https://api.faastic.com"}],"tags":[{"name":"organizations","description":"Organizations (billing parties)"},{"name":"projects","description":"Projects within an organization"},{"name":"services","description":"Your services: servers (power, console, snapshots, backups, firewall, volumes, ISO/rescue), hosting and add-ons"},{"name":"domains","description":"Domains: register, transfer, renew, nameservers, transfer lock and auth codes"},{"name":"dns","description":"DNS zones and records on our nameservers, including DNSSEC"},{"name":"firewalls","description":"Firewall templates: one rule set applied to many servers"},{"name":"networks","description":"Private networks between your servers"},{"name":"cart","description":"Ordering: check out several products in one payment"},{"name":"hosting","description":"Web hosting orders"},{"name":"activity","description":"Who did what, when - the organization's activity log"},{"name":"catalog","description":"Public storefront catalog"},{"name":"billing","description":"Customer billing: invoices (view/pay) + subscriptions (view/cancel)"},{"name":"support","description":"Customer support tickets"}],"paths":{"/v1/orgs/{orgId}/activity":{"get":{"summary":"Activity log of this organization (owner/admin)","tags":["activity"],"parameters":[{"schema":{"type":"string","format":"date-time"},"in":"query","name":"before","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"action":{"type":"string"},"at":{"type":"string","format":"date-time"},"actor":{"type":"object","additionalProperties":true,"properties":{"userId":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"staff":{"type":"boolean"}}},"target":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","nullable":true},"id":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}}},"details":{"type":"object","additionalProperties":true},"ip":{"type":"string","nullable":true},"userAgent":{"type":"string","nullable":true}}}}}}}}}},"/v1/orgs/{orgId}/firewalls":{"get":{"summary":"Firewall templates of this organization, with the servers they're applied to","tags":["firewalls"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a firewall template","tags":["firewalls"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":60},"rules":{"type":"array","maxItems":50,"items":{"type":"object","required":["action"],"additionalProperties":false,"properties":{"action":{"type":"string","enum":["ACCEPT","DROP","REJECT"]},"proto":{"type":"string","enum":["tcp","udp","icmp"]},"dport":{"type":"string","maxLength":11},"source":{"type":"string","maxLength":43},"comment":{"type":"string","maxLength":51}}}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/firewalls/{fid}":{"put":{"summary":"Edit a template - rule changes reach every server it's applied to","tags":["firewalls"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":60},"rules":{"type":"array","maxItems":50,"items":{"type":"object","required":["action"],"additionalProperties":false,"properties":{"action":{"type":"string","enum":["ACCEPT","DROP","REJECT"]},"proto":{"type":"string","enum":["tcp","udp","icmp"]},"dport":{"type":"string","maxLength":11},"source":{"type":"string","maxLength":43},"comment":{"type":"string","maxLength":51}}}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"fid","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a template (its rules are removed from every server first)","tags":["firewalls"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"fid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/firewalls/{fid}/apply":{"post":{"summary":"Apply a template to servers","tags":["firewalls"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serviceIds"],"properties":{"serviceIds":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"fid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/firewalls/{fid}/remove":{"post":{"summary":"Take a template off servers (its rules are removed from them)","tags":["firewalls"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serviceIds"],"properties":{"serviceIds":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"fid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/networks":{"get":{"summary":"Private networks of this organization and their servers","tags":["networks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a private network (RFC 1918 range, /16-/28)","tags":["networks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","cidr"],"properties":{"name":{"type":"string","maxLength":60},"cidr":{"type":"string","maxLength":18}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/networks/{nid}":{"delete":{"summary":"Delete a private network (detach its servers first)","tags":["networks"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"nid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/networks/{nid}/attach":{"post":{"summary":"Attach a server: adds a NIC on the network and assigns the next free address (cloud-init, next boot)","tags":["networks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serviceId"],"properties":{"serviceId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"nid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/networks/{nid}/detach":{"post":{"summary":"Detach a server (removes its NIC on the network)","tags":["networks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["serviceId"],"properties":{"serviceId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"nid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}":{"get":{"summary":"Get an organization","tags":["organizations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"countryCode":{"type":"string"},"vatNumber":{"type":"string","nullable":true},"billingEmail":{"type":"string","nullable":true},"address":{"type":"object","additionalProperties":true,"nullable":true},"role":{"type":"string"}}}}}}}},"patch":{"summary":"Update organization billing details","tags":["organizations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"vatNumber":{"type":"string","nullable":true},"countryCode":{"type":"string","minLength":2,"maxLength":2},"billingEmail":{"type":"string","nullable":true},"address":{}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"countryCode":{"type":"string"},"vatNumber":{"type":"string","nullable":true},"billingEmail":{"type":"string","nullable":true},"address":{"type":"object","additionalProperties":true,"nullable":true}}}}}}}}},"/v1/orgs/{orgId}/billing/request-invoice-first":{"post":{"summary":"Request fiscal invoices BEFORE payment (instead of payment requests) - reviewed by an operator","tags":["organizations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","nullable":true,"properties":{"note":{"type":"string","maxLength":500}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"requested":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/projects":{"get":{"summary":"List projects in an organization","tags":["projects"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"}}}}}}}}},"post":{"summary":"Create a project (admin role or higher)","tags":["projects"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/projects/{projectId}":{"get":{"summary":"Get a project","tags":["projects"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"}}}}}}}},"patch":{"summary":"Rename a project (admin role or higher)","tags":["projects"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"isDefault":{"type":"boolean"}}}}}}}},"delete":{"summary":"Delete a project (admin role or higher)","tags":["projects"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services":{"get":{"summary":"List all services in an organization","tags":["services"],"parameters":[{"schema":{"type":"string","enum":["0","1"]},"in":"query","name":"includeTerminated","required":false,"description":"\"1\" also lists terminated services"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"productId":{"type":"string"},"providerRef":{"type":"string","nullable":true},"label":{"type":"string"},"endingAt":{"type":"string","format":"date-time","nullable":true},"project":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}}},"nextDueDate":{"type":"string","format":"date-time","nullable":true},"paidThrough":{"type":"string","format":"date-time","nullable":true},"renewalOpen":{"type":"boolean"},"protection":{"type":"object","additionalProperties":false,"properties":{"delete":{"type":"boolean"},"rebuild":{"type":"boolean"}}},"labels":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}},"/v1/orgs/{orgId}/projects/{projectId}/services":{"get":{"summary":"List services in a project","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"projectId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"productId":{"type":"string"},"providerRef":{"type":"string","nullable":true},"label":{"type":"string"},"endingAt":{"type":"string","format":"date-time","nullable":true},"project":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}}},"nextDueDate":{"type":"string","format":"date-time","nullable":true},"paidThrough":{"type":"string","format":"date-time","nullable":true},"renewalOpen":{"type":"boolean"},"protection":{"type":"object","additionalProperties":false,"properties":{"delete":{"type":"boolean"},"rebuild":{"type":"boolean"}}},"labels":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}":{"get":{"summary":"Get a service","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"productId":{"type":"string"},"providerRef":{"type":"string","nullable":true},"label":{"type":"string"},"endingAt":{"type":"string","format":"date-time","nullable":true},"project":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"}}},"nextDueDate":{"type":"string","format":"date-time","nullable":true},"paidThrough":{"type":"string","format":"date-time","nullable":true},"renewalOpen":{"type":"boolean"},"protection":{"type":"object","additionalProperties":false,"properties":{"delete":{"type":"boolean"},"rebuild":{"type":"boolean"}}},"labels":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}/protection":{"patch":{"summary":"Delete protection (blocks cancelling) / rebuild protection (blocks reinstall, rollback, restore)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"delete":{"type":"boolean"},"rebuild":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"delete":{"type":"boolean"},"rebuild":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}/labels":{"put":{"summary":"Replace a service's labels (key → value, max 20)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["labels"],"properties":{"labels":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/v1/orgs/{orgId}/services/{id}/power":{"post":{"summary":"Power-control your VM (start / stop / reboot) - async","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["start","stop","reboot","power_cycle"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"jobId":{"type":"string"},"action":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/ipv6":{"get":{"summary":"This server's IPv6 subnet + address (if enabled)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Enable IPv6 (assigns a subnet) or change the server's IPv6 address - applied on the next restart","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"address":{"type":"string","maxLength":64}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Disable IPv6 and return the subnet - its traffic stops now; the server's network config is cleaned up on the next restart","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/console":{"post":{"summary":"Open a console session for your VM (returns a websocket URL to our broker)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["vnc","term"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string"},"wsUrl":{"type":"string"},"password":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/credentials":{"get":{"summary":"Reveal the VM's initial login (decrypted from the provisioning record)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"username":{"type":"string"},"password":{"type":"string","nullable":true},"note":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/features":{"get":{"summary":"Plan entitlements (snapshots/firewall/resize) + usage - drives which controls to show","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/vm-status":{"get":{"summary":"Live VM status (running/stopped, cpu%, mem, uptime)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/metrics":{"get":{"summary":"Resource graphs (CPU/RAM/disk/net) for a timeframe","tags":["services"],"parameters":[{"schema":{"type":"string","enum":["hour","day","week","month","year"]},"in":"query","name":"timeframe","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/snapshots":{"get":{"summary":"List VM snapshots","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a snapshot (within your plan's quota)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/snapshots/{name}/rollback":{"post":{"summary":"Roll the VM back to a snapshot","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/snapshots/{name}":{"delete":{"summary":"Delete a snapshot","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/firewall":{"get":{"summary":"Firewall rules + options for your VM","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/firewall/rules":{"post":{"summary":"Add an inbound firewall rule (e.g. open 80/443)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["ACCEPT","DROP","REJECT"]},"proto":{"type":"string","enum":["tcp","udp","icmp"]},"dport":{"type":"string","maxLength":11},"source":{"type":"string","maxLength":43},"comment":{"type":"string","maxLength":64}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/firewall/rules/{pos}":{"delete":{"summary":"Delete a firewall rule by position","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"pos","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/resize":{"post":{"summary":"Resize the VM within your plan's limits (CPU/RAM/grow disk)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vcpu":{"type":"integer","minimum":1},"ramMb":{"type":"integer","minimum":256},"diskGb":{"type":"integer","minimum":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"vcpu":{"type":"integer"},"ramMb":{"type":"integer"},"diskGb":{"type":"integer"},"rebootRequired":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/network":{"get":{"summary":"The VM's assigned IP / gateway / PTR (null if DHCP)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/backups":{"get":{"summary":"List VM backups","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a backup (within your plan's quota)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/backups/restore":{"post":{"summary":"Restore the VM from a backup (DESTRUCTIVE - overwrites the disk)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["volid"],"properties":{"volid":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/backups/delete":{"post":{"summary":"Delete a backup","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["volid"],"properties":{"volid":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/reinstall":{"post":{"summary":"Reinstall the OS - DESTROYS all data, keeps the IP + SSH key (async)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"jobId":{"type":"string"},"action":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/rdns":{"post":{"summary":"Request reverse DNS (PTR) for the VM's IP - opens a support ticket","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ptr"],"properties":{"ptr":{"type":"string","minLength":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ticketId":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/reset-password":{"get":{"summary":"How a password reset works on this server: cloud-init (restarts it; its SSH host key changes) or the guest agent (in place)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"method":{"type":"string","enum":["cloud-init","agent"]}}}}}}}},"post":{"summary":"Set a new password for the server's login user. Returned once. With cloud-init the server restarts and its SSH host key changes.","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"username":{"type":"string"},"password":{"type":"string"},"method":{"type":"string","enum":["cloud-init","agent"]},"restarted":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{id}/isos":{"get":{"summary":"ISO library for this server + what's mounted + whether rescue mode is available","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/iso":{"post":{"summary":"Mount an ISO from the library (boot: boot from it on the next restart)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["volid"],"properties":{"volid":{"type":"string","minLength":1,"maxLength":255},"boot":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Unmount the ISO (and restore the boot order)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/rescue":{"post":{"summary":"Boot into rescue mode (enabled: true) or back into the server's own system (false). Restarts the server.","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb":{"get":{"summary":"Load balancer: settings, services, targets (with health), limits, sync state","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Change the balancing algorithm","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["algorithm"],"properties":{"algorithm":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/services":{"post":{"summary":"Add a service (listener: protocol + ports + health check)","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"protocol":{"type":"string","description":"\"http\", \"https\" or \"tcp\"","enum":["http","https","tcp"]},"listenPort":{"type":"integer","description":"Port on the load balancer's public IP","minimum":1,"maximum":65535},"destinationPort":{"type":"integer","description":"Port on the targets","minimum":1,"maximum":65535},"httpRedirect":{"type":"boolean","description":"https only: also listen on :80 and redirect to https"},"stickySessions":{"type":"boolean","description":"Keep a visitor on the same target (cookie)"},"proxyProtocol":{"type":"boolean","description":"Send the PROXY protocol header to targets"},"healthCheck":{"type":"object","description":"How targets are checked","properties":{"protocol":{"type":"string","description":"\"http\" or \"tcp\"","enum":["http","tcp"]},"path":{"type":"string","description":"HTTP path, e.g. \"/healthz\""},"intervalS":{"type":"integer","description":"Seconds between checks (2-60)"},"timeoutS":{"type":"integer","description":"Seconds before a check fails (1-30)"},"retries":{"type":"integer","description":"Failed checks before a target is marked down (1-10)"},"expectStatus":{"type":"string","description":"HTTP status that counts as healthy, e.g. \"200\" or \"2xx-3xx\""}}},"certificateIds":{"type":"array","items":{"type":"string"},"description":"https only: certificate ids (from …/lb-certificates)"}},"required":["protocol","listenPort","destinationPort"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/services/{sid}":{"patch":{"summary":"Change a service","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"protocol":{"type":"string","description":"\"http\", \"https\" or \"tcp\"","enum":["http","https","tcp"]},"listenPort":{"type":"integer","description":"Port on the load balancer's public IP","minimum":1,"maximum":65535},"destinationPort":{"type":"integer","description":"Port on the targets","minimum":1,"maximum":65535},"httpRedirect":{"type":"boolean","description":"https only: also listen on :80 and redirect to https"},"stickySessions":{"type":"boolean","description":"Keep a visitor on the same target (cookie)"},"proxyProtocol":{"type":"boolean","description":"Send the PROXY protocol header to targets"},"healthCheck":{"type":"object","description":"How targets are checked","properties":{"protocol":{"type":"string","description":"\"http\" or \"tcp\"","enum":["http","tcp"]},"path":{"type":"string","description":"HTTP path, e.g. \"/healthz\""},"intervalS":{"type":"integer","description":"Seconds between checks (2-60)"},"timeoutS":{"type":"integer","description":"Seconds before a check fails (1-30)"},"retries":{"type":"integer","description":"Failed checks before a target is marked down (1-10)"},"expectStatus":{"type":"string","description":"HTTP status that counts as healthy, e.g. \"200\" or \"2xx-3xx\""}}},"certificateIds":{"type":"array","items":{"type":"string"},"description":"https only: certificate ids (from …/lb-certificates)"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"sid","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove a service","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"sid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/targets":{"post":{"summary":"Add a target: one of your servers, or an IP address","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","description":"\"server\" (one of your servers) or \"ip\"","enum":["server","ip"]},"serviceId":{"type":"string","description":"kind=server: the server's service id"},"address":{"type":"string","description":"kind=ip: IPv4/IPv6 address"},"weight":{"type":"integer","description":"Share of traffic (1-256, default 1)"},"enabled":{"type":"boolean","description":"Receive traffic (default true)"}},"required":["kind"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/targets/{tid}":{"patch":{"summary":"Change a target's weight or switch it on/off","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"weight":{"type":"integer","description":"Share of traffic (1-256)"},"enabled":{"type":"boolean","description":"Receive traffic"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"tid","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove a target","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"tid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/apply":{"post":{"summary":"Push the configuration to the load balancer now (waits for the result)","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/restart":{"post":{"summary":"Restart the load balancer appliance","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/metrics":{"get":{"summary":"Requests per second, status codes, connections and traffic","tags":["load-balancers"],"parameters":[{"schema":{"type":"string","enum":["1h","24h","7d","30d"]},"in":"query","name":"range","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/logs":{"get":{"summary":"Recent request log lines (newest last)","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"since","required":false},{"schema":{"type":"string"},"in":"query","name":"until","required":false},{"schema":{"type":"integer","minimum":1,"maximum":50000},"in":"query","name":"limit","required":false},{"schema":{"type":"string","maxLength":200},"in":"query","name":"search","required":false},{"schema":{"type":"boolean"},"in":"query","name":"system","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/logs/export":{"get":{"summary":"Download request logs as a text file (up to 50,000 lines)","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"since","required":false},{"schema":{"type":"string"},"in":"query","name":"until","required":false},{"schema":{"type":"integer","minimum":1,"maximum":50000},"in":"query","name":"limit","required":false},{"schema":{"type":"string","maxLength":200},"in":"query","name":"search","required":false},{"schema":{"type":"boolean"},"in":"query","name":"system","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/lb/target-candidates":{"get":{"summary":"Your servers that can be added as targets","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/load-balancers":{"get":{"summary":"Your load balancers: address, sync state, target health, last-hour traffic","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/lb-certificates":{"get":{"summary":"TLS certificates for load balancers","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Upload a certificate ({type:'uploaded', name, certificate, privateKey}) or request a free one ({type:'managed', name, domains[]})","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"\"uploaded\" (your own) or \"managed\" (free Let's Encrypt)","enum":["uploaded","managed"]},"name":{"type":"string","description":"Label"},"certificate":{"type":"string","description":"uploaded: PEM certificate (+ chain)"},"privateKey":{"type":"string","description":"uploaded: PEM private key"},"domains":{"type":"array","items":{"type":"string"},"description":"managed: domains to cover (they must point at the load balancer)"}},"required":["type","name"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/lb-certificates/{cid}":{"patch":{"summary":"Rename a certificate","tags":["load-balancers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"cid","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a certificate (refused while a load balancer uses it)","tags":["load-balancers"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"cid","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/databases":{"get":{"summary":"Managed databases and S3 instances: engine, version, state, plan, endpoints and health","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data":{"get":{"summary":"Instance: engine, version, state, plan, endpoints, users, access, maintenance, backups, parameters, recent tasks","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/connection":{"get":{"summary":"Ready-made connection strings for the private and public endpoints (PASSWORD is a placeholder), and the CA bundle","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/ca.pem":{"get":{"summary":"The CA bundle to verify the instance's TLS certificate (save as faastic-ca.pem)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/apply":{"post":{"summary":"Push the configuration to the instance again now (after a failed push)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/storage":{"get":{"summary":"Storage: the plan's disk, extra storage added, the unit it's sold in and its price, and how much more can be added","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add storage: the disk grows online (nothing restarts) and the charge starts with the next renewal. Storage can't be given back.","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"units":{"type":"integer","description":"How many units of extra storage to add (see the unit size in GET …/data/storage). Billed monthly; a disk can't shrink, so storage can't be given back"}},"required":["units"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/instance-credentials":{"get":{"summary":"The admin user and its password (S3: the admin access key and secret)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/instance-credentials/rotate":{"post":{"summary":"New admin password (S3: new admin key) - the old one stops working","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/users":{"post":{"summary":"Create a user from a role template (S3: an access key with bucket grants). The password/secret is returned once.","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"PostgreSQL/MySQL/Valkey: a user name (lowercase letters, digits, _). S3: the key's name"},"role":{"type":"string","description":"A role template from the instance's `roles` (e.g. readwrite, readonly; S3: readwrite, readonly, owner)"},"scope":{"type":"object","description":"S3: { buckets: { \"<bucket>\": [\"read\",\"write\",\"owner\"] }, allowCreateBucket: true }. Valkey: { keyPrefix: \"app1:\" }"}},"required":["name","role"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/users/{name}/rotate":{"post":{"summary":"New password for a user (S3: a new key with the same grants; the old key is deleted). Returned once.","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/users/{name}":{"delete":{"summary":"Delete a user (PostgreSQL: its objects move to the admin) or an S3 key","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/databases":{"get":{"summary":"Databases with their size (S3: buckets with size and object count)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a database (S3: a bucket, optionally with quotas)","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Database name (lowercase letters, digits, _) - S3: bucket name (3-63 of a-z 0-9 . -)"},"maxSizeGb":{"type":"number","description":"S3 only: bucket quota in GB"},"maxObjects":{"type":"integer","description":"S3 only: bucket quota in objects"}},"required":["name"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/databases/{name}":{"delete":{"summary":"Delete a database and its data (S3: an empty bucket)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/public-access":{"put":{"summary":"Public access: off by default; when on, only the allowlist may connect (TLS only)","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Expose the service port on the instance's public address (off by default)"},"allowlist":{"type":"array","items":{"type":"string"},"description":"Source addresses or ranges (IPv4/IPv6 CIDR) allowed to connect - required unless allowAnySource"},"allowAnySource":{"type":"boolean","description":"Open to any source address (must be explicit; S3 allows an empty allowlist)"}},"required":["enabled"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/maintenance":{"put":{"summary":"Move the weekly 60-minute maintenance window","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dayOfWeek":{"type":"integer","description":"0 = Sunday … 6 = Saturday"},"hour":{"type":"integer","description":"Start hour 0-23, Brussels time (60-minute window)"}},"required":["dayOfWeek","hour"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/backup-settings":{"put":{"summary":"Daily backup hour and how many daily backups to keep","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hour":{"type":"integer","description":"Daily backup hour 0-23, Brussels time"},"keepDaily":{"type":"integer","description":"Daily backups kept, 1-35"}},"required":["hour","keepDaily"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/parameters":{"patch":{"summary":"Change allow-listed engine parameters (some restart the engine - see paramSpecs)","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Allow-listed engine parameters by name (each instance lists its own in paramSpecs; the ones below are PostgreSQL's); null resets one to the plan default","properties":{"work_mem":{"description":"PostgreSQL: MB per sort or hash"},"maintenance_work_mem":{"description":"PostgreSQL: MB for VACUUM and CREATE INDEX"},"statement_timeout":{"description":"PostgreSQL: ms (0 = never)"},"lock_timeout":{"description":"PostgreSQL: ms (0 = never)"},"idle_in_transaction_session_timeout":{"description":"PostgreSQL: ms (0 = never)"},"log_min_duration_statement":{"description":"PostgreSQL: ms (-1 = off)"},"random_page_cost":{"description":"PostgreSQL: planner cost of a random page read"},"default_statistics_target":{"description":"PostgreSQL: 10-10000"},"max_connections":{"description":"PostgreSQL: 20-1000 (restarts the engine)"},"jit":{"description":"PostgreSQL: just-in-time compilation"},"wal_level":{"description":"PostgreSQL: replica or logical (restarts the engine)"},"autovacuum_vacuum_scale_factor":{"description":"PostgreSQL: see paramSpecs for the allowed values"},"autovacuum_analyze_scale_factor":{"description":"PostgreSQL: see paramSpecs for the allowed values"},"timezone":{"description":"PostgreSQL: e.g. Europe/Brussels"}}}}},"description":"Allow-listed engine parameters by name (each instance lists its own in paramSpecs; the ones below are PostgreSQL's); null resets one to the plan default"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/backups":{"get":{"summary":"Backups: kind, size, when, and until when they are kept","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Back up now (runs in the background; follow the returned task)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/backups/{backupId}/restore":{"post":{"summary":"Restore a backup in place - replaces all current data after a safety backup","tags":["databases"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"string","description":"Must be \"restore-in-place\": replaces all current data (a safety backup is taken first)"}},"required":["confirm"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"backupId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/tasks":{"get":{"summary":"The instance's task history: every change, who made it, its outcome","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/tasks/{taskId}":{"get":{"summary":"One task with its log","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"taskId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/stats":{"get":{"summary":"Live engine figures: connections, size, cache hit ratio, uptime (S3: buckets, bytes, objects, free space)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/metrics":{"get":{"summary":"CPU, memory, disk and network of the instance VM over a timeframe (hour, day, week, month, year)","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/data/logs":{"get":{"summary":"The engine's recent log lines","tags":["databases"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/topology":{"get":{"summary":"Your infrastructure as a graph: services, load-balancer targets and health, private networks, current traffic","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting":{"get":{"summary":"Live usage + quotas for a shared-hosting account","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/dns-check":{"get":{"summary":"Live DNS status for this hosting domain (delegation + A records)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/dns-setup":{"post":{"summary":"Use our DNS for this hosting domain (creates the zone, pre-populated)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/overview":{"get":{"summary":"Account usage vs plan limits, links","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/stats/history":{"get":{"summary":"Monthly disk + bandwidth history","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/stats/sites":{"get":{"summary":"Disk + bandwidth per website","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/stats/traffic/{domain}":{"get":{"summary":"Traffic report from the recent access log","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/activity":{"get":{"summary":"Hosting activity log","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/notices":{"get":{"summary":"Messages from the hosting server (backup created/restored, …)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/notices/{notice}/read":{"post":{"summary":"Mark a server message as read","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"notice","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/notices/{notice}":{"delete":{"summary":"Dismiss a server message","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"notice","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/logins":{"get":{"summary":"Panel/API sign-in history","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/ssh-keys":{"get":{"summary":"SSH/SFTP keys","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add an SSH key","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"OpenSSH public key, e.g. \"ssh-ed25519 AAAA… me@laptop\""}},"required":["key"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/ssh-keys/{keyId}":{"delete":{"summary":"Remove an SSH key","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"keyId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/contact":{"put":{"summary":"Where the server's own messages (cron output, notices) are e-mailed","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"E-mail address for the server's messages (cron output, notices)"}},"required":["email"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/password":{"post":{"summary":"Change the hosting account password","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","description":"New hosting account password (min. 10 characters, letters and digits)"}},"required":["password"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/panel-login":{"post":{"summary":"Allow or block direct sign-in to the hosting panel","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Allow signing in to the classic hosting panel directly"}},"required":["enabled"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web":{"get":{"summary":"Websites","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add a website","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Domain or subdomain to serve, e.g. \"example.com\" or \"blog.example.com\""},"aliases":{"type":"array","items":{"type":"string"},"description":"Extra host names served by the same site (www.<domain> is added automatically)"},"php":{"type":"string","description":"PHP version, e.g. \"8.3\" (see GET …/hosting/php-versions); default = the server's default"}},"required":["domain"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web-php":{"get":{"summary":"PHP versions available on this server","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web-templates":{"get":{"summary":"Server templates customers may pick (web, proxy), if the server's policy allows it","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}":{"get":{"summary":"One website","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a website (files, logs, SSL)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Change website settings","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"php":{"type":"string","description":"PHP version, e.g. \"8.3\""},"webTemplate":{"type":"string","description":"Web server template (see GET …/hosting/web-templates; only when the server lets customers pick)"},"proxyTemplate":{"type":"string","description":"Proxy (nginx) template, e.g. \"default\", \"caching\", \"hosting\" (see GET …/hosting/web-templates)"},"redirect":{"type":"object","nullable":true,"description":"Redirect every request (null removes it)","properties":{"url":{"type":"string","description":"Target URL"},"code":{"type":"integer","description":"HTTP status","enum":[301,302]}}},"docroot":{"type":"object","nullable":true,"description":"Serve another site's folder (null restores the default)","properties":{"targetDomain":{"type":"string","description":"Website whose files to serve"},"directory":{"type":"string","description":"Sub-folder of that site's public_html"}}},"directoryListing":{"type":"boolean","description":"Show folder contents when there's no index file"},"cache":{"type":"object","description":"Page cache","properties":{"enabled":{"type":"boolean","description":"Cache on/off"},"duration":{"type":"string","description":"Cache lifetime, e.g. \"2m\", \"1h\"","nullable":true}}},"stats":{"type":"object","description":"Visitor statistics (AWStats)","properties":{"enabled":{"type":"boolean","description":"Statistics on/off"}}},"forceSsl":{"type":"boolean","description":"Redirect http:// to https://"},"hsts":{"type":"boolean","description":"Send Strict-Transport-Security (browsers remember to use https)"},"suspended":{"type":"boolean","description":"Take the site offline (true) or back online (false)"}},"description":"Send only the settings to change"}}},"description":"Send only the settings to change"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/aliases":{"post":{"summary":"Add an alias","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"alias":{"type":"string","description":"Extra host name for this site"}},"required":["alias"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/aliases/{alias}":{"delete":{"summary":"Remove an alias","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"alias","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl":{"get":{"summary":"Certificate details","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove SSL","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl/letsencrypt":{"post":{"summary":"Issue a Let's Encrypt certificate","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl/certificate":{"post":{"summary":"Install your own certificate (PEM) - replaces Let's Encrypt for this website","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"certificate":{"type":"string","description":"The certificate in PEM. A full chain is fine: the one matching the key is used, the rest becomes the chain.","maxLength":65536},"privateKey":{"type":"string","description":"Its private key in PEM, without a passphrase. Installed on the hosting server only; Faastic doesn't keep it.","maxLength":65536},"chain":{"type":"string","description":"Intermediate certificate(s) in PEM (the CA bundle). Optional; any order.","maxLength":65536}},"required":["certificate","privateKey"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/cache/purge":{"post":{"summary":"Purge the page cache","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/http-auth":{"post":{"summary":"Add/update a password-protection user","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string","description":"User name"},"password":{"type":"string","description":"Password"}},"required":["user","password"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/http-auth/{user}":{"delete":{"summary":"Remove a password-protection user","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"user","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ftp":{"post":{"summary":"Add an FTP account","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string","description":"FTP user name (the account prefix is added)"},"password":{"type":"string","description":"Password"},"path":{"type":"string","description":"Folder inside the site the user is confined to (optional)"}},"required":["user","password"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ftp/{ftpUser}":{"patch":{"summary":"Change an FTP account","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","description":"New password"},"path":{"type":"string","description":"New folder inside the site"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"ftpUser","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove an FTP account","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"ftpUser","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/logs/{kind}":{"get":{"summary":"Access or error log (recent lines)","tags":["hosting"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":1000},"in":"query","name":"lines","required":false,"description":"How many recent lines (default 200)"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"kind","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/apps":{"get":{"summary":"Installable apps (Hestia's installers, filtered to this server)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/apps/jobs":{"get":{"summary":"Recent app installs and their status","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/apps/{app}/install":{"post":{"summary":"Install an app on one of this account's websites (async job)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Website to install on"},"php":{"type":"string","description":"PHP version to switch the site to first (optional)"},"options":{"type":"object","additionalProperties":{"type":"string"},"description":"The app's fields (see GET …/hosting/apps: e.g. full_name, email, password)"}},"required":["domain"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"app","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail":{"get":{"summary":"Mail domains","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add a mail domain","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Mail domain, e.g. \"example.com\""},"antispam":{"type":"boolean","description":"Spam filter"},"antivirus":{"type":"boolean","description":"Virus scanning"},"dkim":{"type":"boolean","description":"DKIM signing"}},"required":["domain"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}":{"get":{"summary":"One mail domain","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Change mail domain settings","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"antispam":{"type":"boolean","description":"Spam filter"},"antivirus":{"type":"boolean","description":"Virus scanning"},"dkim":{"type":"boolean","description":"DKIM signing"},"rejectSpam":{"type":"boolean","description":"Refuse obvious spam at the door"},"catchall":{"type":"string","description":"Deliver mail for unknown addresses here (empty string = reject)","nullable":true},"webmail":{"type":"string","description":"Webmail client: \"roundcube\" or \"snappymail\" (null or empty switches webmail off)","nullable":true},"rateLimit":{"type":"integer","description":"Max. messages per hour for the domain (1-10000)"},"suspended":{"type":"boolean","description":"Pause the mail domain"}},"description":"Send only the settings to change"}}},"description":"Send only the settings to change"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a mail domain and all its mailboxes","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/ssl":{"get":{"summary":"Certificate details for mail.<domain>","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove the mail domain's certificate (mail clients fall back to the server's host name)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/ssl/certificate":{"post":{"summary":"Install your own certificate for mail.<domain> (PEM) - replaces Let's Encrypt","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"certificate":{"type":"string","description":"The certificate in PEM. A full chain is fine: the one matching the key is used, the rest becomes the chain.","maxLength":65536},"privateKey":{"type":"string","description":"Its private key in PEM, without a passphrase. Installed on the hosting server only; Faastic doesn't keep it.","maxLength":65536},"chain":{"type":"string","description":"Intermediate certificate(s) in PEM (the CA bundle). Optional; any order.","maxLength":65536}},"required":["certificate","privateKey"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/relay":{"put":{"summary":"Set (or clear with null) an SMTP relay","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","nullable":true,"description":"SMTP relay for outgoing mail (send null to remove)","properties":{"host":{"type":"string","description":"Relay host"},"port":{"type":"integer","description":"Port","minimum":1,"maximum":65535},"username":{"type":"string","description":"User name"},"password":{"type":"string","description":"Password"}}}}},"description":"SMTP relay for outgoing mail (send null to remove)"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/dns":{"get":{"summary":"DNS records this mail domain needs","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts":{"get":{"summary":"Mailboxes","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a mailbox","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"account":{"type":"string","description":"Local part, e.g. \"info\""},"password":{"type":"string","description":"Mailbox password"},"quotaMb":{"type":"integer","description":"Quota in MB (null = unlimited)","nullable":true}},"required":["account","password"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}":{"get":{"summary":"One mailbox (+ autoreply text)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Change a mailbox","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","description":"New password"},"quotaMb":{"type":"integer","description":"Quota in MB (null = unlimited)","nullable":true},"rateLimit":{"type":"integer","description":"Max. messages per hour"},"suspended":{"type":"boolean","description":"Pause the mailbox"},"forwardOnly":{"type":"boolean","description":"Forward without keeping a copy"}},"description":"Send only the settings to change"}}},"description":"Send only the settings to change"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a mailbox and its mail","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/aliases":{"post":{"summary":"Add a mailbox alias","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"alias":{"type":"string","description":"Alias local part, e.g. \"sales\""}},"required":["alias"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/aliases/{alias}":{"delete":{"summary":"Remove a mailbox alias","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true},{"schema":{"type":"string"},"in":"path","name":"alias","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/forwards":{"post":{"summary":"Add a forward","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string","description":"Address to forward to"}},"required":["to"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/forwards/{to}":{"delete":{"summary":"Remove a forward","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true},{"schema":{"type":"string"},"in":"path","name":"to","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/autoreply":{"put":{"summary":"Set (or clear with null) the autoreply","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Out-of-office message","properties":{"message":{"type":"string","description":"Autoreply text; null switches it off","nullable":true}}}}},"description":"Out-of-office message"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"domain","required":true},{"schema":{"type":"string"},"in":"path","name":"account","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/databases":{"get":{"summary":"Databases","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a database","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Database name (the account prefix is added)"},"user":{"type":"string","description":"Database user (default = the name)"},"password":{"type":"string","description":"Database password"},"type":{"type":"string","description":"\"mysql\" or \"pgsql\" (see GET …/hosting/databases → types)"}},"required":["name","password"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/databases/{db}":{"patch":{"summary":"Change a database (password, user, suspend)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","description":"New password"},"user":{"type":"string","description":"New user name"},"suspended":{"type":"boolean","description":"Pause the database"}},"description":"Send only the settings to change"}}},"description":"Send only the settings to change"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"db","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a database","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"db","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/databases/{db}/login":{"post":{"summary":"Temporary phpMyAdmin login (15 min)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"db","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/databases/{db}/dump":{"get":{"summary":"Download a SQL dump","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"db","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/cron":{"get":{"summary":"Cron jobs","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add a cron job","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"min":{"type":"string","description":"Minute (0-59, *, */5, 1,30 …)"},"hour":{"type":"string","description":"Hour (0-23 …)"},"day":{"type":"string","description":"Day of month (1-31 …)"},"month":{"type":"string","description":"Month (1-12 …)"},"wday":{"type":"string","description":"Day of week (0-7, 0 and 7 = Sunday …)"},"command":{"type":"string","description":"Command, run as the hosting user"}},"required":["min","hour","day","month","wday","command"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/cron-reports":{"get":{"summary":"Whether cron output is e-mailed, and to which address","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"E-mail cron output on/off","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"E-mail each job's output to the account contact"}},"required":["enabled"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/cron/{job}":{"patch":{"summary":"Change / pause a cron job","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"min":{"type":"string","description":"Minute"},"hour":{"type":"string","description":"Hour"},"day":{"type":"string","description":"Day of month"},"month":{"type":"string","description":"Month"},"wday":{"type":"string","description":"Day of week"},"command":{"type":"string","description":"Command"},"suspended":{"type":"boolean","description":"Pause (true) or resume (false)"}},"description":"Send only what changes"}}},"description":"Send only what changes"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"job","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a cron job","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"job","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/backups":{"get":{"summary":"Backups","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a backup now (queued)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/backups/{file}/restore":{"post":{"summary":"Restore from a backup (queued)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"web":{"description":"Websites to restore: true or \"*\" for all, or a list of names from this backup; omit to skip"},"mail":{"description":"Mail domains to restore: true or \"*\" for all, or a list of names from this backup; omit to skip"},"databases":{"description":"Databases to restore: true or \"*\" for all, or a list of names from this backup; omit to skip"},"cron":{"type":"boolean","description":"Restore the cron jobs"},"userDirs":{"description":"Home folders to restore: true or \"*\" for all, or a list of names from this backup; omit to skip"}},"description":"Restores over what exists now"}}},"description":"Restores over what exists now"},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/backups/exclusions":{"get":{"summary":"What backups leave out","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Replace what backups leave out (a section left out = nothing excluded there)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"web":{"description":"\"*\" = leave out every website; or a list of { domain, folders? }: no folders = the whole site, domain \"*\" = those folders in every site"},"mail":{"description":"\"*\" = leave out all mail; or a list of { domain, mailboxes? }: no mailboxes = the whole mail domain"},"databases":{"description":"\"*\" = leave out every database; or a list of database names"},"cron":{"type":"boolean","description":"Leave out cron jobs"},"homeFolders":{"description":"\"*\" = leave out every folder in the home directory; or a list, e.g. [\"tmp\", \".cache\"]"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/backups/{file}/download":{"post":{"summary":"Prepare a backup for download (then GET the same path)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}},"get":{"summary":"Download a backup (tar archive, streamed)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/backups/{file}":{"delete":{"summary":"Delete a backup","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files":{"get":{"summary":"List a folder","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"path","required":false,"description":"Absolute folder path inside the account home, e.g. /home/<user>/web/<site>/public_html (default: the home folder)"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/content":{"get":{"summary":"Read a text file (editor)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"path","required":true,"description":"Absolute file path inside the account home"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Save a text file (editor)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"path":{"type":"string","description":"Absolute path inside the account's home"},"content":{"type":"string","description":"Full new file content (text, max. 2 MB)"}},"required":["path","content"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/download":{"get":{"summary":"Download a file","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"path","required":true,"description":"Absolute file path inside the account home"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/upload":{"post":{"summary":"Upload a file (multipart; field 'file', query 'path' = target folder)","tags":["hosting"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"path","required":true,"description":"Target folder (absolute path inside the account home)"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/folder":{"post":{"summary":"Create a folder","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"parent":{"type":"string","description":"Folder to create it in (absolute path inside the home)"},"name":{"type":"string","description":"Name"}},"required":["parent","name"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/file":{"post":{"summary":"Create an empty file","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"parent":{"type":"string","description":"Folder to create it in (absolute path inside the home)"},"name":{"type":"string","description":"Name"}},"required":["parent","name"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/move":{"post":{"summary":"Move / rename (or copy with copy:true)","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Source path"},"to":{"type":"string","description":"Destination path"},"copy":{"type":"boolean","description":"Copy instead of move"}},"required":["from","to"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/chmod":{"post":{"summary":"Change permissions","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"path":{"type":"string","description":"Path"},"mode":{"description":"Octal permissions, e.g. \"644\" or \"755\""}},"required":["path","mode"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/delete":{"post":{"summary":"Delete files/folders","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"description":"Paths inside the home"}},"required":["paths"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/archive":{"post":{"summary":"Compress into .tar.gz","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"description":"Paths to put in the archive"},"name":{"type":"string","description":"Archive file name (.tar.gz added if missing)"}},"required":["paths"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/hosting/files/extract":{"post":{"summary":"Extract an archive","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"path":{"type":"string","description":"Archive to extract (.zip, .tar.gz, .tgz, .tar)"},"destination":{"type":"string","description":"Folder to extract into"}},"required":["path","destination"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/billing/overview":{"get":{"summary":"Billing overview: balance, run-rate, 12-month spend, upcoming renewals","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/storage":{"get":{"summary":"Storage overview (usage/quota/shares/access details)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/storage/snapshots":{"get":{"summary":"List your storage snapshots","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a storage snapshot","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/storage/snapshots/{name}":{"delete":{"summary":"Delete a storage snapshot (by name)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{id}/storage/shares/{protocol}/{shareId}":{"post":{"summary":"Enable/disable one of your shares (SMB/NFS)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"protocol","required":true},{"schema":{"type":"string"},"in":"path","name":"shareId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/catalog":{"get":{"summary":"Active categories + products (with prices + availability) for this brand","tags":["catalog"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"categories":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"sortOrder":{"type":"integer"}}}},"products":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"spec":{"type":"object","additionalProperties":true,"nullable":true},"categoryId":{"type":"string","nullable":true},"availability":{"type":"object","additionalProperties":true,"properties":{"available":{"type":"boolean"},"remaining":{"type":"integer","nullable":true},"unlimited":{"type":"boolean"}}},"prices":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"period":{"type":"string"},"amountCents":{"type":"integer"},"setupFeeCents":{"type":"integer"},"currency":{"type":"string"}}}}}}},"osTemplates":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"osFamily":{"type":"string"},"osName":{"type":"string"},"osVersion":{"type":"string"},"label":{"type":"string"},"isDefault":{"type":"boolean"},"sortOrder":{"type":"integer"},"zoneIds":{"type":"array","items":{"type":"string"}}}}},"zones":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"countryCode":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}}}},"domainPurchasesEnabled":{"type":"boolean"}}}}}}},"security":[]}},"/v1/orgs/{orgId}/invoices":{"get":{"summary":"List this organization's invoices","tags":["billing"],"parameters":[{"schema":{"type":"string","enum":["draft","issued","paid","overdue","cancelled","credited"]},"in":"query","name":"status","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"integer","minimum":0},"in":"query","name":"offset","required":false},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"proformaNumber":{"type":"string","nullable":true},"kind":{"type":"string"},"status":{"type":"string"},"currency":{"type":"string"},"subtotalCents":{"type":"integer"},"vatCents":{"type":"integer"},"totalCents":{"type":"integer"},"issueDate":{"type":"string","format":"date-time","nullable":true},"dueDate":{"type":"string","format":"date-time","nullable":true},"bankTransferAvailable":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}}}}}},"/v1/orgs/{orgId}/invoices/{id}":{"get":{"summary":"Get one of this org's invoices + lines","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"invoice":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"proformaNumber":{"type":"string","nullable":true},"kind":{"type":"string"},"status":{"type":"string"},"currency":{"type":"string"},"subtotalCents":{"type":"integer"},"vatCents":{"type":"integer"},"totalCents":{"type":"integer"},"issueDate":{"type":"string","format":"date-time","nullable":true},"dueDate":{"type":"string","format":"date-time","nullable":true},"bankTransferAvailable":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}},"lines":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"description":{"type":"string"},"quantity":{"type":"string"},"unitPriceCents":{"type":"integer"},"vatRate":{"type":"string"},"amountCents":{"type":"integer"},"serviceId":{"type":"string","nullable":true}}}}}}}}}}}},"/v1/orgs/{orgId}/invoices/{id}/pdf":{"get":{"summary":"Download the invoice PDF (rendered by the e-invoicing service)","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/invoices/{id}/pay":{"post":{"summary":"Start payment for an invoice (Stripe Checkout)","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","nullable":true,"properties":{"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"url":{"type":"string"},"sessionId":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/invoices/merge-proformas":{"post":{"summary":"Merge all open payment requests into one - one payment, one transaction fee","tags":["billing"],"description":"Pro formas carry no fiscal number, so combining them is free of ceremony. The merged document inherits the EARLIEST due date of the set (a domain renewal's registrar cut-off keeps binding). Explicit action only - bundling never happens automatically.","parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"target":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"proformaNumber":{"type":"string","nullable":true},"kind":{"type":"string"},"status":{"type":"string"},"currency":{"type":"string"},"subtotalCents":{"type":"integer"},"vatCents":{"type":"integer"},"totalCents":{"type":"integer"},"issueDate":{"type":"string","format":"date-time","nullable":true},"dueDate":{"type":"string","format":"date-time","nullable":true},"bankTransferAvailable":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}},"absorbed":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"proformaNumber":{"type":"string","nullable":true}}}}}}}}}}}},"/v1/orgs/{orgId}/subscriptions":{"get":{"summary":"List this org's subscriptions","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"serviceId":{"type":"string"},"serviceLabel":{"type":"string"},"serviceType":{"type":"string"},"productId":{"type":"string"},"period":{"type":"string"},"periodCount":{"type":"integer"},"amountCents":{"type":"integer"},"currency":{"type":"string"},"status":{"type":"string"},"cancelAtPeriodEnd":{"type":"boolean"},"billingMode":{"type":"string"},"currentPeriodEnd":{"type":"string","format":"date-time","nullable":true},"paidThrough":{"type":"string","format":"date-time","nullable":true},"nextInvoiceDate":{"type":"string","format":"date-time","nullable":true}}}}}}}}}},"/v1/orgs/{orgId}/subscriptions/{id}/cancel":{"post":{"summary":"Request cancellation of a subscription (takes effect at the end of the paid period)","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"status":{"type":"string"},"cancelAtPeriodEnd":{"type":"boolean"},"effectiveAt":{"type":"string","format":"date-time"}}}}}}}}},"/v1/orgs/{orgId}/subscriptions/{id}/plan-options":{"get":{"summary":"Plans this subscription can move to, with proration + feasibility","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/subscriptions/{id}/change-plan":{"post":{"summary":"Move a subscription to another plan. Upgrades are prorated (→ a checkout for the delta); downgrades apply at the next renewal.","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["productId"],"properties":{"productId":{"type":"string","format":"uuid"},"period":{"type":"string","enum":["monthly","quarterly","semiannual","annual"]},"prorate":{"type":"boolean"},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"kind":{"type":"string"},"prorationCents":{"type":"integer"},"effectiveAt":{"type":"string","nullable":true},"prorationInvoiceId":{"type":"string","nullable":true},"checkoutUrl":{"type":"string","nullable":true}}}}}}}},"delete":{"summary":"Cancel a scheduled/unpaid plan change","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/payment-method":{"get":{"summary":"The org's saved card for automatic payments (if any)","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"hasCard":{"type":"boolean"},"brand":{"type":"string","nullable":true},"last4":{"type":"string","nullable":true}}}}}}}},"delete":{"summary":"Remove the saved card and revert automatic subscriptions to manual","tags":["billing"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/payment-method/setup":{"post":{"summary":"Begin saving a card for automatic renewal payments (Stripe setup checkout)","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}}}}},"/v1/orgs/{orgId}/subscriptions/{id}/billing-mode":{"patch":{"summary":"Set a subscription to pay manually each renewal or automatically (saved card)","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string","enum":["manual","auto"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"billingMode":{"type":"string"}},"required":["id","billingMode"]}}}}}}},"/v1/orgs/{orgId}/coupons/validate":{"post":{"summary":"Preview a promo code against a set of lines (read-only - no redemption). The final discount is recomputed at checkout.","tags":["billing"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","lines"],"properties":{"code":{"type":"string","minLength":1},"currency":{"type":"string"},"lines":{"type":"array","minItems":1,"items":{"type":"object","required":["amountCents"],"properties":{"amountCents":{"type":"integer"},"serviceType":{"type":"string"},"productId":{"type":"string"},"isSetup":{"type":"boolean"}}}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"valid":{"type":"boolean"},"discountCents":{"type":"integer"},"reason":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/orders":{"post":{"summary":"Place an order: creates the service (pending) + finalized invoice + Stripe checkout link","tags":["billing"],"description":"Provisioning happens automatically AFTER payment (invoice.paid → post-payment worker). `createServiceForProject` enforces that the project belongs to this org and the product belongs to the org's brand (+ stock cap), so cross-org / cross-brand orders are rejected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["projectId","productId","period"],"properties":{"projectId":{"type":"string","format":"uuid"},"productId":{"type":"string","format":"uuid"},"period":{"type":"string","enum":["monthly","quarterly","semiannual","annual"]},"sshKey":{"type":"string"},"osTemplateId":{"type":"string","format":"uuid"},"label":{"type":"string","description":"A name for the new service (servers: also the host name)"},"zoneId":{"type":"string","format":"uuid","description":"Location to place it in (servers, load balancers, databases, S3)"},"version":{"type":"string","description":"Databases: engine major version (default: the newest offered)"},"mode":{"type":"string","enum":["cache","durable"],"description":"Valkey: cache (no persistence) or durable (AOF + RDB, default)"},"networkId":{"type":"string","format":"uuid","description":"Databases / S3: the private network to join (recommended - private first)"},"restoreFromBackupId":{"type":"string","format":"uuid","description":"Databases: load this backup (of one of your own instances, same engine) into the new instance - a restore into a NEW instance, the source stays untouched"},"couponCode":{"type":"string"},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"},"autoPay":{"type":"boolean"},"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]},"config":{"type":"object"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"service":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"}}},"invoice":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"totalCents":{"type":"integer"},"status":{"type":"string"}}},"subscription":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"period":{"type":"string"}}},"checkoutUrl":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}/status":{"get":{"summary":"Live order status for one service: payment + provisioning + subscription in one call","tags":["billing"],"description":"What the storefront polls after an order. `provisioning` is a COARSE, customer-safe signal derived from the latest provisioning job (no infra/error detail leaked): none | in_progress | failed | done. `failed` lets the UI show 'we hit a snag - support is on it' instead of a silent endless 'pending'.","parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"service":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"providerRef":{"type":"string","nullable":true},"nextDueDate":{"type":"string","format":"date-time","nullable":true}}},"provisioning":{"type":"string"},"invoice":{"type":"object","additionalProperties":true,"nullable":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"status":{"type":"string"},"totalCents":{"type":"integer"}}},"subscription":{"type":"object","additionalProperties":true,"nullable":true,"properties":{"id":{"type":"string"},"status":{"type":"string"},"cancelAtPeriodEnd":{"type":"boolean"},"currentPeriodEnd":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}},"/v1/orgs/{orgId}/dns/zones":{"get":{"summary":"List this org's DNS zones","tags":["dns"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"configured":{"type":"boolean"},"zones":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"provider":{"type":"string"},"providerRef":{"type":"string","nullable":true},"projectId":{"type":"string","nullable":true},"serviceId":{"type":"string","nullable":true},"dnssec":{"type":"boolean"},"serial":{"type":"integer","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}},"post":{"summary":"Create a DNS zone under one of your projects","tags":["dns"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1},"projectId":{"type":"string"},"dnssec":{"type":"boolean"},"pointNameservers":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"provider":{"type":"string"},"providerRef":{"type":"string","nullable":true},"projectId":{"type":"string","nullable":true},"serviceId":{"type":"string","nullable":true},"dnssec":{"type":"boolean"},"serial":{"type":"integer","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/dns/zones/{id}/dnssec":{"get":{"summary":"DNSSEC status of a zone (signing + DS at the parent)","tags":["dns"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"state":{"type":"string"},"enabled":{"type":"boolean"},"ds":{"type":"array","items":{"type":"string"}},"dnskey":{"type":"string","nullable":true},"parentDs":{"type":"array","items":{"type":"string"}},"registeredWithUs":{"type":"boolean"},"delegatedToUs":{"type":"boolean"},"publishedAt":{"type":"string","format":"date-time","nullable":true},"disableRequestedAt":{"type":"string","format":"date-time","nullable":true}}}}}}}},"post":{"summary":"Switch DNSSEC on or off. On: sign, then publish the key once the domain points at us. Off: withdraw the DS, unsign after it's gone (≥48h).","tags":["dns"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"state":{"type":"string"},"enabled":{"type":"boolean"},"ds":{"type":"array","items":{"type":"string"}},"dnskey":{"type":"string","nullable":true},"parentDs":{"type":"array","items":{"type":"string"}},"registeredWithUs":{"type":"boolean"},"delegatedToUs":{"type":"boolean"},"publishedAt":{"type":"string","format":"date-time","nullable":true},"disableRequestedAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/dns/zones/{id}":{"get":{"summary":"Zone detail + records","tags":["dns"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"zone":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"provider":{"type":"string"},"providerRef":{"type":"string","nullable":true},"projectId":{"type":"string","nullable":true},"serviceId":{"type":"string","nullable":true},"dnssec":{"type":"boolean"},"serial":{"type":"integer","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}},"records":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"zoneId":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string"},"ttl":{"type":"integer"},"priority":{"type":"integer","nullable":true},"disabled":{"type":"boolean"}}}}}}}}}}},"delete":{"summary":"Delete a zone you own","tags":["dns"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/dns/zones/{id}/records":{"post":{"summary":"Add a record (multiple values per name+type allowed, except CNAME)","tags":["dns"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","type","content"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string","minLength":1},"ttl":{"type":"integer","minimum":60},"priority":{"type":"integer"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"zoneId":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string"},"ttl":{"type":"integer"},"priority":{"type":"integer","nullable":true},"disabled":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/dns/zones/{id}/records/{recordId}":{"patch":{"summary":"Edit a record value","tags":["dns"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1},"ttl":{"type":"integer","minimum":60},"priority":{"type":"integer"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"recordId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"zoneId":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string"},"ttl":{"type":"integer"},"priority":{"type":"integer","nullable":true},"disabled":{"type":"boolean"}}}}}}}},"delete":{"summary":"Delete a record","tags":["dns"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"recordId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/domains/search":{"get":{"summary":"Search a domain across the TLDs we offer (availability + retail price)","tags":["domains"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"name","required":true,"description":"A full domain (example.be) or just the name (example) to search every TLD we sell"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"query":{"type":"string"},"results":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"domain":{"type":"string"},"tld":{"type":"string"},"available":{"type":"boolean"},"offered":{"type":"boolean"},"registerPriceCents":{"type":"integer","nullable":true},"transferPriceCents":{"type":"integer","nullable":true},"currency":{"type":"string"},"transferAvailable":{"type":"boolean"},"authCodeRequired":{"type":"boolean"},"minPeriod":{"type":"integer"},"maxPeriod":{"type":"integer"}}}}}}}}}}}},"/v1/orgs/{orgId}/domains/order":{"post":{"summary":"Order a domain - register a new one or transfer one in (→ checkout)","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain","action"],"properties":{"domain":{"type":"string","minLength":3},"action":{"type":"string","enum":["register","transfer"]},"years":{"type":"integer","minimum":1,"maximum":10},"authCode":{"type":"string"},"projectId":{"type":"string"},"contactId":{"type":"string","format":"uuid"},"registrant":{"type":"object","required":["firstName","lastName","email","phone","street","zipcode","city","country"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"companyName":{"type":"string"},"street":{"type":"string"},"number":{"type":"string"},"zipcode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string","minLength":2,"maxLength":2}}},"couponCode":{"type":"string"},"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"service":{"type":"object","additionalProperties":true},"invoice":{"type":"object","additionalProperties":true},"checkoutUrl":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/domains":{"get":{"summary":"List this org's domains","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/domains/{id}":{"get":{"summary":"Domain detail (live status + nameservers)","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/domains/{id}/setup-dns":{"post":{"summary":"Point this domain's nameservers at us and create its PowerDNS zone","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"zoneId":{"type":"string"}}}}}}}}},"/v1/orgs/{orgId}/domains/{id}/nameservers":{"put":{"summary":"Set the domain's nameservers","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nameservers"],"properties":{"nameservers":{"type":"array","items":{"type":"string"},"minItems":2}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/domains/{id}/authcode":{"get":{"summary":"Get the EPP/auth code (to transfer the domain away)","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"authCode":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/domains/{id}/autorenew":{"put":{"summary":"Toggle automatic renewal (auto-charge the saved card on renewal)","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["on"],"properties":{"on":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/domains/{id}/lock":{"put":{"summary":"Lock or unlock the domain (registrar transfer lock)","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["locked"],"properties":{"locked":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/domains/{id}/renew":{"post":{"summary":"Renew the domain now (extends the registration by its term → checkout)","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"successUrl":{"type":"string"},"cancelUrl":{"type":"string"},"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"invoice":{"type":"object","additionalProperties":true},"checkoutUrl":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/domain-contacts":{"get":{"summary":"List saved registry contacts","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"label":{"type":"string","nullable":true},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"companyName":{"type":"string","nullable":true},"street":{"type":"string"},"number":{"type":"string","nullable":true},"zipcode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"post":{"summary":"Save a registry contact","tags":["domains"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["firstName","lastName","email","phone","street","zipcode","city","country"],"properties":{"label":{"type":"string"},"firstName":{"type":"string","minLength":1},"lastName":{"type":"string","minLength":1},"email":{"type":"string","format":"email"},"phone":{"type":"string","minLength":1},"companyName":{"type":"string"},"street":{"type":"string","minLength":1},"number":{"type":"string"},"zipcode":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"country":{"type":"string","minLength":2,"maxLength":2}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"label":{"type":"string","nullable":true},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"companyName":{"type":"string","nullable":true},"street":{"type":"string"},"number":{"type":"string","nullable":true},"zipcode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/domain-contacts/{id}":{"delete":{"summary":"Delete a saved registry contact","tags":["domains"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/hosting/order":{"post":{"summary":"Order shared hosting - with an existing domain, or registering / transferring one in the same checkout","tags":["hosting"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["productId","period","domainMode","domain"],"properties":{"productId":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"period":{"type":"string","enum":["monthly","quarterly","semiannual","annual"]},"domainMode":{"type":"string","enum":["existing","register","transfer"]},"domain":{"type":"string","minLength":3},"domainYears":{"type":"integer","minimum":1,"maximum":10},"authCode":{"type":"string"},"registrant":{"type":"object","required":["firstName","lastName","email","phone","street","zipcode","city","country"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"companyName":{"type":"string"},"street":{"type":"string"},"number":{"type":"string"},"zipcode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string","minLength":2,"maxLength":2}}},"contactId":{"type":"string","format":"uuid"},"label":{"type":"string"},"couponCode":{"type":"string"},"autoPay":{"type":"boolean"},"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"service":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"}}},"domain":{"type":"object","additionalProperties":true,"nullable":true,"properties":{"id":{"type":"string"},"status":{"type":"string"}}},"invoice":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"totalCents":{"type":"integer"},"status":{"type":"string"}}},"checkoutUrl":{"type":"string","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/cart/checkout":{"post":{"summary":"Check out a cart of products (services + domains) as ONE bundled invoice + checkout","tags":["cart"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"projectId":{"type":"string","format":"uuid"},"items":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["service","domain"]},"productId":{"type":"string","format":"uuid"},"period":{"type":"string","enum":["monthly","quarterly","semiannual","annual"]},"sshKey":{"type":"string"},"label":{"type":"string"},"osTemplateId":{"type":"string","format":"uuid"},"zoneId":{"type":"string","format":"uuid"},"version":{"type":"string"},"mode":{"type":"string","enum":["cache","durable"]},"networkId":{"type":"string","format":"uuid"},"restoreFromBackupId":{"type":"string","format":"uuid"},"domainMode":{"type":"string","enum":["existing","register","transfer"]},"domainYears":{"type":"integer","minimum":1,"maximum":10},"action":{"type":"string","enum":["register","transfer"]},"years":{"type":"integer","minimum":1,"maximum":10},"domain":{"type":"string"},"authCode":{"type":"string"},"registrant":{"type":"object","required":["firstName","lastName","email","phone","street","zipcode","city","country"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"companyName":{"type":"string"},"street":{"type":"string"},"number":{"type":"string"},"zipcode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string","minLength":2,"maxLength":2}}},"contactId":{"type":"string","format":"uuid"}}}},"couponCode":{"type":"string"},"autoPay":{"type":"boolean"},"paymentMethod":{"type":"string","enum":["card","bancontact","ideal","bank_transfer"]},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"services":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"}}}},"invoice":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"number":{"type":"string","nullable":true},"totalCents":{"type":"integer"},"status":{"type":"string"}}},"checkoutUrl":{"type":"string","nullable":true}}}}}}}}},"/v1/domains/check":{"get":{"summary":"Public domain availability + retail price (no auth)","tags":["domains"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":253},"in":"query","name":"name","required":true,"description":"A full domain (example.be) or just the name (example) to check every TLD we sell"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"query":{"type":"string"},"results":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"domain":{"type":"string"},"tld":{"type":"string"},"available":{"type":"boolean"},"offered":{"type":"boolean"},"registerPriceCents":{"type":"integer","nullable":true},"transferPriceCents":{"type":"integer","nullable":true},"currency":{"type":"string"},"transferAvailable":{"type":"boolean"},"authCodeRequired":{"type":"boolean"},"minPeriod":{"type":"integer"},"maxPeriod":{"type":"integer"}}}}}}}}}},"security":[]}},"/v1/domains/tlds":{"get":{"summary":"Public TLD price book - what we sell and for how much (no auth)","tags":["domains"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"domainPurchasesEnabled":{"type":"boolean"},"tlds":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"tld":{"type":"string"},"currency":{"type":"string"},"registerPriceCents":{"type":"integer"},"renewPriceCents":{"type":"integer","nullable":true},"transferPriceCents":{"type":"integer","nullable":true},"transferAvailable":{"type":"boolean"},"authCodeRequired":{"type":"boolean"},"minPeriod":{"type":"integer"},"maxPeriod":{"type":"integer"}}}}}}}}}},"security":[]}},"/v1/orgs/{orgId}/tickets":{"get":{"summary":"List the organization's support tickets","tags":["support"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"brandId":{"type":"string"},"organizationId":{"type":"string","nullable":true},"openedByUserId":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"contactName":{"type":"string","nullable":true},"departmentId":{"type":"string","nullable":true},"subject":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"serviceId":{"type":"string","nullable":true},"invoiceId":{"type":"string","nullable":true},"assignedAdminId":{"type":"string","nullable":true},"lastMessageAt":{"type":"string","format":"date-time","nullable":true},"firstResponseAt":{"type":"string","format":"date-time","nullable":true},"closedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"post":{"summary":"Open a support ticket","tags":["support"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subject","body"],"properties":{"subject":{"type":"string","minLength":1},"body":{"type":"string","minLength":1},"departmentId":{"type":"string"},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"serviceId":{"type":"string"},"invoiceId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ticket":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"brandId":{"type":"string"},"organizationId":{"type":"string","nullable":true},"openedByUserId":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"contactName":{"type":"string","nullable":true},"departmentId":{"type":"string","nullable":true},"subject":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"serviceId":{"type":"string","nullable":true},"invoiceId":{"type":"string","nullable":true},"assignedAdminId":{"type":"string","nullable":true},"lastMessageAt":{"type":"string","format":"date-time","nullable":true},"firstResponseAt":{"type":"string","format":"date-time","nullable":true},"closedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}},"message":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"ticketId":{"type":"string"},"author":{"type":"string"},"authorUserId":{"type":"string","nullable":true},"authorAdminId":{"type":"string","nullable":true},"body":{"type":"string"},"isInternal":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}},"/v1/orgs/{orgId}/departments":{"get":{"summary":"List the brand's support departments","tags":["support"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"brandId":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}},"/v1/orgs/{orgId}/tickets/{id}":{"get":{"summary":"Get a ticket + its (customer-visible) thread","tags":["support"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"ticket":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"brandId":{"type":"string"},"organizationId":{"type":"string","nullable":true},"openedByUserId":{"type":"string","nullable":true},"contactEmail":{"type":"string","nullable":true},"contactName":{"type":"string","nullable":true},"departmentId":{"type":"string","nullable":true},"subject":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"serviceId":{"type":"string","nullable":true},"invoiceId":{"type":"string","nullable":true},"assignedAdminId":{"type":"string","nullable":true},"lastMessageAt":{"type":"string","format":"date-time","nullable":true},"firstResponseAt":{"type":"string","format":"date-time","nullable":true},"closedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}},"messages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"ticketId":{"type":"string"},"author":{"type":"string"},"authorUserId":{"type":"string","nullable":true},"authorAdminId":{"type":"string","nullable":true},"body":{"type":"string"},"isInternal":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}},"attachments":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"messageId":{"type":"string"},"ticketId":{"type":"string"},"filename":{"type":"string"},"mime":{"type":"string"},"sizeBytes":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}}},"/v1/orgs/{orgId}/tickets/{id}/messages":{"post":{"summary":"Reply to a ticket (re-opens it)","tags":["support"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"properties":{"body":{"type":"string","minLength":1}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"ticketId":{"type":"string"},"author":{"type":"string"},"authorUserId":{"type":"string","nullable":true},"authorAdminId":{"type":"string","nullable":true},"body":{"type":"string"},"isInternal":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/tickets/{ticketId}/messages/{messageId}/attachments":{"post":{"summary":"Attach a file to a ticket message (multipart 'file', ≤10 MB, safe types only)","tags":["support"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"ticketId","required":true},{"schema":{"type":"string"},"in":"path","name":"messageId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"messageId":{"type":"string"},"ticketId":{"type":"string"},"filename":{"type":"string"},"mime":{"type":"string"},"sizeBytes":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/tickets/{ticketId}/attachments/{attachmentId}":{"get":{"summary":"Download a ticket attachment (inert; attachment disposition)","tags":["support"],"parameters":[{"schema":{"type":"string","enum":["0","1"]},"in":"query","name":"inline","required":false,"description":"\"1\" = inline disposition for safe types (in-browser preview)"},{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"ticketId","required":true},{"schema":{"type":"string"},"in":"path","name":"attachmentId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v1/orgs/{orgId}/services/{serviceId}/addons":{"get":{"summary":"Add-ons available for + attached to a service","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"available":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"description":{"type":"string","nullable":true},"monthlyCents":{"type":"integer"},"currency":{"type":"string"},"maxPerService":{"type":"integer"}}}},"attached":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"monthlyCents":{"type":"integer"},"currency":{"type":"string"},"status":{"type":"string"},"metadata":{"type":"object","additionalProperties":true,"nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}}},"post":{"summary":"Attach an add-on to a service (bills on the next renewal)","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["offeringId"],"properties":{"offeringId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"monthlyCents":{"type":"integer"},"currency":{"type":"string"},"status":{"type":"string"},"metadata":{"type":"object","additionalProperties":true,"nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}/addons/{addonId}":{"delete":{"summary":"Remove an add-on (stops billing next renewal; no refund)","tags":["services"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true},{"schema":{"type":"string"},"in":"path","name":"addonId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}}}}},"/v1/orgs/{orgId}/services/{serviceId}/addons/{addonId}/move":{"post":{"summary":"Move an extra IP (floating IP) to another server of this organization","tags":["services"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["targetServiceId"],"properties":{"targetServiceId":{"type":"string","format":"uuid"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"orgId","required":true},{"schema":{"type":"string"},"in":"path","name":"serviceId","required":true},{"schema":{"type":"string"},"in":"path","name":"addonId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"monthlyCents":{"type":"integer"},"currency":{"type":"string"},"status":{"type":"string"},"metadata":{"type":"object","additionalProperties":true,"nullable":true},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}}},"components":{"schemas":{},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fst_…"}}},"security":[{"bearerAuth":[]}]}