API

Servers

Register and operate servers through the SDK or REST API.

Servers are the hosts where Synq builds and runs applications. Register SSH connection details, check required components, and install what the target needs. Server administration requires the relevant permissions and host execution policy. These operations are self-hosted only.

Register a server

A server is an SSH target you deploy onto. Responses never include SSH secrets — passwords and key passphrases are encrypted at rest and only decrypted inside the SSH client. See the custom servers guide.

const result = await ship.servers.create({
  sshHost: "203.0.113.10",
  sshUser: "root",
  sshAuthMethod: "agent",
});
console.log(result);
curl -X POST "$SYNQ_URL/api/system/servers" \
  -H "Authorization: Bearer $SYNQ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sshHost":"203.0.113.10","sshUser":"root","sshAuthMethod":"agent"}'

Prop

Type

PATCH /api/system/servers/:id takes the same fields, all optional — only the keys you send are changed. It also takes buildServer (boolean): "Can build for other servers", which lets projects deployed on other servers build their images here (see Build on another server). Every server returned by the API carries buildServer.

It also takes publicHostname (string, or null / "" to clear): the server's connection hostname, the DNS name database URLs, published-port addresses and SSH tunnel commands use instead of its IP address. Only an owner or admin can change it. It must be a DNS name with a dot in it, with no scheme, port, path or IP address; anything else answers 400 with code: "INVALID_PUBLIC_HOSTNAME" and a message saying why. Synq stores it lowercased and does not check where it points. Every server returned by the API carries publicHostname (null when not set). See Which host the address uses.

await ship.servers.update("srv_123", { publicHostname: "db.example.com" });

Server health check & install

const health = await ship.servers.check("srv_123", { components: ["docker"] });
console.log(health.ready, health.missing);
curl -X POST "$SYNQ_URL/api/system/check" \
  -H "Authorization: Bearer $SYNQ_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"serverId":"srv_123","components":["docker"]}'

Test a connection before saving, check what a saved server has installed, then install or remove components. These routes identify the server by serverId in the body (not a URL param), and each handler runs its own per-server server:admin (or server:read) check.

POST /api/system/test-connection opens an ephemeral SSH connection from body credentials and returns { ok, message } — nothing is persisted. It requires the caller be an org owner/admin.

Prop

Type

Returns { components, ready, missing }.

Prop

Type

POST /api/system/remove mirrors install for a single removable component. POST /api/system/install/stream takes { serverId, components: string[], config? } and returns a Server-Sent Events stream (progress, log, complete, end); it returns 409 install_in_progress if a session is already running.

SSE, not JSON

install/stream and monitor/stream are event streams. Read GET /api/system/install/session to poll a running session's state instead, or GET /api/system/install/stream?id=<sessionId> to re-attach after a page reload.

GET /api/system/monitor/stream?serverId=<id> emits a stats event every few seconds with CPU %, memory, disk, uptime, and load average gathered over SSH — synq server monitor <serverId>.

Per-server rate limiting

Read or update the OpenResty request rate limit for a server. OpenResty on the target server is the source of truth; the API parses and rewrites its ratelimit.conf.

PATCH /api/system/servers/:id/rate-limit

Prop

Type

Port-forward tunnels

Desktop mode only. Forward a remote server port to localhost on the operator's machine, VS Code style. Every handler additionally asserts desktop mode (an API started with DEPLOY_MODE=desktop, as desktop app versions up to 1.2.5 ran on your computer); on any other instance they refuse. The current desktop app only opens a panel, so it offers no port forwarding.

POST /api/system/servers/:id/tunnels

Prop

Type

Start / stop / delete a saved tunnel with POST .../tunnels/:tunnelId/start, .../stop, and DELETE .../tunnels/:tunnelId. A started tunnel returns the actually-bound localPort and a http://localhost:<port> URL.

Server clusters and private networking

On a self-hosted Synq instance, private networks connect 2–16 registered Linux servers over an existing private IPv4 network or a managed WireGuard mesh. Read ship.servers.networkCapabilities() for the available provider profiles and your management permissions. Local and desktop self-hosted controllers support network inventory and manual network checks. A hosted cloud (switched off in Synq) does not offer this infrastructure management.

Compute clusters are separate records that group selected servers on an existing private network. Use the *Network methods and /api/system/networks for networking, and *ComputeCluster methods and /api/system/compute-clusters for those groups. The older *Cluster methods and /api/system/clusters URLs remain compatibility aliases for private networks.

