Verwalten Sie Ihre Infrastruktur über eine API
Automatisieren Sie Server, Netzwerke, Load Balancer, Datenbanken und DNS mit einer REST-API. Starten Sie mit den Beispielen unten und geben Sie jedem Skript über ein eingeschränktes Token den Zugriff, den es braucht.
API-Tokens
Erstellen Sie ein Token in Ihrem Dashboard unter Team → API-Tokens und bestätigen Sie mit Ihrem Passwort oder dem Code Ihrer Authenticator-App. Es gehört zu einer Organisation und handelt dort mit den Rechten Ihrer Rolle.
Authorization: Bearer fst_… Lesen oder Lesen & Schreiben
Ein Lese-Token kann Daten nur ansehen. Ein Token mit Lese- und Schreibrechten kann Änderungen vornehmen und, wenn es Abrechnungsrechte hat, auch bestellen. Beschränken Sie jedes Token auf Bereiche, Projekte oder einzelne Dienste und geben Sie ihm ein Ablaufdatum. Kein Token kann Teammitglieder oder andere Tokens verwalten.
Limits
300 Anfragen pro Minute und Token. Jede Änderung erscheint im Aktivitätsprotokoll Ihrer Organisation, zusammen mit dem Token, das sie vorgenommen hat.
Ihre ersten Aufrufe
-
1. Token erstellen
Dashboard → Team → API-Tokens. Kopieren Sie es sofort und halten Sie es aus Ihrem Code heraus: export FAASTIC_TOKEN=fst_… Die ID Ihrer Organisation steht daneben.
-
2. Token prüfen
curl https://api.faastic.com/v1/api-token \ -H "Authorization: Bearer $FAASTIC_TOKEN" -
3. Dienste auflisten und einen Server neu starten
curl https://api.faastic.com/v1/orgs/$ORG_ID/services \ -H "Authorization: Bearer $FAASTIC_TOKEN"curl -X POST https://api.faastic.com/v1/orgs/$ORG_ID/services/$SERVER_ID/power \ -H "Authorization: Bearer $FAASTIC_TOKEN" \ -H "Content-Type: application/json" \ -d '{"action":"reboot"}'
API-Referenz
Jeder Endpunkt, den ein Token aufrufen kann, generiert aus der Live-API. Maschinenlesbar: openapi.json
organizations
Organizations (billing parties)
GET /
Get an organization
GET /v1/orgs/{orgId} PATCH /
Update organization billing details
PATCH /v1/orgs/{orgId} Request-Body
name | string | |
vatNumber | string | nullable |
countryCode | string | max 2 chars |
billingEmail | string | nullable |
address | object |
POST /billing/request-invoice-first
Request fiscal invoices BEFORE payment (instead of payment requests) - reviewed by an operator
POST /v1/orgs/{orgId}/billing/request-invoice-first Request-Body
note | string | max 500 chars |
projects
Projects within an organization
GET /projects
List projects in an organization
GET /v1/orgs/{orgId}/projects POST /projects
Create a project (admin role or higher)
POST /v1/orgs/{orgId}/projects Request-Body
name* | string |
GET /projects/{projectId}
Get a project
GET /v1/orgs/{orgId}/projects/{projectId} Parameter
projectId(path, required)
PATCH /projects/{projectId}
Rename a project (admin role or higher)
PATCH /v1/orgs/{orgId}/projects/{projectId} Parameter
projectId(path, required)
Request-Body
name* | string |
DELETE /projects/{projectId}
Delete a project (admin role or higher)
DELETE /v1/orgs/{orgId}/projects/{projectId} Parameter
projectId(path, required)
services
Your services: servers (power, console, snapshots, backups, firewall, volumes, ISO/rescue), hosting and add-ons
GET /services
List all services in an organization
GET /v1/orgs/{orgId}/services Parameter
includeTerminated(query)
GET /projects/{projectId}/services
List services in a project
GET /v1/orgs/{orgId}/projects/{projectId}/services Parameter
projectId(path, required)
GET /services/{serviceId}
Get a service
GET /v1/orgs/{orgId}/services/{serviceId} Parameter
serviceId(path, required)
PATCH /services/{serviceId}/protection
Delete protection (blocks cancelling) / rebuild protection (blocks reinstall, rollback, restore)
PATCH /v1/orgs/{orgId}/services/{serviceId}/protection Parameter
serviceId(path, required)
Request-Body
delete | boolean | |
rebuild | boolean |
PUT /services/{serviceId}/labels
Replace a service's labels (key → value, max 20)
PUT /v1/orgs/{orgId}/services/{serviceId}/labels Parameter
serviceId(path, required)
Request-Body
labels* | object |
POST /services/{id}/power
Power-control your VM (start / stop / reboot) - async
POST /v1/orgs/{orgId}/services/{id}/power Parameter
id(path, required)
Request-Body
action* | string | one of "start", "stop", "reboot", "power_cycle" |
GET /services/{id}/ipv6
This server's IPv6 subnet + address (if enabled)
GET /v1/orgs/{orgId}/services/{id}/ipv6 Parameter
id(path, required)
PUT /services/{id}/ipv6
Enable IPv6 (assigns a subnet) or change the server's IPv6 address - applied on the next restart
PUT /v1/orgs/{orgId}/services/{id}/ipv6 Parameter
id(path, required)
Request-Body
address | string | max 64 chars |
DELETE /services/{id}/ipv6
Disable IPv6 and return the subnet - its traffic stops now; the server's network config is cleaned up on the next restart
DELETE /v1/orgs/{orgId}/services/{id}/ipv6 Parameter
id(path, required)
POST /services/{id}/console
Open a console session for your VM (returns a websocket URL to our broker)
POST /v1/orgs/{orgId}/services/{id}/console Parameter
id(path, required)
Request-Body
type | string | one of "vnc", "term" |
GET /services/{id}/credentials
Reveal the VM's initial login (decrypted from the provisioning record)
GET /v1/orgs/{orgId}/services/{id}/credentials Parameter
id(path, required)
GET /services/{id}/features
Plan entitlements (snapshots/firewall/resize) + usage - drives which controls to show
GET /v1/orgs/{orgId}/services/{id}/features Parameter
id(path, required)
GET /services/{id}/vm-status
Live VM status (running/stopped, cpu%, mem, uptime)
GET /v1/orgs/{orgId}/services/{id}/vm-status Parameter
id(path, required)
GET /services/{id}/metrics
Resource graphs (CPU/RAM/disk/net) for a timeframe
GET /v1/orgs/{orgId}/services/{id}/metrics Parameter
timeframe(query)id(path, required)
GET /services/{id}/snapshots
List VM snapshots
GET /v1/orgs/{orgId}/services/{id}/snapshots Parameter
id(path, required)
POST /services/{id}/snapshots
Create a snapshot (within your plan's quota)
POST /v1/orgs/{orgId}/services/{id}/snapshots Parameter
id(path, required)
Request-Body
name* | string | |
description | string |
POST /services/{id}/snapshots/{name}/rollback
Roll the VM back to a snapshot
POST /v1/orgs/{orgId}/services/{id}/snapshots/{name}/rollback Parameter
id(path, required)name(path, required)
DELETE /services/{id}/snapshots/{name}
Delete a snapshot
DELETE /v1/orgs/{orgId}/services/{id}/snapshots/{name} Parameter
id(path, required)name(path, required)
GET /services/{id}/firewall
Firewall rules + options for your VM
GET /v1/orgs/{orgId}/services/{id}/firewall Parameter
id(path, required)
POST /services/{id}/firewall/rules
Add an inbound firewall rule (e.g. open 80/443)
POST /v1/orgs/{orgId}/services/{id}/firewall/rules Parameter
id(path, required)
Request-Body
action* | string | one of "ACCEPT", "DROP", "REJECT" |
proto | string | one of "tcp", "udp", "icmp" |
dport | string | max 11 chars |
source | string | max 43 chars |
comment | string | max 64 chars |
DELETE /services/{id}/firewall/rules/{pos}
Delete a firewall rule by position
DELETE /v1/orgs/{orgId}/services/{id}/firewall/rules/{pos} Parameter
id(path, required)pos(path, required)
POST /services/{id}/resize
Resize the VM within your plan's limits (CPU/RAM/grow disk)
POST /v1/orgs/{orgId}/services/{id}/resize Parameter
id(path, required)
Request-Body
vcpu | integer | 1… |
ramMb | integer | 256… |
diskGb | integer | 1… |
GET /services/{id}/network
The VM's assigned IP / gateway / PTR (null if DHCP)
GET /v1/orgs/{orgId}/services/{id}/network Parameter
id(path, required)
GET /services/{id}/backups
List VM backups
GET /v1/orgs/{orgId}/services/{id}/backups Parameter
id(path, required)
POST /services/{id}/backups
Create a backup (within your plan's quota)
POST /v1/orgs/{orgId}/services/{id}/backups Parameter
id(path, required)
Request-Body
note | string |
POST /services/{id}/backups/restore
Restore the VM from a backup (DESTRUCTIVE - overwrites the disk)
POST /v1/orgs/{orgId}/services/{id}/backups/restore Parameter
id(path, required)
Request-Body
volid* | string |
POST /services/{id}/backups/delete
Delete a backup
POST /v1/orgs/{orgId}/services/{id}/backups/delete Parameter
id(path, required)
Request-Body
volid* | string |
POST /services/{id}/reinstall
Reinstall the OS - DESTROYS all data, keeps the IP; keeps the SSH key(s) unless new ones are given (async)
POST /v1/orgs/{orgId}/services/{id}/reinstall Parameter
id(path, required)
Request-Body
confirm* | boolean | |
publicKeys | string | max 40000 chars · OpenSSH public key(s), one per line (e.g. "ssh-ed25519 AAAA… me@laptop") |
sshKeyIds | string (uuid)[] | Saved account SSH keys (GET /account/ssh-keys) to add |
POST /services/{id}/rdns
Request reverse DNS (PTR) for the VM's IP - opens a support ticket
POST /v1/orgs/{orgId}/services/{id}/rdns Parameter
id(path, required)
Request-Body
ptr* | string |
GET /services/{id}/ssh-keys
The server's login user, its SSH keys (fingerprints) and whether SSH password login was switched on at install
GET /v1/orgs/{orgId}/services/{id}/ssh-keys Parameter
id(path, required)
PUT /services/{id}/ssh-keys
Replace the server's SSH keys (async). They're installed on the server's next restart - restart: true restarts it now. Reinstalls use them too.
PUT /v1/orgs/{orgId}/services/{id}/ssh-keys Parameter
id(path, required)
Request-Body
publicKeys | string | max 40000 chars · OpenSSH public key(s), one per line (e.g. "ssh-ed25519 AAAA… me@laptop") |
sshKeyIds | string (uuid)[] | Saved account SSH keys (GET /account/ssh-keys) to add |
restart | boolean | Restart the running server now so the keys apply right away |
GET /services/{id}/reset-password
How a password reset works on this server: cloud-init (restarts it; its SSH host key changes) or the guest agent (in place)
GET /v1/orgs/{orgId}/services/{id}/reset-password Parameter
id(path, required)
POST /services/{id}/reset-password
Set a new password for the server's login user. Returned once. With cloud-init the server restarts and its SSH host key changes.
POST /v1/orgs/{orgId}/services/{id}/reset-password Parameter
id(path, required)
GET /services/{id}/isos
ISO library for this server + what's mounted + whether rescue mode is available
GET /v1/orgs/{orgId}/services/{id}/isos Parameter
id(path, required)
POST /services/{id}/iso
Mount an ISO from the library (boot: boot from it on the next restart)
POST /v1/orgs/{orgId}/services/{id}/iso Parameter
id(path, required)
Request-Body
volid* | string | max 255 chars |
boot | boolean |
DELETE /services/{id}/iso
Unmount the ISO (and restore the boot order)
DELETE /v1/orgs/{orgId}/services/{id}/iso Parameter
id(path, required)
POST /services/{id}/rescue
Boot into rescue mode (enabled: true) or back into the server's own system (false). Restarts the server.
POST /v1/orgs/{orgId}/services/{id}/rescue Parameter
id(path, required)
Request-Body
enabled* | boolean |
GET /topology
Your infrastructure as a graph: services, load-balancer targets and health, private networks, current traffic
GET /v1/orgs/{orgId}/topology GET /services/{id}/hosting
Live usage + quotas for a shared-hosting account
GET /v1/orgs/{orgId}/services/{id}/hosting Parameter
id(path, required)
GET /services/{id}/hosting/dns-check
Live DNS status for this hosting domain (delegation + A records)
GET /v1/orgs/{orgId}/services/{id}/hosting/dns-check Parameter
id(path, required)
POST /services/{id}/hosting/dns-setup
Use our DNS for this hosting domain (creates the zone, pre-populated)
POST /v1/orgs/{orgId}/services/{id}/hosting/dns-setup Parameter
id(path, required)
GET /services/{id}/storage
Storage overview (usage/quota/shares/access details)
GET /v1/orgs/{orgId}/services/{id}/storage Parameter
id(path, required)
GET /services/{id}/storage/snapshots
List your storage snapshots
GET /v1/orgs/{orgId}/services/{id}/storage/snapshots Parameter
id(path, required)
POST /services/{id}/storage/snapshots
Create a storage snapshot
POST /v1/orgs/{orgId}/services/{id}/storage/snapshots Parameter
id(path, required)
Request-Body
name* | string |
DELETE /services/{id}/storage/snapshots/{name}
Delete a storage snapshot (by name)
DELETE /v1/orgs/{orgId}/services/{id}/storage/snapshots/{name} Parameter
id(path, required)name(path, required)
GET /services/{serviceId}/addons
Add-ons available for + attached to a service
GET /v1/orgs/{orgId}/services/{serviceId}/addons Parameter
serviceId(path, required)
POST /services/{serviceId}/addons
Attach an add-on to a service (bills on the next renewal)
POST /v1/orgs/{orgId}/services/{serviceId}/addons Parameter
serviceId(path, required)
Request-Body
offeringId* | string (uuid) |
DELETE /services/{serviceId}/addons/{addonId}
Remove an add-on (stops billing next renewal; no refund)
DELETE /v1/orgs/{orgId}/services/{serviceId}/addons/{addonId} Parameter
serviceId(path, required)addonId(path, required)
POST /services/{serviceId}/addons/{addonId}/move
Move an extra IP (floating IP) to another server of this organization
POST /v1/orgs/{orgId}/services/{serviceId}/addons/{addonId}/move Parameter
serviceId(path, required)addonId(path, required)
Request-Body
targetServiceId* | string (uuid) |
domains
Domains: register, transfer, renew, nameservers, transfer lock and auth codes
GET /domains/search
Search a domain across the TLDs we offer (availability + retail price)
GET /v1/orgs/{orgId}/domains/search Parameter
name(query, required)
POST /domains/order
Order a domain - register a new one or transfer one in (→ checkout)
POST /v1/orgs/{orgId}/domains/order Request-Body
domain* | string | |
action* | string | one of "register", "transfer" |
years | integer | 1…10 |
authCode | string | |
projectId | string | |
contactId | string (uuid) | |
registrant | object | |
couponCode | string | |
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
successUrl | string | |
cancelUrl | string |
GET /domains
List this org's domains
GET /v1/orgs/{orgId}/domains GET /domains/{id}
Domain detail (live status + nameservers)
GET /v1/orgs/{orgId}/domains/{id} Parameter
id(path, required)
GET /domains/{id}/connect
What this domain can be connected to (hosting accounts, servers) and where it points now
GET /v1/orgs/{orgId}/domains/{id}/connect Parameter
id(path, required)
POST /domains/{id}/connect
Connect the domain to a service: plan the DNS changes (apply=false) or make them (apply=true). Only the records that connection needs change - e-mail settings stay unless an e-mail service is connected.
POST /v1/orgs/{orgId}/domains/{id}/connect Parameter
id(path, required)
Request-Body
target* | string | one of "hosting", "server", "website", "email" |
serviceId | string (uuid) | |
ipv4 | string | max 45 chars |
cname | string | max 253 chars |
verification | object | |
mx | object[] | |
spf | string | max 1024 chars |
apply | boolean |
POST /domains/{id}/setup-dns
Point this domain's nameservers at us and create its PowerDNS zone
POST /v1/orgs/{orgId}/domains/{id}/setup-dns Parameter
id(path, required)
PUT /domains/{id}/nameservers
Set the domain's nameservers
PUT /v1/orgs/{orgId}/domains/{id}/nameservers Parameter
id(path, required)
Request-Body
nameservers* | string[] |
GET /domains/{id}/authcode
Get the EPP/auth code (to transfer the domain away)
GET /v1/orgs/{orgId}/domains/{id}/authcode Parameter
id(path, required)
PUT /domains/{id}/autorenew
Toggle automatic renewal (auto-charge the saved card on renewal)
PUT /v1/orgs/{orgId}/domains/{id}/autorenew Parameter
id(path, required)
Request-Body
on* | boolean |
PUT /domains/{id}/lock
Lock or unlock the domain (registrar transfer lock)
PUT /v1/orgs/{orgId}/domains/{id}/lock Parameter
id(path, required)
Request-Body
locked* | boolean |
POST /domains/{id}/renew
Renew the domain now (extends the registration by its term → checkout)
POST /v1/orgs/{orgId}/domains/{id}/renew Parameter
id(path, required)
Request-Body
successUrl | string | |
cancelUrl | string | |
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
GET /domain-contacts
List saved registry contacts
GET /v1/orgs/{orgId}/domain-contacts POST /domain-contacts
Save a registry contact
POST /v1/orgs/{orgId}/domain-contacts Request-Body
label | string | |
firstName* | string | |
lastName* | string | |
email* | string (email) | |
phone* | string | |
companyName | string | |
street* | string | |
number | string | |
zipcode* | string | |
city* | string | |
country* | string | max 2 chars |
DELETE /domain-contacts/{id}
Delete a saved registry contact
DELETE /v1/orgs/{orgId}/domain-contacts/{id} Parameter
id(path, required)
GET /v1/domains/check
Public domain availability + retail price (no auth)
GET /v1/domains/check Parameter
name(query, required)
GET /v1/domains/tlds
Public TLD price book - what we sell and for how much (no auth)
GET /v1/domains/tlds dns
DNS zones and records on our nameservers, including DNSSEC
GET /dns/zones
List this org's DNS zones
GET /v1/orgs/{orgId}/dns/zones POST /dns/zones
Create a DNS zone under one of your projects
POST /v1/orgs/{orgId}/dns/zones Request-Body
name* | string | |
projectId | string | |
dnssec | boolean | |
pointNameservers | boolean |
GET /dns/zones/{id}/dnssec
DNSSEC status of a zone (signing + DS at the parent)
GET /v1/orgs/{orgId}/dns/zones/{id}/dnssec Parameter
id(path, required)
POST /dns/zones/{id}/dnssec
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).
POST /v1/orgs/{orgId}/dns/zones/{id}/dnssec Parameter
id(path, required)
Request-Body
enabled* | boolean |
GET /dns/zones/{id}
Zone detail + records
GET /v1/orgs/{orgId}/dns/zones/{id} Parameter
id(path, required)
DELETE /dns/zones/{id}
Delete a zone you own
DELETE /v1/orgs/{orgId}/dns/zones/{id} Parameter
id(path, required)
POST /dns/zones/{id}/records
Add a record (multiple values per name+type allowed, except CNAME)
POST /v1/orgs/{orgId}/dns/zones/{id}/records Parameter
id(path, required)
Request-Body
name* | string | |
type* | string | |
content* | string | |
ttl | integer | 60… |
priority | integer |
PATCH /dns/zones/{id}/records/{recordId}
Edit a record value
PATCH /v1/orgs/{orgId}/dns/zones/{id}/records/{recordId} Parameter
id(path, required)recordId(path, required)
Request-Body
content | string | |
ttl | integer | 60… |
priority | integer |
DELETE /dns/zones/{id}/records/{recordId}
Delete a record
DELETE /v1/orgs/{orgId}/dns/zones/{id}/records/{recordId} Parameter
id(path, required)recordId(path, required)
firewalls
Firewall templates: one rule set applied to many servers
GET /firewalls
Firewall templates of this organization, with the servers they're applied to
GET /v1/orgs/{orgId}/firewalls POST /firewalls
Create a firewall template
POST /v1/orgs/{orgId}/firewalls Request-Body
name* | string | max 60 chars |
rules | object[] |
PUT /firewalls/{fid}
Edit a template - rule changes reach every server it's applied to
PUT /v1/orgs/{orgId}/firewalls/{fid} Parameter
fid(path, required)
Request-Body
name | string | max 60 chars |
rules | object[] |
DELETE /firewalls/{fid}
Delete a template (its rules are removed from every server first)
DELETE /v1/orgs/{orgId}/firewalls/{fid} Parameter
fid(path, required)
POST /firewalls/{fid}/apply
Apply a template to servers
POST /v1/orgs/{orgId}/firewalls/{fid}/apply Parameter
fid(path, required)
Request-Body
serviceIds* | string[] |
POST /firewalls/{fid}/remove
Take a template off servers (its rules are removed from them)
POST /v1/orgs/{orgId}/firewalls/{fid}/remove Parameter
fid(path, required)
Request-Body
serviceIds* | string[] |
networks
Private networks between your servers
GET /networks
Private networks of this organization and their servers
GET /v1/orgs/{orgId}/networks POST /networks
Create a private network (RFC 1918 range, /16-/28)
POST /v1/orgs/{orgId}/networks Request-Body
name* | string | max 60 chars |
cidr* | string | max 18 chars |
DELETE /networks/{nid}
Delete a private network (detach its servers first)
DELETE /v1/orgs/{orgId}/networks/{nid} Parameter
nid(path, required)
POST /networks/{nid}/attach
Attach a server: adds a NIC on the network and assigns the next free address (cloud-init, next boot)
POST /v1/orgs/{orgId}/networks/{nid}/attach Parameter
nid(path, required)
Request-Body
serviceId* | string (uuid) |
POST /networks/{nid}/detach
Detach a server (removes its NIC on the network)
POST /v1/orgs/{orgId}/networks/{nid}/detach Parameter
nid(path, required)
Request-Body
serviceId* | string (uuid) |
cart
Ordering: check out several products in one payment
POST /cart/checkout
Check out a cart of products (services + domains) as ONE bundled invoice + checkout
POST /v1/orgs/{orgId}/cart/checkout Request-Body
projectId | string (uuid) | |
items* | object[] | |
couponCode | string | |
autoPay | boolean | |
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
successUrl | string | |
cancelUrl | string |
hosting
Web hosting orders
GET /services/{id}/hosting/overview
Account usage vs plan limits, links
GET /v1/orgs/{orgId}/services/{id}/hosting/overview Parameter
id(path, required)
GET /services/{id}/hosting/stats/history
Monthly disk + bandwidth history
GET /v1/orgs/{orgId}/services/{id}/hosting/stats/history Parameter
id(path, required)
GET /services/{id}/hosting/stats/sites
Disk + bandwidth per website
GET /v1/orgs/{orgId}/services/{id}/hosting/stats/sites Parameter
id(path, required)
GET /services/{id}/hosting/stats/traffic/{domain}
Traffic report from the recent access log
GET /v1/orgs/{orgId}/services/{id}/hosting/stats/traffic/{domain} Parameter
id(path, required)domain(path, required)
GET /services/{id}/hosting/activity
Hosting activity log
GET /v1/orgs/{orgId}/services/{id}/hosting/activity Parameter
id(path, required)
GET /services/{id}/hosting/notices
Messages from the hosting server (backup created/restored, …)
GET /v1/orgs/{orgId}/services/{id}/hosting/notices Parameter
id(path, required)
POST /services/{id}/hosting/notices/{notice}/read
Mark a server message as read
POST /v1/orgs/{orgId}/services/{id}/hosting/notices/{notice}/read Parameter
id(path, required)notice(path, required)
DELETE /services/{id}/hosting/notices/{notice}
Dismiss a server message
DELETE /v1/orgs/{orgId}/services/{id}/hosting/notices/{notice} Parameter
id(path, required)notice(path, required)
GET /services/{id}/hosting/logins
Panel/API sign-in history
GET /v1/orgs/{orgId}/services/{id}/hosting/logins Parameter
id(path, required)
GET /services/{id}/hosting/ssh-keys
SSH/SFTP keys
GET /v1/orgs/{orgId}/services/{id}/hosting/ssh-keys Parameter
id(path, required)
POST /services/{id}/hosting/ssh-keys
Add an SSH key
POST /v1/orgs/{orgId}/services/{id}/hosting/ssh-keys Parameter
id(path, required)
Request-Body
key* | string | OpenSSH public key, e.g. "ssh-ed25519 AAAA… me@laptop" |
DELETE /services/{id}/hosting/ssh-keys/{keyId}
Remove an SSH key
DELETE /v1/orgs/{orgId}/services/{id}/hosting/ssh-keys/{keyId} Parameter
id(path, required)keyId(path, required)
PUT /services/{id}/hosting/contact
Where the server's own messages (cron output, notices) are e-mailed
PUT /v1/orgs/{orgId}/services/{id}/hosting/contact Parameter
id(path, required)
Request-Body
email* | string | E-mail address for the server's messages (cron output, notices) |
POST /services/{id}/hosting/password
Change the hosting account password
POST /v1/orgs/{orgId}/services/{id}/hosting/password Parameter
id(path, required)
Request-Body
password* | string | New hosting account password (min. 10 characters, letters and digits) |
POST /services/{id}/hosting/panel-login
Allow or block direct sign-in to the hosting panel
POST /v1/orgs/{orgId}/services/{id}/hosting/panel-login Parameter
id(path, required)
Request-Body
enabled* | boolean | Allow signing in to the classic hosting panel directly |
GET /services/{id}/hosting/web
Websites
GET /v1/orgs/{orgId}/services/{id}/hosting/web Parameter
id(path, required)
POST /services/{id}/hosting/web
Add a website
POST /v1/orgs/{orgId}/services/{id}/hosting/web Parameter
id(path, required)
Request-Body
domain* | string | Domain or subdomain to serve, e.g. "example.com" or "blog.example.com" |
aliases | string[] | Extra host names served by the same site (www.<domain> is added automatically) |
php | string | PHP version, e.g. "8.3" (see GET …/hosting/php-versions); default = the server's default |
GET /services/{id}/hosting/web-php
PHP versions available on this server
GET /v1/orgs/{orgId}/services/{id}/hosting/web-php Parameter
id(path, required)
GET /services/{id}/hosting/web-templates
Server templates customers may pick (web, proxy), if the server's policy allows it
GET /v1/orgs/{orgId}/services/{id}/hosting/web-templates Parameter
id(path, required)
GET /services/{id}/hosting/web/{domain}
One website
GET /v1/orgs/{orgId}/services/{id}/hosting/web/{domain} Parameter
id(path, required)domain(path, required)
PATCH /services/{id}/hosting/web/{domain}
Change website settings
PATCH /v1/orgs/{orgId}/services/{id}/hosting/web/{domain} Parameter
id(path, required)domain(path, required)
Request-Body
php | string | PHP version, e.g. "8.3" |
webTemplate | string | Web server template (see GET …/hosting/web-templates; only when the server lets customers pick) |
proxyTemplate | string | Proxy (nginx) template, e.g. "default", "caching", "hosting" (see GET …/hosting/web-templates) |
redirect | object | nullable · Redirect every request (null removes it) |
docroot | object | nullable · Serve another site's folder (null restores the default) |
directoryListing | boolean | Show folder contents when there's no index file |
cache | object | Page cache |
stats | object | Visitor statistics (AWStats) |
forceSsl | boolean | Redirect http:// to https:// |
hsts | boolean | Send Strict-Transport-Security (browsers remember to use https) |
suspended | boolean | Take the site offline (true) or back online (false) |
DELETE /services/{id}/hosting/web/{domain}
Delete a website (files, logs, SSL)
DELETE /v1/orgs/{orgId}/services/{id}/hosting/web/{domain} Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/web/{domain}/aliases
Add an alias
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/aliases Parameter
id(path, required)domain(path, required)
Request-Body
alias* | string | Extra host name for this site |
DELETE /services/{id}/hosting/web/{domain}/aliases/{alias}
Remove an alias
DELETE /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/aliases/{alias} Parameter
id(path, required)domain(path, required)alias(path, required)
GET /services/{id}/hosting/web/{domain}/ssl
Certificate details
GET /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl Parameter
id(path, required)domain(path, required)
DELETE /services/{id}/hosting/web/{domain}/ssl
Remove SSL
DELETE /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/web/{domain}/ssl/letsencrypt
Issue a Let's Encrypt certificate
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl/letsencrypt Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/web/{domain}/ssl/certificate
Install your own certificate (PEM) - replaces Let's Encrypt for this website
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ssl/certificate Parameter
id(path, required)domain(path, required)
Request-Body
certificate* | string | max 65536 chars · The certificate in PEM. A full chain is fine: the one matching the key is used, the rest becomes the chain. |
privateKey* | string | max 65536 chars · Its private key in PEM, without a passphrase. Installed on the hosting server only; Faastic doesn't keep it. |
chain | string | max 65536 chars · Intermediate certificate(s) in PEM (the CA bundle). Optional; any order. |
POST /services/{id}/hosting/web/{domain}/cache/purge
Purge the page cache
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/cache/purge Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/web/{domain}/http-auth
Add/update a password-protection user
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/http-auth Parameter
id(path, required)domain(path, required)
Request-Body
user* | string | User name |
password* | string | Password |
DELETE /services/{id}/hosting/web/{domain}/http-auth/{user}
Remove a password-protection user
DELETE /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/http-auth/{user} Parameter
id(path, required)domain(path, required)user(path, required)
POST /services/{id}/hosting/web/{domain}/ftp
Add an FTP account
POST /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ftp Parameter
id(path, required)domain(path, required)
Request-Body
user* | string | FTP user name (the account prefix is added) |
password* | string | Password |
path | string | Folder inside the site the user is confined to (optional) |
PATCH /services/{id}/hosting/web/{domain}/ftp/{ftpUser}
Change an FTP account
PATCH /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ftp/{ftpUser} Parameter
id(path, required)domain(path, required)ftpUser(path, required)
Request-Body
password | string | New password |
path | string | New folder inside the site |
DELETE /services/{id}/hosting/web/{domain}/ftp/{ftpUser}
Remove an FTP account
DELETE /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/ftp/{ftpUser} Parameter
id(path, required)domain(path, required)ftpUser(path, required)
GET /services/{id}/hosting/web/{domain}/logs/{kind}
Access or error log (recent lines)
GET /v1/orgs/{orgId}/services/{id}/hosting/web/{domain}/logs/{kind} Parameter
lines(query)id(path, required)domain(path, required)kind(path, required)
GET /services/{id}/hosting/apps
Installable apps (Hestia's installers, filtered to this server)
GET /v1/orgs/{orgId}/services/{id}/hosting/apps Parameter
id(path, required)
GET /services/{id}/hosting/apps/jobs
Recent app installs and their status
GET /v1/orgs/{orgId}/services/{id}/hosting/apps/jobs Parameter
id(path, required)
POST /services/{id}/hosting/apps/{app}/install
Install an app on one of this account's websites (async job)
POST /v1/orgs/{orgId}/services/{id}/hosting/apps/{app}/install Parameter
id(path, required)app(path, required)
Request-Body
domain* | string | Website to install on |
php | string | PHP version to switch the site to first (optional) |
options | object | The app's fields (see GET …/hosting/apps: e.g. full_name, email, password) |
GET /services/{id}/hosting/mail
Mail domains
GET /v1/orgs/{orgId}/services/{id}/hosting/mail Parameter
id(path, required)
POST /services/{id}/hosting/mail
Add a mail domain
POST /v1/orgs/{orgId}/services/{id}/hosting/mail Parameter
id(path, required)
Request-Body
domain* | string | Mail domain, e.g. "example.com" |
antispam | boolean | Spam filter |
antivirus | boolean | Virus scanning |
dkim | boolean | DKIM signing |
GET /services/{id}/hosting/mail/{domain}
One mail domain
GET /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain} Parameter
id(path, required)domain(path, required)
PATCH /services/{id}/hosting/mail/{domain}
Change mail domain settings
PATCH /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain} Parameter
id(path, required)domain(path, required)
Request-Body
antispam | boolean | Spam filter |
antivirus | boolean | Virus scanning |
dkim | boolean | DKIM signing |
rejectSpam | boolean | Refuse obvious spam at the door |
catchall | string | nullable · Deliver mail for unknown addresses here (empty string = reject) |
webmail | string | nullable · Webmail client: "roundcube" or "snappymail" (null or empty switches webmail off) |
rateLimit | integer | Max. messages per hour for the domain (1-10000) |
suspended | boolean | Pause the mail domain |
DELETE /services/{id}/hosting/mail/{domain}
Delete a mail domain and all its mailboxes
DELETE /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain} Parameter
id(path, required)domain(path, required)
GET /services/{id}/hosting/mail/{domain}/ssl
Certificate details for mail.<domain>
GET /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/ssl Parameter
id(path, required)domain(path, required)
DELETE /services/{id}/hosting/mail/{domain}/ssl
Remove the mail domain's certificate (mail clients fall back to the server's host name)
DELETE /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/ssl Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/mail/{domain}/ssl/certificate
Install your own certificate for mail.<domain> (PEM) - replaces Let's Encrypt
POST /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/ssl/certificate Parameter
id(path, required)domain(path, required)
Request-Body
certificate* | string | max 65536 chars · The certificate in PEM. A full chain is fine: the one matching the key is used, the rest becomes the chain. |
privateKey* | string | max 65536 chars · Its private key in PEM, without a passphrase. Installed on the hosting server only; Faastic doesn't keep it. |
chain | string | max 65536 chars · Intermediate certificate(s) in PEM (the CA bundle). Optional; any order. |
PUT /services/{id}/hosting/mail/{domain}/relay
Set (or clear with null) an SMTP relay
PUT /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/relay Parameter
id(path, required)domain(path, required)
Request-Body
host | string | Relay host |
port | integer | 1…65535 · Port |
username | string | User name |
password | string | Password |
GET /services/{id}/hosting/mail/{domain}/dns
DNS records this mail domain needs
GET /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/dns Parameter
id(path, required)domain(path, required)
GET /services/{id}/hosting/mail/{domain}/accounts
Mailboxes
GET /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts Parameter
id(path, required)domain(path, required)
POST /services/{id}/hosting/mail/{domain}/accounts
Create a mailbox
POST /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts Parameter
id(path, required)domain(path, required)
Request-Body
account* | string | Local part, e.g. "info" |
password* | string | Mailbox password |
quotaMb | integer | nullable · Quota in MB (null = unlimited) |
GET /services/{id}/hosting/mail/{domain}/accounts/{account}
One mailbox (+ autoreply text)
GET /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account} Parameter
id(path, required)domain(path, required)account(path, required)
PATCH /services/{id}/hosting/mail/{domain}/accounts/{account}
Change a mailbox
PATCH /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account} Parameter
id(path, required)domain(path, required)account(path, required)
Request-Body
password | string | New password |
quotaMb | integer | nullable · Quota in MB (null = unlimited) |
rateLimit | integer | Max. messages per hour |
suspended | boolean | Pause the mailbox |
forwardOnly | boolean | Forward without keeping a copy |
DELETE /services/{id}/hosting/mail/{domain}/accounts/{account}
Delete a mailbox and its mail
DELETE /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account} Parameter
id(path, required)domain(path, required)account(path, required)
POST /services/{id}/hosting/mail/{domain}/accounts/{account}/aliases
Add a mailbox alias
POST /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/aliases Parameter
id(path, required)domain(path, required)account(path, required)
Request-Body
alias* | string | Alias local part, e.g. "sales" |
DELETE /services/{id}/hosting/mail/{domain}/accounts/{account}/aliases/{alias}
Remove a mailbox alias
DELETE /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/aliases/{alias} Parameter
id(path, required)domain(path, required)account(path, required)alias(path, required)
POST /services/{id}/hosting/mail/{domain}/accounts/{account}/forwards
Add a forward
POST /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/forwards Parameter
id(path, required)domain(path, required)account(path, required)
Request-Body
to* | string | Address to forward to |
DELETE /services/{id}/hosting/mail/{domain}/accounts/{account}/forwards/{to}
Remove a forward
DELETE /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/forwards/{to} Parameter
id(path, required)domain(path, required)account(path, required)to(path, required)
PUT /services/{id}/hosting/mail/{domain}/accounts/{account}/autoreply
Set (or clear with null) the autoreply
PUT /v1/orgs/{orgId}/services/{id}/hosting/mail/{domain}/accounts/{account}/autoreply Parameter
id(path, required)domain(path, required)account(path, required)
Request-Body
message | string | nullable · Autoreply text; null switches it off |
GET /services/{id}/hosting/databases
Databases
GET /v1/orgs/{orgId}/services/{id}/hosting/databases Parameter
id(path, required)
POST /services/{id}/hosting/databases
Create a database
POST /v1/orgs/{orgId}/services/{id}/hosting/databases Parameter
id(path, required)
Request-Body
name* | string | Database name (the account prefix is added) |
user | string | Database user (default = the name) |
password* | string | Database password |
type | string | "mysql" or "pgsql" (see GET …/hosting/databases → types) |
PATCH /services/{id}/hosting/databases/{db}
Change a database (password, user, suspend)
PATCH /v1/orgs/{orgId}/services/{id}/hosting/databases/{db} Parameter
id(path, required)db(path, required)
Request-Body
password | string | New password |
user | string | New user name |
suspended | boolean | Pause the database |
DELETE /services/{id}/hosting/databases/{db}
Delete a database
DELETE /v1/orgs/{orgId}/services/{id}/hosting/databases/{db} Parameter
id(path, required)db(path, required)
POST /services/{id}/hosting/databases/{db}/login
Temporary phpMyAdmin login (15 min)
POST /v1/orgs/{orgId}/services/{id}/hosting/databases/{db}/login Parameter
id(path, required)db(path, required)
GET /services/{id}/hosting/databases/{db}/dump
Download a SQL dump
GET /v1/orgs/{orgId}/services/{id}/hosting/databases/{db}/dump Parameter
id(path, required)db(path, required)
GET /services/{id}/hosting/cron
Cron jobs
GET /v1/orgs/{orgId}/services/{id}/hosting/cron Parameter
id(path, required)
POST /services/{id}/hosting/cron
Add a cron job
POST /v1/orgs/{orgId}/services/{id}/hosting/cron Parameter
id(path, required)
Request-Body
min* | string | Minute (0-59, *, */5, 1,30 …) |
hour* | string | Hour (0-23 …) |
day* | string | Day of month (1-31 …) |
month* | string | Month (1-12 …) |
wday* | string | Day of week (0-7, 0 and 7 = Sunday …) |
command* | string | Command, run as the hosting user |
GET /services/{id}/hosting/cron-reports
Whether cron output is e-mailed, and to which address
GET /v1/orgs/{orgId}/services/{id}/hosting/cron-reports Parameter
id(path, required)
PUT /services/{id}/hosting/cron-reports
E-mail cron output on/off
PUT /v1/orgs/{orgId}/services/{id}/hosting/cron-reports Parameter
id(path, required)
Request-Body
enabled* | boolean | E-mail each job's output to the account contact |
PATCH /services/{id}/hosting/cron/{job}
Change / pause a cron job
PATCH /v1/orgs/{orgId}/services/{id}/hosting/cron/{job} Parameter
id(path, required)job(path, required)
Request-Body
min | string | Minute |
hour | string | Hour |
day | string | Day of month |
month | string | Month |
wday | string | Day of week |
command | string | Command |
suspended | boolean | Pause (true) or resume (false) |
DELETE /services/{id}/hosting/cron/{job}
Delete a cron job
DELETE /v1/orgs/{orgId}/services/{id}/hosting/cron/{job} Parameter
id(path, required)job(path, required)
GET /services/{id}/hosting/backups
Backups
GET /v1/orgs/{orgId}/services/{id}/hosting/backups Parameter
id(path, required)
POST /services/{id}/hosting/backups
Create a backup now (queued)
POST /v1/orgs/{orgId}/services/{id}/hosting/backups Parameter
id(path, required)
POST /services/{id}/hosting/backups/{file}/restore
Restore from a backup (queued)
POST /v1/orgs/{orgId}/services/{id}/hosting/backups/{file}/restore Parameter
id(path, required)file(path, required)
Request-Body
web | object | Websites to restore: true or "*" for all, or a list of names from this backup; omit to skip |
mail | object | Mail domains to restore: true or "*" for all, or a list of names from this backup; omit to skip |
databases | object | Databases to restore: true or "*" for all, or a list of names from this backup; omit to skip |
cron | boolean | Restore the cron jobs |
userDirs | object | Home folders to restore: true or "*" for all, or a list of names from this backup; omit to skip |
GET /services/{id}/hosting/backups/exclusions
What backups leave out
GET /v1/orgs/{orgId}/services/{id}/hosting/backups/exclusions Parameter
id(path, required)
PUT /services/{id}/hosting/backups/exclusions
Replace what backups leave out (a section left out = nothing excluded there)
PUT /v1/orgs/{orgId}/services/{id}/hosting/backups/exclusions Parameter
id(path, required)
Request-Body
web | object | "*" = leave out every website; or a list of { domain, folders? }: no folders = the whole site, domain "*" = those folders in every site |
mail | object | "*" = leave out all mail; or a list of { domain, mailboxes? }: no mailboxes = the whole mail domain |
databases | object | "*" = leave out every database; or a list of database names |
cron | boolean | Leave out cron jobs |
homeFolders | object | "*" = leave out every folder in the home directory; or a list, e.g. ["tmp", ".cache"] |
GET /services/{id}/hosting/backups/{file}/download
Download a backup (tar archive, streamed)
GET /v1/orgs/{orgId}/services/{id}/hosting/backups/{file}/download Parameter
id(path, required)file(path, required)
POST /services/{id}/hosting/backups/{file}/download
Prepare a backup for download (then GET the same path)
POST /v1/orgs/{orgId}/services/{id}/hosting/backups/{file}/download Parameter
id(path, required)file(path, required)
DELETE /services/{id}/hosting/backups/{file}
Delete a backup
DELETE /v1/orgs/{orgId}/services/{id}/hosting/backups/{file} Parameter
id(path, required)file(path, required)
GET /services/{id}/hosting/files
List a folder
GET /v1/orgs/{orgId}/services/{id}/hosting/files Parameter
path(query)id(path, required)
GET /services/{id}/hosting/files/content
Read a text file (editor)
GET /v1/orgs/{orgId}/services/{id}/hosting/files/content Parameter
path(query, required)id(path, required)
PUT /services/{id}/hosting/files/content
Save a text file (editor)
PUT /v1/orgs/{orgId}/services/{id}/hosting/files/content Parameter
id(path, required)
Request-Body
path* | string | Absolute path inside the account's home |
content* | string | Full new file content (text, max. 2 MB) |
GET /services/{id}/hosting/files/download
Download a file
GET /v1/orgs/{orgId}/services/{id}/hosting/files/download Parameter
path(query, required)id(path, required)
POST /services/{id}/hosting/files/upload
Upload a file (multipart; field 'file', query 'path' = target folder)
POST /v1/orgs/{orgId}/services/{id}/hosting/files/upload Parameter
path(query, required)id(path, required)
POST /services/{id}/hosting/files/folder
Create a folder
POST /v1/orgs/{orgId}/services/{id}/hosting/files/folder Parameter
id(path, required)
Request-Body
parent* | string | Folder to create it in (absolute path inside the home) |
name* | string | Name |
POST /services/{id}/hosting/files/file
Create an empty file
POST /v1/orgs/{orgId}/services/{id}/hosting/files/file Parameter
id(path, required)
Request-Body
parent* | string | Folder to create it in (absolute path inside the home) |
name* | string | Name |
POST /services/{id}/hosting/files/move
Move / rename (or copy with copy:true)
POST /v1/orgs/{orgId}/services/{id}/hosting/files/move Parameter
id(path, required)
Request-Body
from* | string | Source path |
to* | string | Destination path |
copy | boolean | Copy instead of move |
POST /services/{id}/hosting/files/chmod
Change permissions
POST /v1/orgs/{orgId}/services/{id}/hosting/files/chmod Parameter
id(path, required)
Request-Body
path* | string | Path |
mode* | object | Octal permissions, e.g. "644" or "755" |
POST /services/{id}/hosting/files/delete
Delete files/folders
POST /v1/orgs/{orgId}/services/{id}/hosting/files/delete Parameter
id(path, required)
Request-Body
paths* | string[] | Paths inside the home |
POST /services/{id}/hosting/files/archive
Compress into .tar.gz
POST /v1/orgs/{orgId}/services/{id}/hosting/files/archive Parameter
id(path, required)
Request-Body
paths* | string[] | Paths to put in the archive |
name | string | Archive file name (.tar.gz added if missing) |
POST /services/{id}/hosting/files/extract
Extract an archive
POST /v1/orgs/{orgId}/services/{id}/hosting/files/extract Parameter
id(path, required)
Request-Body
path* | string | Archive to extract (.zip, .tar.gz, .tgz, .tar) |
destination* | string | Folder to extract into |
POST /hosting/order
Order shared hosting - with an existing domain, or registering / transferring one in the same checkout
POST /v1/orgs/{orgId}/hosting/order Request-Body
productId* | string (uuid) | |
projectId | string (uuid) | |
period* | string | one of "monthly", "quarterly", "semiannual", "annual" |
domainMode* | string | one of "existing", "register", "transfer" |
domain* | string | |
domainYears | integer | 1…10 |
authCode | string | |
registrant | object | |
contactId | string (uuid) | |
label | string | |
couponCode | string | |
autoPay | boolean | |
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
successUrl | string | |
cancelUrl | string |
activity
Who did what, when - the organization's activity log
GET /activity
Activity log of this organization (owner/admin)
GET /v1/orgs/{orgId}/activity Parameter
before(query)limit(query)
catalog
Public storefront catalog
GET /v1/catalog
Active categories + products (with prices + availability) for this brand
GET /v1/catalog Parameter
locale(query)
GET /v1/catalog/ai-models
AI API models on sale with prices (micro-euro; excl. VAT)
GET /v1/catalog/ai-models billing
Customer billing: invoices (view/pay) + subscriptions (view/cancel)
GET /billing/overview
Billing overview: balance, run-rate, 12-month spend, upcoming renewals
GET /v1/orgs/{orgId}/billing/overview GET /invoices
List this organization's invoices
GET /v1/orgs/{orgId}/invoices Parameter
status(query)limit(query)offset(query)
GET /invoices/{id}
Get one of this org's invoices + lines
GET /v1/orgs/{orgId}/invoices/{id} Parameter
id(path, required)
GET /invoices/{id}/pdf
Download the invoice PDF (rendered by the e-invoicing service)
GET /v1/orgs/{orgId}/invoices/{id}/pdf Parameter
id(path, required)
POST /invoices/{id}/pay
Start payment for an invoice (Stripe Checkout)
POST /v1/orgs/{orgId}/invoices/{id}/pay Parameter
id(path, required)
Request-Body
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
successUrl | string | |
cancelUrl | string |
POST /invoices/merge-proformas
Merge all open payment requests into one - one payment, one transaction fee
POST /v1/orgs/{orgId}/invoices/merge-proformas GET /subscriptions
List this org's subscriptions
GET /v1/orgs/{orgId}/subscriptions POST /subscriptions/{id}/cancel
Request cancellation of a subscription (takes effect at the end of the paid period)
POST /v1/orgs/{orgId}/subscriptions/{id}/cancel Parameter
id(path, required)
Request-Body
reason | string |
GET /subscriptions/{id}/plan-options
Plans this subscription can move to, with proration + feasibility
GET /v1/orgs/{orgId}/subscriptions/{id}/plan-options Parameter
id(path, required)
POST /subscriptions/{id}/change-plan
Move a subscription to another plan. Upgrades are prorated (→ a checkout for the delta); downgrades apply at the next renewal.
POST /v1/orgs/{orgId}/subscriptions/{id}/change-plan Parameter
id(path, required)
Request-Body
productId* | string (uuid) | |
period | string | one of "monthly", "quarterly", "semiannual", "annual" |
prorate | boolean | |
successUrl | string | |
cancelUrl | string |
DELETE /subscriptions/{id}/change-plan
Cancel a scheduled/unpaid plan change
DELETE /v1/orgs/{orgId}/subscriptions/{id}/change-plan Parameter
id(path, required)
GET /payment-method
The org's saved card for automatic payments (if any)
GET /v1/orgs/{orgId}/payment-method DELETE /payment-method
Remove the saved card and revert automatic subscriptions to manual
DELETE /v1/orgs/{orgId}/payment-method POST /payment-method/setup
Begin saving a card for automatic renewal payments (Stripe setup checkout)
POST /v1/orgs/{orgId}/payment-method/setup Request-Body
successUrl | string | |
cancelUrl | string |
PATCH /subscriptions/{id}/billing-mode
Set a subscription to pay manually each renewal or automatically (saved card)
PATCH /v1/orgs/{orgId}/subscriptions/{id}/billing-mode Parameter
id(path, required)
Request-Body
mode* | string | one of "manual", "auto" |
POST /coupons/validate
Preview a promo code against a set of lines (read-only - no redemption). The final discount is recomputed at checkout.
POST /v1/orgs/{orgId}/coupons/validate Request-Body
code* | string | |
currency | string | |
lines* | object[] |
POST /orders
Place an order: creates the service (pending) + finalized invoice + Stripe checkout link
POST /v1/orgs/{orgId}/orders Request-Body
projectId* | string (uuid) | |
productId* | string (uuid) | |
period* | string | one of "monthly", "quarterly", "semiannual", "annual" |
sshKey | string | |
osTemplateId | string (uuid) | |
label | string | A name for the new service (servers: also the host name) |
zoneId | string (uuid) | Location to place it in (servers, load balancers, databases, S3) |
version | string | Databases: engine major version (default: the newest offered) |
mode | string | one of "cache", "durable" · Valkey: cache (no persistence) or durable (AOF + RDB, default) |
networkId | string (uuid) | Databases / S3: the private network to join (recommended - private first) |
restoreFromBackupId | string (uuid) | 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 | string | |
successUrl | string | |
cancelUrl | string | |
autoPay | boolean | |
paymentMethod | string | one of "card", "bancontact", "ideal", "bank_transfer" |
config | object |
GET /services/{serviceId}/status
Live order status for one service: payment + provisioning + subscription in one call
GET /v1/orgs/{orgId}/services/{serviceId}/status Parameter
serviceId(path, required)
GET /legacy-invoices
Invoices from the previous billing system (read-only history)
GET /v1/orgs/{orgId}/legacy-invoices GET /legacy-invoices/{id}
One invoice from the previous billing system, with its lines
GET /v1/orgs/{orgId}/legacy-invoices/{id} Parameter
id(path, required)
GET /vat-quote
VAT for an order before it is placed, for this organization
GET /v1/orgs/{orgId}/vat-quote Parameter
amountCents(query, required)
support
Customer support tickets
GET /tickets
List the organization's support tickets
GET /v1/orgs/{orgId}/tickets POST /tickets
Open a support ticket
POST /v1/orgs/{orgId}/tickets Request-Body
subject* | string | |
body* | string | |
departmentId | string | |
priority | string | one of "low", "normal", "high", "urgent" |
serviceId | string | |
invoiceId | string |
GET /tickets/unread-count
How many of the organization's tickets have a support reply the calling user hasn't read
GET /v1/orgs/{orgId}/tickets/unread-count POST /tickets/{id}/read
Mark a ticket as read by the calling user
POST /v1/orgs/{orgId}/tickets/{id}/read Parameter
id(path, required)
GET /departments
List the brand's support departments
GET /v1/orgs/{orgId}/departments GET /tickets/{id}
Get a ticket + its (customer-visible) thread
GET /v1/orgs/{orgId}/tickets/{id} Parameter
id(path, required)
POST /tickets/{id}/messages
Reply to a ticket (re-opens it)
POST /v1/orgs/{orgId}/tickets/{id}/messages Parameter
id(path, required)
Request-Body
body* | string |
POST /tickets/{id}/close
Close a ticket
POST /v1/orgs/{orgId}/tickets/{id}/close Parameter
id(path, required)
POST /tickets/{id}/reopen
Reopen a closed ticket
POST /v1/orgs/{orgId}/tickets/{id}/reopen Parameter
id(path, required)
POST /tickets/{ticketId}/messages/{messageId}/attachments
Attach a file to a ticket message (multipart 'file', ≤10 MB, safe types only)
POST /v1/orgs/{orgId}/tickets/{ticketId}/messages/{messageId}/attachments Parameter
ticketId(path, required)messageId(path, required)
GET /tickets/{ticketId}/attachments/{attachmentId}
Download a ticket attachment (inert; attachment disposition)
GET /v1/orgs/{orgId}/tickets/{ticketId}/attachments/{attachmentId} Parameter
inline(query)ticketId(path, required)attachmentId(path, required)
load-balancers
GET /services/{id}/lb
Load balancer: settings, services, targets (with health), limits, sync state
GET /v1/orgs/{orgId}/services/{id}/lb Parameter
id(path, required)
PATCH /services/{id}/lb
Change the balancing algorithm
PATCH /v1/orgs/{orgId}/services/{id}/lb Parameter
id(path, required)
Request-Body
algorithm* | string |
POST /services/{id}/lb/services
Add a service (listener: protocol + ports + health check)
POST /v1/orgs/{orgId}/services/{id}/lb/services Parameter
id(path, required)
Request-Body
protocol* | string | one of "http", "https", "tcp" · "http", "https" or "tcp" |
listenPort* | integer | 1…65535 · Port on the load balancer's public IP |
destinationPort* | integer | 1…65535 · Port on the targets |
httpRedirect | boolean | https only: also listen on :80 and redirect to https |
stickySessions | boolean | Keep a visitor on the same target (cookie) |
proxyProtocol | boolean | Send the PROXY protocol header to targets |
healthCheck | object | How targets are checked |
certificateIds | string[] | https only: certificate ids (from …/lb-certificates) |
PATCH /services/{id}/lb/services/{sid}
Change a service
PATCH /v1/orgs/{orgId}/services/{id}/lb/services/{sid} Parameter
id(path, required)sid(path, required)
Request-Body
protocol | string | one of "http", "https", "tcp" · "http", "https" or "tcp" |
listenPort | integer | 1…65535 · Port on the load balancer's public IP |
destinationPort | integer | 1…65535 · Port on the targets |
httpRedirect | boolean | https only: also listen on :80 and redirect to https |
stickySessions | boolean | Keep a visitor on the same target (cookie) |
proxyProtocol | boolean | Send the PROXY protocol header to targets |
healthCheck | object | How targets are checked |
certificateIds | string[] | https only: certificate ids (from …/lb-certificates) |
DELETE /services/{id}/lb/services/{sid}
Remove a service
DELETE /v1/orgs/{orgId}/services/{id}/lb/services/{sid} Parameter
id(path, required)sid(path, required)
POST /services/{id}/lb/targets
Add a target: one of your servers, or an IP address
POST /v1/orgs/{orgId}/services/{id}/lb/targets Parameter
id(path, required)
Request-Body
kind* | string | one of "server", "ip" · "server" (one of your servers) or "ip" |
serviceId | string | kind=server: the server's service id |
address | string | kind=ip: IPv4/IPv6 address |
weight | integer | Share of traffic (1-256, default 1) |
enabled | boolean | Receive traffic (default true) |
PATCH /services/{id}/lb/targets/{tid}
Change a target's weight or switch it on/off
PATCH /v1/orgs/{orgId}/services/{id}/lb/targets/{tid} Parameter
id(path, required)tid(path, required)
Request-Body
weight | integer | Share of traffic (1-256) |
enabled | boolean | Receive traffic |
DELETE /services/{id}/lb/targets/{tid}
Remove a target
DELETE /v1/orgs/{orgId}/services/{id}/lb/targets/{tid} Parameter
id(path, required)tid(path, required)
POST /services/{id}/lb/apply
Push the configuration to the load balancer now (waits for the result)
POST /v1/orgs/{orgId}/services/{id}/lb/apply Parameter
id(path, required)
POST /services/{id}/lb/restart
Restart the load balancer appliance
POST /v1/orgs/{orgId}/services/{id}/lb/restart Parameter
id(path, required)
GET /services/{id}/lb/metrics
Requests per second, status codes, connections and traffic
GET /v1/orgs/{orgId}/services/{id}/lb/metrics Parameter
range(query)id(path, required)
GET /services/{id}/lb/logs
Recent request log lines (newest last)
GET /v1/orgs/{orgId}/services/{id}/lb/logs Parameter
since(query)until(query)limit(query)search(query)system(query)id(path, required)
GET /services/{id}/lb/logs/export
Download request logs as a text file (up to 50,000 lines)
GET /v1/orgs/{orgId}/services/{id}/lb/logs/export Parameter
since(query)until(query)limit(query)search(query)system(query)id(path, required)
GET /services/{id}/lb/target-candidates
Your servers that can be added as targets
GET /v1/orgs/{orgId}/services/{id}/lb/target-candidates Parameter
id(path, required)
GET /load-balancers
Your load balancers: address, sync state, target health, last-hour traffic
GET /v1/orgs/{orgId}/load-balancers GET /lb-certificates
TLS certificates for load balancers
GET /v1/orgs/{orgId}/lb-certificates POST /lb-certificates
Upload a certificate ({type:'uploaded', name, certificate, privateKey}) or request a free one ({type:'managed', name, domains[]})
POST /v1/orgs/{orgId}/lb-certificates Request-Body
type* | string | one of "uploaded", "managed" · "uploaded" (your own) or "managed" (free Let's Encrypt) |
name* | string | Label |
certificate | string | uploaded: PEM certificate (+ chain) |
privateKey | string | uploaded: PEM private key |
domains | string[] | managed: domains to cover (they must point at the load balancer) |
PATCH /lb-certificates/{cid}
Rename a certificate
PATCH /v1/orgs/{orgId}/lb-certificates/{cid} Parameter
cid(path, required)
Request-Body
name* | string |
DELETE /lb-certificates/{cid}
Delete a certificate (refused while a load balancer uses it)
DELETE /v1/orgs/{orgId}/lb-certificates/{cid} Parameter
cid(path, required)
databases
GET /databases
Managed databases and S3 instances: engine, version, state, plan, endpoints and health
GET /v1/orgs/{orgId}/databases GET /services/{id}/data
Instance: engine, version, state, plan, endpoints, users, access, maintenance, backups, parameters, recent tasks
GET /v1/orgs/{orgId}/services/{id}/data Parameter
id(path, required)
GET /services/{id}/data/connection
Ready-made connection strings for the private and public endpoints (PASSWORD is a placeholder), and the CA bundle
GET /v1/orgs/{orgId}/services/{id}/data/connection Parameter
id(path, required)
GET /services/{id}/data/ca.pem
The CA bundle to verify the instance's TLS certificate (save as faastic-ca.pem)
GET /v1/orgs/{orgId}/services/{id}/data/ca.pem Parameter
id(path, required)
POST /services/{id}/data/apply
Push the configuration to the instance again now (after a failed push)
POST /v1/orgs/{orgId}/services/{id}/data/apply Parameter
id(path, required)
GET /services/{id}/data/storage
Storage: the plan's disk, extra storage added, the unit it's sold in and its price, and how much more can be added
GET /v1/orgs/{orgId}/services/{id}/data/storage Parameter
id(path, required)
POST /services/{id}/data/storage
Add storage: the disk grows online (nothing restarts) and the charge starts with the next renewal. Storage can't be given back.
POST /v1/orgs/{orgId}/services/{id}/data/storage Parameter
id(path, required)
Request-Body
units* | integer | 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 |
GET /services/{id}/data/instance-credentials
The admin user and its password (S3: the admin access key and secret)
GET /v1/orgs/{orgId}/services/{id}/data/instance-credentials Parameter
id(path, required)
POST /services/{id}/data/instance-credentials/rotate
New admin password (S3: new admin key) - the old one stops working
POST /v1/orgs/{orgId}/services/{id}/data/instance-credentials/rotate Parameter
id(path, required)
POST /services/{id}/data/users
Create a user from a role template (S3: an access key with bucket grants). The password/secret is returned once.
POST /v1/orgs/{orgId}/services/{id}/data/users Parameter
id(path, required)
Request-Body
name* | string | PostgreSQL/MySQL/Valkey: a user name (lowercase letters, digits, _). S3: the key's name |
role* | string | A role template from the instance's `roles` (e.g. readwrite, readonly; S3: readwrite, readonly, owner) |
scope | object | S3: { buckets: { "<bucket>": ["read","write","owner"] }, allowCreateBucket: true }. Valkey: { keyPrefix: "app1:" } |
POST /services/{id}/data/users/{name}/rotate
New password for a user (S3: a new key with the same grants; the old key is deleted). Returned once.
POST /v1/orgs/{orgId}/services/{id}/data/users/{name}/rotate Parameter
id(path, required)name(path, required)
DELETE /services/{id}/data/users/{name}
Delete a user (PostgreSQL: its objects move to the admin) or an S3 key
DELETE /v1/orgs/{orgId}/services/{id}/data/users/{name} Parameter
id(path, required)name(path, required)
GET /services/{id}/data/databases
Databases with their size (S3: buckets with size and object count)
GET /v1/orgs/{orgId}/services/{id}/data/databases Parameter
id(path, required)
POST /services/{id}/data/databases
Create a database (S3: a bucket, optionally with quotas)
POST /v1/orgs/{orgId}/services/{id}/data/databases Parameter
id(path, required)
Request-Body
name* | string | Database name (lowercase letters, digits, _) - S3: bucket name (3-63 of a-z 0-9 . -) |
maxSizeGb | number | S3 only: bucket quota in GB |
maxObjects | integer | S3 only: bucket quota in objects |
DELETE /services/{id}/data/databases/{name}
Delete a database and its data (S3: an empty bucket)
DELETE /v1/orgs/{orgId}/services/{id}/data/databases/{name} Parameter
id(path, required)name(path, required)
PUT /services/{id}/data/public-access
Public access: off by default; when on, only the allowlist may connect (TLS only)
PUT /v1/orgs/{orgId}/services/{id}/data/public-access Parameter
id(path, required)
Request-Body
enabled* | boolean | Expose the service port on the instance's public address (off by default) |
allowlist | string[] | Source addresses or ranges (IPv4/IPv6 CIDR) allowed to connect - required unless allowAnySource |
allowAnySource | boolean | Open to any source address (must be explicit; S3 allows an empty allowlist) |
PUT /services/{id}/data/maintenance
Move the weekly 60-minute maintenance window
PUT /v1/orgs/{orgId}/services/{id}/data/maintenance Parameter
id(path, required)
Request-Body
dayOfWeek* | integer | 0 = Sunday … 6 = Saturday |
hour* | integer | Start hour 0-23, Brussels time (60-minute window) |
PUT /services/{id}/data/backup-settings
Daily backup hour and how many daily backups to keep
PUT /v1/orgs/{orgId}/services/{id}/data/backup-settings Parameter
id(path, required)
Request-Body
hour* | integer | Daily backup hour 0-23, Brussels time |
keepDaily* | integer | Daily backups kept, 1-35 |
PATCH /services/{id}/data/parameters
Change allow-listed engine parameters (some restart the engine - see paramSpecs)
PATCH /v1/orgs/{orgId}/services/{id}/data/parameters Parameter
id(path, required)
Request-Body
work_mem | object | PostgreSQL: MB per sort or hash |
maintenance_work_mem | object | PostgreSQL: MB for VACUUM and CREATE INDEX |
statement_timeout | object | PostgreSQL: ms (0 = never) |
lock_timeout | object | PostgreSQL: ms (0 = never) |
idle_in_transaction_session_timeout | object | PostgreSQL: ms (0 = never) |
log_min_duration_statement | object | PostgreSQL: ms (-1 = off) |
random_page_cost | object | PostgreSQL: planner cost of a random page read |
default_statistics_target | object | PostgreSQL: 10-10000 |
max_connections | object | PostgreSQL: 20-1000 (restarts the engine) |
jit | object | PostgreSQL: just-in-time compilation |
wal_level | object | PostgreSQL: replica or logical (restarts the engine) |
autovacuum_vacuum_scale_factor | object | PostgreSQL: see paramSpecs for the allowed values |
autovacuum_analyze_scale_factor | object | PostgreSQL: see paramSpecs for the allowed values |
timezone | object | PostgreSQL: e.g. Europe/Brussels |
GET /services/{id}/data/backups
Backups: kind, size, when, and until when they are kept
GET /v1/orgs/{orgId}/services/{id}/data/backups Parameter
id(path, required)
POST /services/{id}/data/backups
Back up now (runs in the background; follow the returned task)
POST /v1/orgs/{orgId}/services/{id}/data/backups Parameter
id(path, required)
POST /services/{id}/data/backups/{backupId}/restore
Restore a backup in place - replaces all current data after a safety backup
POST /v1/orgs/{orgId}/services/{id}/data/backups/{backupId}/restore Parameter
id(path, required)backupId(path, required)
Request-Body
confirm* | string | Must be "restore-in-place": replaces all current data (a safety backup is taken first) |
GET /services/{id}/data/tasks
The instance's task history: every change, who made it, its outcome
GET /v1/orgs/{orgId}/services/{id}/data/tasks Parameter
id(path, required)
GET /services/{id}/data/tasks/{taskId}
One task with its log
GET /v1/orgs/{orgId}/services/{id}/data/tasks/{taskId} Parameter
id(path, required)taskId(path, required)
GET /services/{id}/data/stats
Live engine figures: connections, size, cache hit ratio, uptime (S3: buckets, bytes, objects, free space)
GET /v1/orgs/{orgId}/services/{id}/data/stats Parameter
id(path, required)
GET /services/{id}/data/metrics
CPU, memory, disk and network of the instance VM over a timeframe (hour, day, week, month, year)
GET /v1/orgs/{orgId}/services/{id}/data/metrics Parameter
id(path, required)
GET /services/{id}/data/logs
The engine's recent log lines
GET /v1/orgs/{orgId}/services/{id}/data/logs Parameter
id(path, required)
ai
GET /ai
AI API account: status, prepaid balance, auto top-up, gateway URL, month-to-date spend
GET /v1/orgs/{orgId}/ai POST /ai/activate
Activate the AI API (free; you pay only for usage, from prepaid credit)
POST /v1/orgs/{orgId}/ai/activate POST /ai/close
Close the AI API: every key is revoked. Remaining credit stays on the account.
POST /v1/orgs/{orgId}/ai/close PUT /ai/auto-topup
Automatic top-up with the saved card when the balance drops below a threshold
PUT /v1/orgs/{orgId}/ai/auto-topup Request-Body
enabled* | boolean | |
thresholdCents* | integer | 0… |
amountCents* | integer | 0… |
GET /ai/topups
Top-up history
GET /v1/orgs/{orgId}/ai/topups POST /ai/topups
Buy AI credit: creates the invoice (VAT on top). Pay it via POST /orgs/{orgId}/invoices/{id}/pay; the credit lands when it is paid.
POST /v1/orgs/{orgId}/ai/topups Request-Body
amountCents* | integer | 500…500000 |
GET /ai/ledger
Credit statement: top-ups, refunds and adjustments (usage is under /ai/usage)
GET /v1/orgs/{orgId}/ai/ledger GET /ai/keys
AI API keys (never the secret)
GET /v1/orgs/{orgId}/ai/keys Parameter
includeRevoked(query)
POST /ai/keys
Create an AI API key - ready to use on return; the secret is returned ONCE. 502 ai_key_setup_failed = nothing was created, retry.
POST /v1/orgs/{orgId}/ai/keys Request-Body
name* | string | max 80 chars |
allowedModels | string[] | Empty = every model on sale |
rpm | integer | 1… · nullable · Requests per minute |
tpm | integer | 1… · nullable · Tokens per minute |
monthlyCapMicros | integer | 0… · nullable · Spending cap per calendar month (UTC), in micro-euro (1 € = 1,000,000) |
PATCH /ai/keys/{keyId}
Change a key's name, models, rate limits or monthly cap
PATCH /v1/orgs/{orgId}/ai/keys/{keyId} Parameter
keyId(path, required)
Request-Body
name | string | max 80 chars |
allowedModels | string[] | Empty = every model on sale |
rpm | integer | 1… · nullable · Requests per minute |
tpm | integer | 1… · nullable · Tokens per minute |
monthlyCapMicros | integer | 0… · nullable · Spending cap per calendar month (UTC), in micro-euro (1 € = 1,000,000) |
DELETE /ai/keys/{keyId}
Revoke a key (immediate)
DELETE /v1/orgs/{orgId}/ai/keys/{keyId} Parameter
keyId(path, required)
GET /ai/models
Models on sale and their prices (micro-euro per 1M tokens / per minute / per image)
GET /v1/orgs/{orgId}/ai/models GET /ai/usage
Usage + spend: totals, per day, per model, per key (default: last 30 days)
GET /v1/orgs/{orgId}/ai/usage Parameter
from(query)to(query)keyId(query)
GET /ai/requests
Request log - metadata only (time, key, model, tokens, status, latency, charge). Prompts and answers are never stored.
GET /v1/orgs/{orgId}/ai/requests Parameter
keyId(query)before(query)limit(query)
Häufige Fragen
Hat Faastic eine öffentliche API?
Ja. Eine REST-API deckt Server, Load Balancer, Netzwerke, Datenbanken, DNS, Domains und Abrechnung ab: alles, was Sie im Portal tun können.
Gibt es eine OpenAPI-Spezifikation?
Ja, generiert aus der Live-API: https://api.faastic.com/v1/openapi.json.
Welche Rate Limits gelten?
300 Anfragen pro Minute und Token.
Kann ich Dienste über die API bestellen?
Ja, mit einem Token für Lesen & Schreiben, das Abrechnungsrechte hat. Die Bestellung liefert einen Zahlungslink, und nichts wird bereitgestellt, bevor die Rechnung bezahlt ist.