{"service": "bsserver-api", "name": "BSServer", "description": "The BSafe Group control plane: server inventory, Docker instances, sessions and the capabilities behind the admin panel", "base_url": "https://server-api.bsafegroup.be", "panel": "https://server.bsafegroup.be", "api": "/api", "health": "/api/health", "endpoint_count": 204, "endpoints": [{"group": "meta", "method": "GET", "path": "/", "auth": "none", "summary": "This document: what the service is and every route it serves"},{"group": "meta", "method": "GET", "path": "/api", "auth": "none", "summary": "The same document as the root, under the API prefix"},{"group": "meta", "method": "GET", "path": "/healthz", "auth": "none", "summary": "Liveness. Answers without touching the database or the Docker engine"},{"group": "meta", "method": "GET", "path": "/api/health", "auth": "none", "summary": "Readiness. Opens a database connection and pings the Docker engine"},{"group": "auth", "method": "GET", "path": "/api/auth/session", "auth": "session", "summary": "The signed-in user, their organization and their capabilities"},{"group": "auth", "method": "POST", "path": "/api/auth/login", "auth": "none", "summary": "Exchange an email and password for a session cookie"},{"group": "auth", "method": "POST", "path": "/api/auth/logout", "auth": "none", "summary": "Revoke the current session and clear its cookie"},{"group": "auth", "method": "GET", "path": "/api/auth/registration", "auth": "none", "summary": "Whether sign-up is open, so the register page knows before it renders"},{"group": "auth", "method": "POST", "path": "/api/auth/register", "auth": "none", "summary": "Create an account. Closed unless registration is enabled; the first one needs the bootstrap token"},{"group": "status", "method": "GET", "path": "/api/status", "auth": "none", "summary": "Platform health and the incident timeline. Public, and touches only two tables"},{"group": "status", "method": "POST", "path": "/api/admin/status/incidents/:id/resolve", "auth": "admin:support", "summary": "Close an incident and append the closing update"},{"group": "account", "method": "GET", "path": "/api/account/overview", "auth": "session", "summary": "Everything the dashboard renders, counted live in one request"},{"group": "account", "method": "GET", "path": "/api/account/activity", "auth": "session", "summary": "The organization's audit trail, newest first"},{"group": "account", "method": "PATCH", "path": "/api/account/profile", "auth": "session", "summary": "Change your own name, locale or timezone"},{"group": "account", "method": "GET", "path": "/api/account/organization", "auth": "session", "summary": "The organization's billing profile"},{"group": "account", "method": "PATCH", "path": "/api/account/organization", "auth": "team:manage", "summary": "Change the organization's name and billing details"},{"group": "account", "method": "POST", "path": "/api/account/password", "auth": "session", "summary": "Change your password. The current one is required"},{"group": "account", "method": "GET", "path": "/api/account/api-tokens", "auth": "session", "summary": "API tokens. Only a prefix is shown; the token itself is unrecoverable"},{"group": "account", "method": "POST", "path": "/api/account/api-tokens", "auth": "team:manage", "summary": "Create a token. The plaintext is in this response and nowhere else"},{"group": "account", "method": "DELETE", "path": "/api/account/api-tokens/:id", "auth": "session", "summary": "Revoke a token, keeping the row for the audit trail"},{"group": "account", "method": "GET", "path": "/api/account/ssh-keys", "auth": "session", "summary": "Your SSH keys and their fingerprints"},{"group": "account", "method": "POST", "path": "/api/account/ssh-keys", "auth": "session", "summary": "Add an OpenSSH public key"},{"group": "account", "method": "DELETE", "path": "/api/account/ssh-keys/:id", "auth": "session", "summary": "Remove an SSH key"},{"group": "account", "method": "GET", "path": "/api/account/notifications", "auth": "session", "summary": "Which events you are notified about"},{"group": "account", "method": "PUT", "path": "/api/account/notifications", "auth": "session", "summary": "Change your notification preferences"},{"group": "account", "method": "POST", "path": "/api/account/notifications/test", "auth": "session", "summary": "Queue a test notification"},{"group": "account", "method": "POST", "path": "/api/account/2fa/enrol", "auth": "session", "summary": "Begin two-factor enrolment and return the otpauth URI"},{"group": "account", "method": "POST", "path": "/api/account/2fa/confirm", "auth": "session", "summary": "Confirm enrolment and return the recovery codes, once"},{"group": "account", "method": "GET", "path": "/api/account/sessions", "auth": "session", "summary": "Your live sessions, with the current one marked"},{"group": "account", "method": "DELETE", "path": "/api/account/sessions/:id", "auth": "session", "summary": "Sign one session out"},{"group": "account", "method": "GET", "path": "/api/account/team", "auth": "session", "summary": "Team members and open invitations"},{"group": "account", "method": "POST", "path": "/api/account/team/invitations", "auth": "team:manage", "summary": "Invite somebody to the organization"},{"group": "account", "method": "PATCH", "path": "/api/account/team/members/:id", "auth": "team:manage", "summary": "Change a team member's organization role"},{"group": "account", "method": "DELETE", "path": "/api/account/team/members/:id", "auth": "team:manage", "summary": "Remove a member. The last owner cannot be removed"},{"group": "account", "method": "POST", "path": "/api/account/avatar", "auth": "session", "summary": "Set your avatar from an https URL"},{"group": "account", "method": "POST", "path": "/api/account/verify-email/resend", "auth": "session", "summary": "Queue another verification email"},{"group": "admin", "method": "GET", "path": "/api/admin/users", "auth": "admin:access", "summary": "Every account, ?q= to search by name or address"},{"group": "admin", "method": "GET", "path": "/api/admin/users/:id", "auth": "admin:access", "summary": "One account"},{"group": "admin", "method": "POST", "path": "/api/admin/users/:id/suspend", "auth": "admin:support", "summary": "Suspend or restore an account, revoking its sessions"},{"group": "admin", "method": "POST", "path": "/api/admin/users/:id/sessions/revoke-all", "auth": "admin:support", "summary": "Sign an account out everywhere"},{"group": "admin", "method": "POST", "path": "/api/admin/users/:id/password-reset", "auth": "admin:support", "summary": "Queue a password reset email"},{"group": "admin", "method": "POST", "path": "/api/admin/users/:id/resend-verification", "auth": "admin:support", "summary": "Queue another verification email"},{"group": "admin", "method": "POST", "path": "/api/admin/users/:id/impersonate", "auth": "admin:support", "summary": "Refused: impersonation needs a scoped, expiring session of its own"},{"group": "admin", "method": "GET", "path": "/api/admin/organizations", "auth": "admin:access", "summary": "Organizations, with live member, service and spend counts"},{"group": "admin", "method": "GET", "path": "/api/admin/staff", "auth": "admin:access", "summary": "Everybody with a staff role"},{"group": "admin", "method": "POST", "path": "/api/admin/staff", "auth": "admin:access", "summary": "Grant staff access to an existing account, by email. Superadmin only"},{"group": "admin", "method": "PATCH", "path": "/api/admin/staff/:id", "auth": "admin:access", "summary": "Grant or change a staff role. Superadmin only, never your own"},{"group": "admin", "method": "DELETE", "path": "/api/admin/staff/:id", "auth": "admin:access", "summary": "Remove staff access. Superadmin only, never your own"},{"group": "admin", "method": "GET", "path": "/api/admin/jobs", "auth": "admin:access", "summary": "Background jobs, ?status= to narrow them"},{"group": "admin", "method": "GET", "path": "/api/admin/jobs/:id", "auth": "admin:access", "summary": "One job"},{"group": "admin", "method": "POST", "path": "/api/admin/jobs/:id/cancel", "auth": "admin:servers:write", "summary": "Cancel a queued or running job"},{"group": "admin", "method": "POST", "path": "/api/admin/jobs/:id/retry", "auth": "admin:servers:write", "summary": "Queue a fresh attempt, keeping the failed one in the history"},{"group": "admin", "method": "GET", "path": "/api/admin/monitoring/alerts", "auth": "admin:access", "summary": "Open alerts, most severe first"},{"group": "admin", "method": "POST", "path": "/api/admin/monitoring/alerts/:id/acknowledge", "auth": "admin:access", "summary": "Acknowledge an alert"},{"group": "admin", "method": "GET", "path": "/api/admin/monitoring/thresholds", "auth": "admin:access", "summary": "The levels that raise a warning or a critical alert"},{"group": "admin", "method": "POST", "path": "/api/admin/monitoring/thresholds", "auth": "admin:servers:write", "summary": "Add a threshold"},{"group": "admin", "method": "PATCH", "path": "/api/admin/monitoring/thresholds/:id", "auth": "admin:servers:write", "summary": "Change a threshold"},{"group": "admin", "method": "GET", "path": "/api/admin/dns/zones", "auth": "admin:access", "summary": "DNS zones this platform manages"},{"group": "admin", "method": "GET", "path": "/api/admin/dns/routes", "auth": "admin:access", "summary": "What the edge proxy serves for each hostname"},{"group": "admin", "method": "POST", "path": "/api/admin/dns/resync", "auth": "admin:servers:write", "summary": "Rebuild the routing table from the domains that exist"},{"group": "admin", "method": "GET", "path": "/api/admin/settings/:id", "auth": "admin:access", "summary": "One section of the platform settings"},{"group": "admin", "method": "PUT", "path": "/api/admin/settings/:id", "auth": "admin:servers:write", "summary": "Save a section of the platform settings"},{"group": "admin", "method": "PATCH", "path": "/api/admin/settings/flags/:id", "auth": "admin:servers:write", "summary": "Turn a feature flag on or off"},{"group": "admin", "method": "POST", "path": "/api/admin/settings/smtp/test", "auth": "admin:servers:write", "summary": "Queue a test message through the configured relay"},{"group": "admin", "method": "GET", "path": "/api/admin/audit", "auth": "admin:access", "summary": "The platform audit trail, ?actor= to narrow it"},{"group": "admin", "method": "GET", "path": "/api/admin/coupons", "auth": "admin:billing:write", "summary": "Coupons and how often each has been redeemed"},{"group": "admin", "method": "POST", "path": "/api/admin/coupons", "auth": "admin:billing:write", "summary": "Create a coupon"},{"group": "admin", "method": "PATCH", "path": "/api/admin/coupons/:id", "auth": "admin:billing:write", "summary": "Change a coupon"},{"group": "admin", "method": "GET", "path": "/api/admin/reports/revenue", "auth": "admin:billing:write", "summary": "Paid revenue by month, and the recurring total"},{"group": "admin", "method": "GET", "path": "/api/admin/servers/:id/instances", "auth": "admin:access", "summary": "The services placed on one server"},{"group": "admin", "method": "POST", "path": "/api/admin/status/incidents", "auth": "admin:support", "summary": "Open an incident with its first update"},{"group": "admin", "method": "PUT", "path": "/api/admin/catalog/services/:id/versions", "auth": "admin:servers:write", "summary": "Replace a service type's version list"},{"group": "admin", "method": "GET", "path": "/api/admin/catalog/plans", "auth": "admin:billing:write", "summary": "Every plan, including ones taken off sale"},{"group": "mail", "method": "GET", "path": "/api/mail/domains", "auth": "services:read", "summary": "Mail domains, with live mailbox, alias and 30-day volume counts"},{"group": "mail", "method": "POST", "path": "/api/mail/domains", "auth": "services:write", "summary": "Host a domain and write the four DNS records it needs"},{"group": "mail", "method": "GET", "path": "/api/mail/domains/:domain", "auth": "services:read", "summary": "One domain and its DNS records"},{"group": "mail", "method": "POST", "path": "/api/mail/domains/:domain/verify", "auth": "services:write", "summary": "Re-check the DNS records"},{"group": "mail", "method": "GET", "path": "/api/mail/domains/:domain/mailboxes", "auth": "services:read", "summary": "Mailboxes on the domain"},{"group": "mail", "method": "POST", "path": "/api/mail/:domain/mailboxes", "auth": "services:write", "summary": "Create a mailbox, within the plan's quota"},{"group": "mail", "method": "PATCH", "path": "/api/mail/:domain/mailboxes/:id", "auth": "services:write", "summary": "Change a mailbox's name, quota or autoresponder"},{"group": "mail", "method": "DELETE", "path": "/api/mail/:domain/mailboxes/:id", "auth": "services:write", "summary": "Delete a mailbox"},{"group": "mail", "method": "GET", "path": "/api/mail/domains/:domain/aliases", "auth": "services:read", "summary": "Aliases on the domain"},{"group": "mail", "method": "POST", "path": "/api/mail/:domain/aliases", "auth": "services:write", "summary": "Create an alias or a catch-all"},{"group": "mail", "method": "PATCH", "path": "/api/mail/:domain/aliases/:id", "auth": "services:write", "summary": "Change where an alias delivers"},{"group": "mail", "method": "DELETE", "path": "/api/mail/:domain/aliases/:id", "auth": "services:write", "summary": "Delete an alias"},{"group": "mail", "method": "GET", "path": "/api/mail/domains/:domain/smtp", "auth": "services:read", "summary": "SMTP relay credentials. Password masked unless ?reveal=true"},{"group": "mail", "method": "PATCH", "path": "/api/mail/:domain/smtp", "auth": "admin:support", "summary": "Change the sending limits. Staff only - they are the abuse control"},{"group": "mail", "method": "POST", "path": "/api/mail/:domain/smtp/rotate", "auth": "services:write", "summary": "Issue a new SMTP password, returned once in the clear"},{"group": "mail", "method": "POST", "path": "/api/mail/:domain/dkim/rotate", "auth": "services:write", "summary": "Generate a new DKIM key. The record returns to pending"},{"group": "mail", "method": "GET", "path": "/api/mail/domains/:domain/deliverability", "auth": "services:read", "summary": "DKIM age, bounce and complaint rates, and daily send volume"},{"group": "mail", "method": "PATCH", "path": "/api/admin/mail/:domainId", "auth": "admin:support", "summary": "Mark a domain verified"},{"group": "mail", "method": "POST", "path": "/api/admin/mail/:domainId/suspend-sending", "auth": "admin:support", "summary": "Stop a domain sending"},{"group": "billing", "method": "GET", "path": "/api/billing/overview", "auth": "billing:read", "summary": "Balance, credit, commitment and spend by month"},{"group": "billing", "method": "GET", "path": "/api/billing/subscriptions", "auth": "billing:read", "summary": "The organization's subscriptions"},{"group": "billing", "method": "POST", "path": "/api/billing/subscriptions/:id/cancel", "auth": "billing:write", "summary": "Stop a subscription renewing"},{"group": "billing", "method": "POST", "path": "/api/billing/subscriptions/:id/plan", "auth": "billing:write", "summary": "Move a subscription to another plan"},{"group": "billing", "method": "GET", "path": "/api/billing/invoices", "auth": "billing:read", "summary": "Invoices with their lines"},{"group": "billing", "method": "GET", "path": "/api/billing/invoices/:id", "auth": "billing:read", "summary": "One invoice"},{"group": "billing", "method": "POST", "path": "/api/billing/invoices/:id/pdf", "auth": "billing:read", "summary": "A link to the invoice document"},{"group": "billing", "method": "GET", "path": "/api/billing/payment-methods", "auth": "billing:read", "summary": "Payment methods. No chargeable detail is stored here"},{"group": "billing", "method": "POST", "path": "/api/billing/payment-methods", "auth": "billing:write", "summary": "Register a method the payment provider has already authorised"},{"group": "billing", "method": "POST", "path": "/api/billing/payment-methods/:id/default", "auth": "billing:write", "summary": "Make a method the default, demoting the others"},{"group": "billing", "method": "DELETE", "path": "/api/billing/payment-methods/:id", "auth": "billing:write", "summary": "Remove a method, unless it is the last one and something is billed"},{"group": "billing", "method": "POST", "path": "/api/billing/credits/redeem", "auth": "billing:write", "summary": "Redeem a coupon into account credit"},{"group": "billing", "method": "GET", "path": "/api/admin/subscriptions", "auth": "admin:billing:write", "summary": "Every subscription, across organizations"},{"group": "billing", "method": "PATCH", "path": "/api/admin/subscriptions/:id", "auth": "admin:billing:write", "summary": "Set a subscription's status"},{"group": "billing", "method": "GET", "path": "/api/admin/invoices", "auth": "admin:billing:write", "summary": "Every invoice, across organizations"},{"group": "billing", "method": "POST", "path": "/api/admin/invoices/:id/mark-paid", "auth": "admin:billing:write", "summary": "Mark an invoice paid"},{"group": "billing", "method": "POST", "path": "/api/admin/invoices/:id/refund", "auth": "admin:billing:write", "summary": "Refund an invoice and credit the account"},{"group": "billing", "method": "POST", "path": "/api/admin/invoices/:id/credit-note", "auth": "admin:billing:write", "summary": "Issue a credit note and credit the account"},{"group": "apps", "method": "GET", "path": "/api/apps", "auth": "services:read", "summary": "The organization's applications"},{"group": "apps", "method": "POST", "path": "/api/apps", "auth": "services:write", "summary": "Create an application and, optionally, its first domain"},{"group": "apps", "method": "GET", "path": "/api/apps/:id", "auth": "services:read", "summary": "One application, with its build settings and limits"},{"group": "apps", "method": "PATCH", "path": "/api/apps/:appId", "auth": "services:write", "summary": "Rename an application or change its repository and branch"},{"group": "apps", "method": "DELETE", "path": "/api/apps/:appId", "auth": "services:write", "summary": "Remove the container and the application"},{"group": "apps", "method": "PATCH", "path": "/api/apps/:appId/build", "auth": "services:write", "summary": "Change how the application is built and started"},{"group": "apps", "method": "PATCH", "path": "/api/apps/:appId/runtime", "auth": "services:write", "summary": "Change replica count and resource limits"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/restart", "auth": "services:write", "summary": "Restart the application's container"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/stop", "auth": "services:write", "summary": "Stop the application's container"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/start", "auth": "services:write", "summary": "Start a stopped application"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/rebuild", "auth": "services:write", "summary": "Recreate the container from the row, keeping the code volume"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/webhook", "auth": "services:read", "summary": "The URL a forge posts to when the repository changes"},{"group": "apps", "method": "POST", "path": "/api/apps/:id/webhook/rotate", "auth": "services:write", "summary": "Issue a new webhook URL and retire the old one"},{"group": "apps", "method": "POST", "path": "/api/apps/:id/webhook/:token", "auth": "none", "summary": "What a forge calls on a push. The token in the path is the authentication"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/logs", "auth": "services:read", "summary": "The container's log. ?tail=n for the first read, ?since=<timestamp> for what came after"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/console", "auth": "services:write", "summary": "Run one command inside the container and answer with its output"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/transfer", "auth": "admin:servers:write", "summary": "Move an application to another organization"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/deployments", "auth": "services:read", "summary": "Deployment history, newest first"},{"group": "apps", "method": "POST", "path": "/api/apps/:id/deployments", "auth": "services:write", "summary": "Start a deployment. Recorded as building until a builder finishes it"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/deployments/:deploymentId", "auth": "services:read", "summary": "One deployment, with the log of what it printed"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/deployments/:deploymentId/rollback", "auth": "services:write", "summary": "Promote an earlier successful deployment back to live"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/domains", "auth": "services:read", "summary": "Hostnames attached to the application"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/domains", "auth": "services:write", "summary": "Attach a hostname. Globally unique across every application"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/domains/:domainId/primary", "auth": "services:write", "summary": "Promote a hostname to primary, demoting the others"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/domains/:domainId/verify", "auth": "services:write", "summary": "Re-check who owns a domain, and serve it once proved"},{"group": "apps", "method": "DELETE", "path": "/api/apps/:appId/domains/:domainId", "auth": "services:write", "summary": "Detach a hostname"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/env", "auth": "services:read", "summary": "Environment variables. Secrets masked unless ?reveal=true"},{"group": "apps", "method": "PUT", "path": "/api/apps/:appId/env", "auth": "services:write", "summary": "Replace the environment. Absent keys are removed"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/processes", "auth": "services:read", "summary": "Web, worker and cron processes"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/processes", "auth": "services:write", "summary": "Add a process"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/storage", "auth": "services:read", "summary": "Persistent volumes and their usage"},{"group": "apps", "method": "POST", "path": "/api/apps/:appId/volumes", "auth": "services:write", "summary": "Attach a persistent volume"},{"group": "apps", "method": "PATCH", "path": "/api/apps/:appId/volumes/:volumeId", "auth": "services:write", "summary": "Resize a volume"},{"group": "apps", "method": "GET", "path": "/api/apps/:id/metrics", "auth": "services:read", "summary": "Chart series, sampled from the engine on each request"},{"group": "databases", "method": "GET", "path": "/api/databases", "auth": "services:read", "summary": "The organization's database instances"},{"group": "databases", "method": "POST", "path": "/api/databases", "auth": "services:write", "summary": "Provision an instance: a row, then a real container, then the row updated from it"},{"group": "databases", "method": "GET", "path": "/api/databases/:id", "auth": "services:read", "summary": "One instance, with its exposure, backup policy and endpoint"},{"group": "databases", "method": "DELETE", "path": "/api/databases/:id", "auth": "services:write", "summary": "Remove the container and the instance"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/restart", "auth": "services:write", "summary": "Restart the instance's container"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/stop", "auth": "services:write", "summary": "Stop the instance's container"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/resize", "auth": "services:write", "summary": "Move the instance to another plan"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/upgrade", "auth": "services:write", "summary": "Take a pre-upgrade backup and record the new engine version"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/wipe", "auth": "services:write", "summary": "Destroy the container and its data. The instance name confirms it"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/rebuild", "auth": "services:write", "summary": "Recreate the container from the row, keeping the data. Applies a new plan's limits and publishes a port"},{"group": "databases", "method": "GET", "path": "/api/databases/:id/credentials", "auth": "services:read", "summary": "Endpoint, users and connection strings. Every password is masked here"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/credentials/:userId/reveal", "auth": "services:write", "summary": "Hand over a password once. A second request is refused"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/credentials/:userId/rotate", "auth": "services:write", "summary": "Change the password in the engine and issue it once in the clear"},{"group": "databases", "method": "GET", "path": "/api/databases/:id/logs", "auth": "services:read", "summary": "The container's log. ?tail=n for the first read, ?since=<timestamp> for what came after"},{"group": "databases", "method": "GET", "path": "/api/databases/:id/backups", "auth": "services:read", "summary": "Backups, newest first"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/backups", "auth": "services:write", "summary": "Take a backup now"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/backups/:backupId/restore", "auth": "services:write", "summary": "Restore the instance from a backup"},{"group": "databases", "method": "POST", "path": "/api/databases/:id/backups/:backupId/download", "auth": "services:read", "summary": "A link to the backup artefact rather than the bytes themselves"},{"group": "databases", "method": "PUT", "path": "/api/databases/:id/backups/schedule", "auth": "services:write", "summary": "Change the backup schedule and retention"},{"group": "databases", "method": "GET", "path": "/api/databases/:id/metrics", "auth": "services:read", "summary": "Chart series, sampled from the engine on each request"},{"group": "databases", "method": "PUT", "path": "/api/databases/:id/config", "auth": "services:write", "summary": "Replace the engine configuration overrides"},{"group": "databases", "method": "PUT", "path": "/api/databases/:id/networking", "auth": "services:write", "summary": "Set exposure: private, an allowlist of CIDRs, or a public port"},{"group": "tickets", "method": "GET", "path": "/api/tickets", "auth": "session", "summary": "Your organization's tickets, newest activity first"},{"group": "tickets", "method": "POST", "path": "/api/tickets", "auth": "tickets:write", "summary": "Open a ticket with its first message"},{"group": "tickets", "method": "GET", "path": "/api/tickets/:id", "auth": "session", "summary": "One ticket and its thread. Internal notes only for staff"},{"group": "tickets", "method": "POST", "path": "/api/tickets/:id/replies", "auth": "tickets:write", "summary": "Reply to a ticket"},{"group": "tickets", "method": "POST", "path": "/api/tickets/:id/notes", "auth": "admin:support", "summary": "Add an internal note the customer never sees"},{"group": "tickets", "method": "POST", "path": "/api/tickets/:id/status", "auth": "tickets:write", "summary": "Move a ticket between states"},{"group": "tickets", "method": "POST", "path": "/api/tickets/:id/assign", "auth": "admin:support", "summary": "Assign a ticket to a member of staff"},{"group": "tickets", "method": "POST", "path": "/api/tickets/:id/attachments", "auth": "tickets:write", "summary": "Refused: uploads need multipart parsing and object storage"},{"group": "tickets", "method": "GET", "path": "/api/admin/tickets", "auth": "admin:support", "summary": "The whole support queue, across every organization"},{"group": "tickets", "method": "GET", "path": "/api/admin/departments", "auth": "session", "summary": "The departments a ticket can be opened against"},{"group": "tickets", "method": "POST", "path": "/api/admin/departments", "auth": "admin:support", "summary": "Create a department"},{"group": "tickets", "method": "PATCH", "path": "/api/admin/departments/:id", "auth": "admin:support", "summary": "Rename a department or change its address"},{"group": "catalog", "method": "GET", "path": "/api/catalog/services", "auth": "none", "summary": "Every service type on offer, with its versions and companion add-ons"},{"group": "catalog", "method": "GET", "path": "/api/catalog/plans", "auth": "none", "summary": "Plans and prices, ?family=database|mail|application to narrow them"},{"group": "catalog", "method": "GET", "path": "/api/catalog/addons", "auth": "none", "summary": "Metered add-ons and their unit prices"},{"group": "catalog", "method": "GET", "path": "/api/admin/catalog/templates", "auth": "admin:access", "summary": "Compose templates, each with a live count of the instances built from it"},{"group": "catalog", "method": "POST", "path": "/api/admin/catalog/templates", "auth": "admin:servers:write", "summary": "Create a compose template"},{"group": "catalog", "method": "GET", "path": "/api/admin/catalog/templates/:id/body", "auth": "admin:access", "summary": "A template's compose file, as text"},{"group": "catalog", "method": "POST", "path": "/api/admin/catalog/templates/:id/versions", "auth": "admin:servers:write", "summary": "Save a new version of a template's compose file"},{"group": "catalog", "method": "POST", "path": "/api/admin/catalog/plans", "auth": "admin:billing:write", "summary": "Add a plan to the catalogue"},{"group": "catalog", "method": "PATCH", "path": "/api/admin/catalog/plans/:id", "auth": "admin:billing:write", "summary": "Change a plan's resources or price, or take it off sale"},{"group": "catalog", "method": "PATCH", "path": "/api/admin/catalog/services/:id", "auth": "admin:servers:write", "summary": "Enable or disable a service type"},{"group": "servers", "method": "GET", "path": "/api/admin/servers", "auth": "admin:access", "summary": "The server inventory, paged"},{"group": "servers", "method": "POST", "path": "/api/admin/servers", "auth": "admin:servers:write", "summary": "Add a server and probe its Docker engine straight away"},{"group": "servers", "method": "GET", "path": "/api/admin/servers/:id", "auth": "admin:access", "summary": "One server, with its last probe result"},{"group": "servers", "method": "PATCH", "path": "/api/admin/servers/:id", "auth": "admin:servers:write", "summary": "Change a server's hostname, region or notes"},{"group": "servers", "method": "DELETE", "path": "/api/admin/servers/:id", "auth": "admin:servers:write", "summary": "Remove a server from the inventory"},{"group": "servers", "method": "POST", "path": "/api/admin/servers/:id/connection-test", "auth": "admin:access", "summary": "Ask the server's Docker engine who it is, and record what it says"},{"group": "servers", "method": "GET", "path": "/api/admin/servers/:id/connection-test", "auth": "admin:access", "summary": "The same probe, as a GET, for a browser opening the URL directly"},{"group": "servers", "method": "POST", "path": "/api/admin/servers/:id/drain", "auth": "admin:servers:write", "summary": "Stop new placements on a server. What is already running keeps running"},{"group": "instances", "method": "GET", "path": "/api/admin/docker/info", "auth": "admin:access", "summary": "The local Docker engine: version, host, cores, memory and container counts"},{"group": "instances", "method": "GET", "path": "/api/admin/instances", "auth": "admin:access", "summary": "Every container the local engine knows, running or not"},{"group": "instances", "method": "GET", "path": "/api/admin/instances/:id", "auth": "admin:access", "summary": "One container: image, state, start time and exit code"},{"group": "instances", "method": "GET", "path": "/api/admin/instances/:id/logs", "auth": "admin:access", "summary": "The tail of a container's log, ?tail=n lines (200 by default)"},{"group": "instances", "method": "GET", "path": "/api/admin/instances/:id/stats", "auth": "admin:access", "summary": "One sample of a container's CPU, memory and network counters"},{"group": "instances", "method": "POST", "path": "/api/admin/instances/:id/start", "auth": "admin:servers:write", "summary": "Start a container"},{"group": "instances", "method": "POST", "path": "/api/admin/instances/:id/stop", "auth": "admin:servers:write", "summary": "Stop a container, with a grace period before the kill"},{"group": "instances", "method": "POST", "path": "/api/admin/instances/:id/restart", "auth": "admin:servers:write", "summary": "Restart a container"}]}