For existing networks, create saves configuration; verify starts a separate, persisted operation. Reuse the same requestId when retrying an unchanged creation request. Update, verify, and remove require the network's current revision. Concurrent edits return a conflict, and active verification blocks configuration changes.

const network = await ship.servers.createNetwork({
  requestId: crypto.randomUUID(),
  name: "Production EU",
  network: {
    mode: "native",
    cidrs: ["10.20.0.0/24"],
    mtu: 1400,
    probePort: 51821,
  },
  members: [
    { serverId: "srv_a", providerId: "hetzner-dedicated", privateIp: "10.20.0.2" },
    { serverId: "srv_b", providerId: "hetzner-dedicated", privateIp: "10.20.0.3" },
  ],
});
const verification = await ship.servers.verifyNetwork({
  networkId: network.id,
  revision: network.revision,
});
console.log(verification.id, verification.status);

Subscribe to the read-only SSE endpoint GET /api/system/networks/stream for verification progress, including after reconnecting. Use ship.servers.getNetwork({ networkId }) to read a saved snapshot. Reports contain per-direction TCP, UDP, MTU, UDP round-trip latency, packet loss, and jitter results. Managed WireGuard reports also contain per-peer handshake observations. Hosts need Linux, Python 3, iproute2, a persistent machine identity, and working private interfaces and routes. The chosen probe port must permit TCP and UDP between members. The inspector ship.servers.inspectNetwork(serverId) reads interfaces without configuring them.

Temporary authenticated listeners bind to the selected private addresses and expire locally if cleanup loses contact. Runs expire after four minutes; successful observations are considered stale after fifteen minutes. The probe tests its selected port and packet size. Encryption and application-port access are not verified.

After a verification has finished, optionally measure a selected connection in both directions using the same endpoint:

const network = await ship.servers.getNetwork({ networkId: "network_id" });
const speedTest = await ship.servers.verifyNetwork({
  networkId: network.id,
  revision: network.revision,
  speedTest: { sourceServerId: "srv_a", targetServerId: "srv_b" },
});

Speed tests first check connectivity, then transfer at most 32 MiB or for three seconds per direction. report.throughput records receiver-confirmed bytes, elapsed time, and Mbps, or a specific transfer error. Ordinary verification does not send bulk traffic. Both servers must belong to the cluster; a different test cannot start while a verification is active. Repeating an active request for the same pair reuses its run. Progress and final results use the same SSE stream.

Cluster reads require fleet-wide server read access. Management requires fleet-wide server admin access, with each member also authorized. Removing a native cluster removes its inventory records; servers and externally managed networks remain. Managed networks use the reviewed cleanup flow below. A member must leave its cluster and settle any operation before its server entry can be removed. Clusters are not yet deployment targets. Provider API/VLAN provisioning, private service endpoints, placement/replicas, and shared storage remain separate capabilities.

Managed private networks

Managed networking creates an encrypted WireGuard mesh with automatically allocated private addresses. Start server preparation to check infrastructure, install missing tools, and create a reviewable plan:

const preparation = await ship.servers.prepareManagedNetwork({
  requestId: crypto.randomUUID(),
  name: "Production mesh",
  members: [
    { serverId: "srv_a", providerId: "hetzner-dedicated" },
    { serverId: "srv_b", providerId: "custom" },
  ],
});
console.log(preparation.id, preparation.status, preparation.hosts);

for await (const event of ship.servers.managedNetworkPreparationEvents(preparation.id)) {
  if (event.event === "snapshot") {
    const { run } = JSON.parse(event.data);
    console.log(run.sequence, run.status, run.hosts);
  }
}

The subscription sends a complete saved snapshot on connect and whenever progress changes, then complete before closing for a settled attempt. The dashboard reconnects with backoff after a dropped connection. SDK callers can reattach using the same method; a reconnect never starts work. Replace local state with each snapshot instead of appending its logs. The monotonic sequence also protects against late responses.

ship.servers.getManagedNetworkPreparation({ preparationId }) remains available for a single saved-state read. When its status is ready, use its operationId to read the network plan. Retry a failed or interrupted preparation by calling prepareManagedNetwork with the same input and request ID. Already healthy tools are checked and reused. listManagedNetworkPreparations() lists recent work that still needs attention or review. No tunnel changes start during preparation.

To discard a stopped preparation, call discardManagedNetworkPreparation({ preparationId, sequence }) with its latest progress sequence. An unapplied plan can be discarded with discardManagedNetworkPlan({ operationId, planHash }). Both require fleet administration. The preparation and any unapplied plan close in one transaction and disappear from pending setup; existing servers, services, and installed tools are retained. Cancelled records remain readable for diagnostics and prevent late retries from reviving discarded work. Active preparation must finish first.

To remove one server from an unfinished initial cluster setup, call removeManagedNetworkPreparationMember({ preparationId, serverId, sequence, requestId }). For an initial network operation, use removeManagedNetworkOperationMember({ operationId, serverId, sequence, planHash, requestId }). At least two servers must remain. Use a new UUID for requestId, then reuse it if the response is lost. A different selection requires a different request. Both methods require fleet administration and return { preparation, operation }. The original records link to the replacement through replacementPreparationId; settings and diagnostics remain available, and the original request cannot resume.

Before network apply, removal cancels the old selection and saves the remaining servers in a paused (pending) preparation. After a partial apply, it also has a cleanupOperationId. Synq reuses rollback to restore this attempt's network changes on all original hosts, including peer entries for the removed server. The server, its workloads, disks, other networks, and shared installed tools remain. The pending preparation stream stays open while cleanup runs; subscribe to the cleanup operation for per-host progress. An unreachable or externally modified host keeps cleanup and reservations open. Retry that operation with action: "rollback" after resolving the problem. Once all hosts acknowledge rollback, preparation remains paused. Explicitly call prepareManagedNetwork with the replacement's saved input to retry; it rejects the request until cleanup is complete. Removal, cleanup retries, and stream reconnection do not start preparation. The resulting network plan always requires a fresh review and apply. Established clusters use their existing reviewed membership-change workflow.

For hosts that already meet the prerequisites, planManagedNetwork accepts the same input and performs read-only inspection without installing packages.

After review, pass that operation ID and hash to ship.servers.applyManagedNetwork({ operationId, planHash, action: "apply" }). Plans expire after fifteen minutes and reject changes to the cluster revision, host identities, or inspected networking. Subscribe with ship.servers.managedNetworkOperationEvents(operationId) for durable progress; getManagedNetworkOperation({ operationId }) provides a single state read. The same operation supports action: "resume" or action: "rollback" after an interruption. Active work is idempotent and cannot be started twice. Once network changes have started, discard is blocked. Use action: "rollback" to clean up an unfinished new cluster or restore an existing cluster's previous network. Every host must acknowledge cleanup before inventory and reservations are released. An unreachable host keeps recovery open; retry rollback when access is restored. A restored existing cluster can then use the reviewed removal flow.

ship.servers.clusterEvents() streams overview snapshots containing clusters and preparations. All three subscription methods accept { signal } to disconnect a viewer without cancelling setup. Streams use saved database state, validate fleet read permission again during the subscription, and reconcile every fifteen seconds to detect another controller's updates and expired worker leases.

Hosts require Linux with WireGuard kernel support, Python 3.8+, iproute2, systemd, and root or passwordless sudo. Preparation automatically installs missing Python 3.8+, iproute2 (4.15+), and WireGuard tools (1.0+) through the shared toolchain. It verifies installation before inspection. Kernel, init-system, and privilege problems stop at a named step; Synq does not replace kernels or reboot hosts. Installed tools remain installed if the later network operation rolls back. Supported firewalls are no active host firewall, raw iptables, or nftables with standard inet filter input/output chains and no additional filtering IPv4 input/output base chains. UFW, firewalld, and unsupported nftables layouts fail inspection. Provider firewalls must allow the reviewed transport ports (default 51820/UDP). Transport uses reachable IPv4 endpoints with no relay or automatic NAT traversal. IPv6 SSH management works when explicit IPv4 transport endpoints are supplied. Preparation checks local prerequisites and routes; it does not prove UDP access between hosts. After Apply, the transport step stages WireGuard endpoints and owned host firewall rules. The handshake step tests every peer before configure assigns private addresses and routes. Failures retain per-peer endpoints and ports and restore the previous configuration. Provider firewall or NAT changes require administrator action before an explicit retry.

Private keys stay on their hosts. Each host has a persistent twenty-minute rollback timer, so incomplete setup can restore even if the controller disconnects or the host reboots. Synq changes only its own interface, peer routes, and firewall rules. The transport stage uses the same receipt and rollback timer; successful promotion preserves the verified interface and keys. Handshakes and every directed TCP/UDP/MTU check must succeed before commit. Committed networking restarts locally without the controller. Unreachable or externally edited hosts retain their claims until recovery is confirmed.

For managed edits, include clusterId and revision in a new plan. Membership, transport endpoints/ports, MTU, and rotateKeys can change; existing addresses and the allocated subnet remain stable. To remove a managed cluster, plan with intent: "remove" and review its host cleanup before applying. These network operations do not drain workloads or migrate their data.

Compute clusters

Create a compute cluster by selecting servers already attached to a private network. The network and compute-cluster memberships are independent. Reuse the same requestId to retry an unchanged create request; updates and removals require the compute cluster's current revision.

const cluster = await ship.servers.createComputeCluster({
  requestId: crypto.randomUUID(),
  name: "Production EU",
  networkId: "network_id",
  serverIds: ["srv_a", "srv_b"],
});
console.log(cluster.id, cluster.networkId, cluster.serverIds);

removeComputeCluster({ clusterId, revision }) removes this grouping and retains its servers and private network. ship.servers.infrastructure(serverId) reports the networks and compute cluster associated with a server.

Managed K3s setup

Creating a pool does not install software. Start its separate runtime operation after connecting the selected servers to their private network:

const runtime = await ship.servers.setupClusterRuntime({
  clusterId: "cluster_id",
  revision: 1,
  requestId: crypto.randomUUID(),
});
console.log(runtime.status);

const abort = new AbortController();
for await (const event of ship.servers.clusterRuntimeEvents("cluster_id", { signal: abort.signal })) {
  console.log(event.data);
  abort.abort(); // Close the subscription when leaving the setup view.
  break;
}

Setup installs missing tools, pins and checksum-verifies K3s, configures private host firewall rules, joins the servers, and checks actual pod traffic, Services and DNS. One control server is used for one/two-member pools; larger pools use three controls and additional workers. Initial support requires Linux amd64/arm64, systemd, root or passwordless sudo, disabled swap, and unfiltered or raw iptables host firewalls. Provider private-network ACLs remain the operator's responsibility; the dashboard lists exact private peer ports. These ports should not be exposed publicly.

Read saved progress with getClusterRuntime({ clusterId }); it returns null before setup. Retry an interrupted or failed operation explicitly using retryClusterRuntime({ clusterId, sequence }). The retry retains the pinned version/configuration and reconciles host state. Reconnecting to SSE never starts or retries installation. Runtime streams remain open to observe later changes; cancel them when leaving the page. Snapshots contain dated verification, not continuous workload monitoring.

removeClusterRuntime({ clusterId, sequence }) starts owned cleanup. Application workloads, persistent volumes and additional operators must be removed first. Cleanup preserves the private network and existing Docker applications, and can resume after a partial removal. Removing the pool or changing its members/network is blocked while a runtime remains installed or unfinished.

This prepares Kubernetes infrastructure. Cluster deployment targets, database operators, persistent storage and Edge routing are subsequent integrations; existing project deployments continue using their current runtime.

Operations

Managed containers

OperationSDKREST API
Apply a managed container configuration.servers.applyContainer(id, input, options?)POST /api/system/servers/:id/containers/:component/apply/stream
server:write · Self-hosted
Stream a managed-container apply session.servers.containerApplyEvents(id, input, options?)GET /api/system/servers/:id/containers/:component/apply/stream
server:read · Self-hosted
List managed containers across accessible servers.servers.listAllContainers()GET /api/system/containers
server:read · Self-hosted
Refresh managed-container state across accessible servers.servers.scanAllContainers()POST /api/system/containers/scan
server:write · Self-hosted
List managed containers with available updates.servers.containersBehind()GET /api/system/containers/behind
server:read · Self-hosted
List managed-container health or configuration issues.servers.containerIssues()GET /api/system/containers/issues
server:read · Self-hosted
Read currently active container apply sessions.servers.applyingContainers()GET /api/system/containers/applying
server:read · Self-hosted
Apply requested managed-container changes across servers.servers.applyAllContainers(input?)POST /api/system/containers/apply-all
server:write · Self-hosted
List one server’s managed containers.servers.listContainers(id)GET /api/system/servers/:id/containers
server:read · Self-hosted
Refresh one server’s managed-container state.servers.scanContainers(id)POST /api/system/servers/:id/containers/scan
server:write · Self-hosted
Read a container’s active apply session.servers.containerApplySession(id, input)GET /api/system/servers/:id/containers/:component/apply/session
server:read · Self-hosted

Components and installation

OperationSDKREST API
Read an installation session.servers.getInstallSession(input?)GET /api/system/install/session
server:read · Self-hosted
Answer a pending installation prompt.servers.respondToInstall(input)POST /api/system/install/respond
server:admin · Self-hosted
Submit installation of selected components.servers.installComponents(id, input, options?)POST /api/system/install/stream
server:admin · Self-hosted
Stream installation progress.servers.installEvents(input?, options?)GET /api/system/install/stream
server:read · Self-hosted
List the server’s managed components.servers.listModules(id)GET /api/system/servers/:id/modules
server:read · Self-hosted
Refresh managed-component state.servers.scanModules(id)POST /api/system/servers/:id/modules/scan
server:write · Self-hosted
Apply a managed component’s configuration.servers.applyModule(id, input)POST /api/system/servers/:id/modules/:module/apply
server:write · Self-hosted
Install one managed component.servers.installComponent(id, input)POST /api/system/install
server:admin · Self-hosted
Remove a managed component.servers.removeComponent(id, input)POST /api/system/remove
server:admin · Self-hosted

Server lifecycle

OperationSDKREST API
Stream server monitoring data.servers.monitor(id, options?)GET /api/system/monitor/stream
server:read · Self-hosted
List registered servers.servers.list()GET /api/system/servers
server:list · Self-hosted
Register an SSH server.servers.create(input)POST /api/system/servers
server:write · Self-hosted
Test the supplied SSH connection configuration.servers.testConnection(input)POST /api/system/test-connection
server:write · Self-hosted
Read the private networks and compute cluster associated with a server.servers.infrastructure(id)GET /api/system/servers/:id/infrastructure
server:read · Self-hosted
Read a server’s configuration and state.servers.get(id)GET /api/system/servers/:id
server:read · Self-hosted
Read server reachability.servers.reachability(id)GET /api/system/servers/:id/reachability
server:read · Self-hosted
Change registered server configuration, including whether it builds for other servers and its connection hostname (publicHostname, owner/admin).servers.update(id, input)PATCH /api/system/servers/:id
server:write · Self-hosted
Inspect workloads affected by removing the server.servers.deletionPreview(id)GET /api/system/servers/:id/deletion-preview
server:read · Self-hosted
Remove a server using the requested workload cleanup policy.servers.remove(id, input?)DELETE /api/system/servers/:id
server:admin · Self-hosted
Execute an authorized command on the server.servers.exec(id, input)POST /api/system/servers/:id/exec
server:admin · Self-hosted
Reboot the server (organization owners and admins). The machine Synq runs on also needs instance authority and confirmPanelHost.servers.reboot(id, input?)POST /api/system/servers/:id/reboot
server:admin · Self-hosted
Run a server health check.servers.check(id, input?)POST /api/system/check
server:admin · Self-hosted
Scan ports on an authorized server.servers.scanPorts(id)POST /api/system/servers/:id/ports/scan
server:read · Self-hosted
Read the server's cores, which projects pin or reserve them, and each container's cpuset.servers.getCpuReservations(id)GET /api/system/servers/:id/cpu-reservations
server:read · Self-hosted
Re-apply every Synq container's effective cores, weight and memory reservation.servers.applyCpuReservations(id)POST /api/system/servers/:id/cpu-reservations/apply
server:write · Self-hosted

Private networks

OperationSDKREST API
Read infrastructure availability, provider profiles, and supported network operations.servers.networkCapabilities()GET /api/system/networks/capabilities
server:read · Self-hosted
List organization-owned private networks and their latest verification.servers.listNetworks()GET /api/system/networks
server:read · Self-hosted
Read a private network, its server attachments, and verification report.servers.getNetwork(input)GET /api/system/networks/:id
server:read · Self-hosted
Save an existing private network using an idempotent request ID.servers.createNetwork(input)POST /api/system/networks
server:admin · Self-hosted
Update idle native-network inventory using its current revision; invalidate earlier verification.servers.updateNetwork(input)PATCH /api/system/networks/:id
server:admin · Self-hosted
Verify private connectivity, latency, and loss; optionally measure bounded throughput for a selected pair.servers.verifyNetwork(input)POST /api/system/networks/:id/verify
server:admin · Self-hosted
Remove unused native-network inventory at the current revision, preserving servers and external networks.servers.removeNetwork(input)DELETE /api/system/networks/:id
server:admin · Self-hosted
Revise the private connection policy of stopped setup using its current progress sequence and an idempotent request ID.servers.reviseManagedNetworkAccess(input)PATCH /api/system/networks/preparations/:preparationId/connections
server:admin · Self-hosted
Prepare missing networking tools on selected servers, retain per-step logs, and produce a reviewable plan. Repeat the same request to retry a failed preparation.servers.prepareManagedNetwork(input)POST /api/system/networks/preparations
server:admin · Self-hosted
Read saved prerequisite checks, installation logs, failures, and the resulting network operation.servers.getManagedNetworkPreparation(input)GET /api/system/networks/preparations/:preparationId
server:read · Self-hosted
Discard stopped setup and its unapplied plan using the current progress sequence. Installed tools and servers are retained; completed network cleanup is required once apply has started.servers.discardManagedNetworkPreparation(input)DELETE /api/system/networks/preparations/:preparationId
server:admin · Self-hosted
Remove one server from stopped initial setup and save a paused replacement selection. Preparation starts only on explicit retry; diagnostics, services, data, and installed tools are retained.servers.removeManagedNetworkPreparationMember(input)DELETE /api/system/networks/preparations/:preparationId/members/:serverId
server:admin · Self-hosted
Remove a server from an unfinished initial network operation. Restore its changes on the original hosts and save the remaining selection, paused until preparation is explicitly retried.servers.removeManagedNetworkOperationMember(input)DELETE /api/system/networks/operations/:operationId/members/:serverId
server:admin · Self-hosted
List recent server preparations that still need attention or network review.servers.listManagedNetworkPreparations()GET /api/system/networks/preparations
server:read · Self-hosted
Subscribe to saved preparation snapshots and completion. Reconnecting only reads progress; it never restarts preparation.servers.managedNetworkPreparationEvents(id, options?)GET /api/system/networks/preparations/:preparationId/stream
server:read · Self-hosted
Subscribe to durable network apply, verification, and recovery progress.servers.managedNetworkOperationEvents(id, options?)GET /api/system/networks/operations/:operationId/stream
server:read · Self-hosted
Subscribe to private-network overview and unfinished preparation snapshots.servers.clusterEvents(options?)GET /api/system/networks/stream
server:read · Self-hosted
Inspect servers and persist a reviewable WireGuard plan without changing host networking.servers.planManagedNetwork(input)POST /api/system/networks/plans
server:admin · Self-hosted
Read a managed network plan, per-host progress, verification, and recovery state.servers.getManagedNetworkOperation(input)GET /api/system/networks/operations/:operationId
server:read · Self-hosted
Apply an approved network plan, resume an interrupted operation, or restore its previous network.servers.applyManagedNetwork(input)POST /api/system/networks/operations/:operationId/apply
server:admin · Self-hosted
Discard an unapplied plan and its stopped preparation atomically. Active or unresolved host changes must be recovered through the network operation.servers.discardManagedNetworkPlan(input)DELETE /api/system/networks/operations/:operationId
server:admin · Self-hosted
Inspect a server’s machine identity and private interfaces without changing its network.servers.inspectNetwork(id)POST /api/system/servers/:id/network/inspect
server:admin · Self-hosted

Compute clusters

OperationSDKREST API
List organization-owned compute clusters and their private networks.servers.listComputeClusters()GET /api/system/compute-clusters
server:read · Self-hosted
Read a compute cluster, its selected servers, and private network.servers.getComputeCluster(input)GET /api/system/compute-clusters/:id
server:read · Self-hosted
Group selected servers on an existing private network using an idempotent request ID.servers.createComputeCluster(input)POST /api/system/compute-clusters
server:admin · Self-hosted
Update a compute cluster and its selected servers using the current revision.servers.updateComputeCluster(input)PATCH /api/system/compute-clusters/:id
server:admin · Self-hosted
Remove compute-cluster inventory at the current revision, retaining its servers and private network.servers.removeComputeCluster(input)DELETE /api/system/compute-clusters/:id
server:admin · Self-hosted

Cluster runtime

OperationSDKREST API
Read saved K3s setup, verification and cleanup progress; null before setup.servers.getClusterRuntime(input)GET /api/system/compute-clusters/:id/runtime
server:read · Self-hosted
Start automated K3s setup with the compute-cluster revision and an idempotent request ID.servers.setupClusterRuntime(input)POST /api/system/compute-clusters/:id/runtime
server:admin · Self-hosted
Resume failed or interrupted setup or removal using its current progress sequence.servers.retryClusterRuntime(input)POST /api/system/compute-clusters/:id/runtime/retry
server:admin · Self-hosted
Remove the owned runtime after verifying an empty cluster, retaining Docker services and networking.servers.removeClusterRuntime(input)DELETE /api/system/compute-clusters/:id/runtime
server:admin · Self-hosted
Subscribe to saved runtime progress through read-only, replayable SSE.servers.clusterRuntimeEvents(id, options?)GET /api/system/compute-clusters/:id/runtime/stream
server:read · Self-hosted

Legacy network methods

OperationSDKREST API
Compatibility method for private-network capabilities; prefer networkCapabilities.servers.clusterCapabilities()GET /api/system/clusters/capabilities
server:read · Self-hosted
Compatibility method for private-network inventory; prefer listNetworks.servers.listClusters()GET /api/system/clusters
server:read · Self-hosted
Read private-network details using the legacy clusterId input; prefer getNetwork.servers.getCluster(input)GET /api/system/clusters/:id
server:read · Self-hosted
Create private-network inventory using the legacy method; prefer createNetwork.servers.createCluster(input)POST /api/system/clusters
server:admin · Self-hosted
Update private-network inventory using the legacy clusterId input; prefer updateNetwork.servers.updateCluster(input)PATCH /api/system/clusters/:id
server:admin · Self-hosted
Verify private-network connectivity using the legacy clusterId input; prefer verifyNetwork.servers.verifyCluster(input)POST /api/system/clusters/:id/verify
server:admin · Self-hosted
Remove native-network inventory using the legacy clusterId input; prefer removeNetwork.servers.removeCluster(input)DELETE /api/system/clusters/:id
server:admin · Self-hosted

Git credentials

OperationSDKREST API
Read the server’s GitHub authentication status.servers.githubStatus(id)GET /api/system/servers/:id/github
server:read · Self-hosted
Start GitHub authentication for a server.servers.connectGitHub(id)POST /api/system/servers/:id/github/connect
server:write · Self-hosted
Poll a server’s GitHub authentication flow.servers.pollGitHubConnection(id)GET /api/system/servers/:id/github/connect/poll
server:read · Self-hosted
Store a GitHub token for a server.servers.setGitHubToken(id, input)PUT /api/system/servers/:id/github/token
server:write · Self-hosted
Generate a GitHub SSH key on the server.servers.generateGitHubKey(id)POST /api/system/servers/:id/github/ssh-key
server:write · Self-hosted
Select repository deploy keys for server clones.servers.useGitHubDeployKeys(id)PUT /api/system/servers/:id/github/deploy-key-mode
server:write · Self-hosted
Remove the server’s GitHub authentication.servers.disconnectGitHub(id)DELETE /api/system/servers/:id/github
server:write · Self-hosted

Networking

OperationSDKREST API
List the server’s port-forward configurations.servers.listTunnels(id)GET /api/system/servers/:id/tunnels
server:read · Self-hosted
Read the server's Cloudflare Tunnel connection, tunnel and connector state.servers.cloudflareTunnel(id)GET /api/system/servers/:id/cloudflare-tunnel
server:read · Self-hosted
Verify and store a Cloudflare API token for the server (stored encrypted, never returned).servers.connectCloudflareToken(id, input)POST /api/system/servers/:id/cloudflare-tunnel/token
server:admin · Self-hosted
List the token's Cloudflare accounts, or an account's zones and tunnels.servers.cloudflareTunnelOptions(id, input)POST /api/system/servers/:id/cloudflare-tunnel/options
server:read · Self-hosted
Pick or create the tunnel and start its cloudflared connector on the server.servers.configureCloudflareTunnel(id, input)PUT /api/system/servers/:id/cloudflare-tunnel
server:admin · Self-hosted
Restart the server's cloudflared connector.servers.restartCloudflareTunnel(id)POST /api/system/servers/:id/cloudflare-tunnel/restart
server:admin · Self-hosted
Stop the connector and forget the token; refused while domains are routed through the tunnel.servers.disconnectCloudflareTunnel(id)DELETE /api/system/servers/:id/cloudflare-tunnel
server:admin · Self-hosted
Create or update a port-forward configuration.servers.saveTunnel(id, input)POST /api/system/servers/:id/tunnels
server:write · Self-hosted
Start an authorized port forward.servers.startTunnel(id, input)POST /api/system/servers/:id/tunnels/:tunnelId/start
server:write · Self-hosted
Stop a port forward.servers.stopTunnel(id, input)POST /api/system/servers/:id/tunnels/:tunnelId/stop
server:write · Self-hosted
Remove a port-forward configuration.servers.removeTunnel(id, input)DELETE /api/system/servers/:id/tunnels/:tunnelId
server:write · Self-hosted
Read per-server request rate-limit configuration.servers.getRateLimit(id)GET /api/system/servers/:id/rate-limit
server:read · Self-hosted
Update per-server request rate limits.servers.updateRateLimit(id, input)PATCH /api/system/servers/:id/rate-limit
server:admin · Self-hosted

Docker maintenance

OperationSDKREST API
Read Docker disk usage: images, containers, volumes and build cache with sizes, owners and cleanup protection.servers.dockerDiskUsage(id)GET /api/system/servers/:id/docker/disk-usage
server:read · Self-hosted
List exactly what a Docker cleanup with a given scope would remove. Removes nothing.servers.previewDockerCleanup(id, input)POST /api/system/servers/:id/docker/cleanup/preview
server:admin · Self-hosted
Remove the confirmed cleanup items that a fresh plan still selects; Synq-owned and control-plane resources are never removed.servers.runDockerCleanup(id, input)POST /api/system/servers/:id/docker/cleanup
server:admin · Self-hosted

Legacy network URLs

OperationSDKREST API
Compatibility alias for POST /api/system/networks/preparations.HTTP onlyPOST /api/system/clusters/network-preparations
server:admin · Self-hosted
Compatibility alias for GET /api/system/networks/preparations/:preparationId.HTTP onlyGET /api/system/clusters/network-preparations/:preparationId
server:read · Self-hosted
Compatibility alias for DELETE /api/system/networks/preparations/:preparationId.HTTP onlyDELETE /api/system/clusters/network-preparations/:preparationId
server:admin · Self-hosted
Compatibility alias for DELETE /api/system/networks/preparations/:preparationId/members/:serverId.HTTP onlyDELETE /api/system/clusters/network-preparations/:preparationId/members/:serverId
server:admin · Self-hosted
Compatibility alias for DELETE /api/system/networks/operations/:operationId/members/:serverId.HTTP onlyDELETE /api/system/clusters/network-operations/:operationId/members/:serverId
server:admin · Self-hosted
Compatibility alias for GET /api/system/networks/preparations.HTTP onlyGET /api/system/clusters/network-preparations
server:read · Self-hosted
Compatibility alias for GET /api/system/networks/preparations/:preparationId/stream.HTTP onlyGET /api/system/clusters/network-preparations/:preparationId/stream
server:read · Self-hosted
Compatibility alias for GET /api/system/networks/operations/:operationId/stream.HTTP onlyGET /api/system/clusters/network-operations/:operationId/stream
server:read · Self-hosted
Compatibility alias for GET /api/system/networks/stream.HTTP onlyGET /api/system/clusters/stream
server:read · Self-hosted
Compatibility alias for POST /api/system/networks/plans.HTTP onlyPOST /api/system/clusters/network-plans
server:admin · Self-hosted
Compatibility alias for GET /api/system/networks/operations/:operationId.HTTP onlyGET /api/system/clusters/network-operations/:operationId
server:read · Self-hosted
Compatibility alias for POST /api/system/networks/operations/:operationId/apply.HTTP onlyPOST /api/system/clusters/network-operations/:operationId/apply
server:admin · Self-hosted
Compatibility alias for DELETE /api/system/networks/operations/:operationId.HTTP onlyDELETE /api/system/clusters/network-operations/:operationId
server:admin · Self-hosted
Compatibility alias for PATCH /api/system/networks/preparations/:preparationId/connections.HTTP onlyPATCH /api/system/clusters/network-preparations/:preparationId/connections
server:admin · Self-hosted

On this page