API Reference

Pages

Deploy static files (build artifacts, dist folders) from workspaces to the edge. Pages are served directly by the edge proxy — no running VM required.

Pages are independent from workspaces. Deleting a workspace does not delete its exported pages.

Pages created through the API or SDK also appear in Dashboard → Pages, where you can inspect their namespace, source workspace, status, domain/SSL settings, and traffic analytics. To export directly from a workspace, open its Pages → Create Page tab; the workspace is already selected.

How it works

  1. Build in a workspace VM (e.g. npm run build)
  2. Create a page with the output folder path (POST /pages)
  3. Files are copied from the VM to the host filesystem
  4. An etcd route is created so the edge proxy serves them as a static page
  5. The VM can be stopped or deleted — the page stays live

Each page gets a unique URL at https://{slug}.preview.oblien.com. You can optionally connect a custom domain with managed SSL.

Need a same‑origin API proxy, redirects, headers, or SPA fallback? See Routes — generic hostname proxy/static/redirect actions and optional versioned path rules, applied without redeploying the workload. Publication status is explicit.

List pages

GET /pages
curl "https://api.oblien.com/pages" \
  -H "Authorization: Bearer $TOKEN"

Response

{
  "success": true,
  "pages": [
    {
      "name": "my-app",
      "slug": "my-app",
      "domain": "preview.oblien.com",
      "url": "https://my-app.preview.oblien.com",
      "status": "active",
      "source_workspace_id": "ws_abc123",
      "custom_domain": null,
      "created_at": "2026-03-12T10:00:00Z"
    }
  ]
}

Create a page

Create a page by exporting files from a running workspace. The VM must be running — files are transferred during creation.

POST /pages
Content-Type: application/json

{
  "workspace_id": "ws_abc123",
  "path": "/app/dist",
  "name": "my-app",
  "slug": "my-app"
}
curl -X POST "https://api.oblien.com/pages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_abc123", "path": "/app/dist", "name": "my-app"}'

Parameters

ParameterTypeRequiredDescription
workspace_idstringYesWorkspace to export files from
pathstringYesFolder inside VM to export (e.g. /app/dist)
namestringNoDisplay name (max 100 chars, defaults to workspace name)
slugstringNoSubdomain slug (auto-generated if omitted)
domainstringNoBase domain (defaults to preview.oblien.com)

Response

{
  "success": true,
  "page": {
    "name": "my-app",
    "slug": "my-app",
    "domain": "preview.oblien.com",
    "url": "https://my-app.preview.oblien.com",
    "status": "active"
  }
}

Update a page

Update the page name or slug. Slug changes publish the old/new hostname swap in one registry transaction; edge propagation is asynchronous.

PUT /pages/:slug
Content-Type: application/json

{ "name": "new-name", "slug": "new-slug" }

Re-deploy files

Replace the static files for an existing page with a fresh export from a workspace.

POST /pages/:slug/deploy
Content-Type: application/json

{ "workspace_id": "ws_abc123", "path": "/app/dist" }
curl -X POST "https://api.oblien.com/pages/my-app/deploy" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"workspace_id": "ws_abc123", "path": "/app/dist"}'
ParameterTypeRequiredDescription
workspace_idstringYesWorkspace to export files from
pathstringYesFolder inside VM to export

Enable / Disable

Toggle a page without deleting it. Disabling removes the etcd route key (traffic stops), enabling re-creates it.

POST /pages/:slug/enable
POST /pages/:slug/disable

Delete a page

Removes the etcd route, DB record, and host files. If a custom domain is connected, it is also disconnected.

DELETE /pages/:slug

Custom Domains

Connect a fully custom domain to a page with managed SSL. Uses the same DNS verification and ACME certificate flow as workspace custom domains: route registration is immediate, while SSL may remain pending until edge DNS is ready.

Connect a custom domain

POST /pages/:slug/domain
Content-Type: application/json

{
  "domain": "docs.example.com",
  "include_www": false
}
curl -X POST "https://api.oblien.com/pages/my-app/domain" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "docs.example.com"}'
ParameterTypeRequiredDescription
domainstringYesCustom domain to connect
include_wwwbooleanNoAlso route www. subdomain (defaults to false)

Before connecting, configure DNS:

  1. CNAME record pointing your domain to the edge host (e.g. edge.oblien.com)
  2. TXT ownership record for verification

Use the DNS check endpoint to verify before connecting.

Response

{
  "success": true,
  "domain": "docs.example.com",
  "ssl": {
    "status": "pending",
    "expiresAt": null,
    "error": "DNS is not pointed to edge yet"
  },
  "url": "https://docs.example.com"
}

Check DNS (pre-verify)

Verify DNS configuration before connecting a domain. No side effects.

POST /pages/:slug/domain/check
Content-Type: application/json

{ "domain": "docs.example.com" }

Get domain config

GET /pages/:slug/domain

The response contains domain: null when no custom domain is connected. Otherwise domain.domain is the hostname and domain.ssl is the current certificate state:

{
  "success": true,
  "domain": {
    "domain": "docs.example.com",
    "ssl": {
      "status": "active",
      "expiresAt": "2026-12-27T10:49:08.000Z",
      "error": null
    },
    "customDomain": "docs.example.com",
    "sslStatus": "active",
    "sslExpiry": "2026-12-27T10:49:08.000Z",
    "sslError": null,
    "includeWww": false,
    "url": "https://docs.example.com"
  }
}

ssl.status is pending, active, or expired; expiresAt is an ISO timestamp or null. Reads use the certificate record, including background renewals. The flat customDomain, sslStatus, sslExpiry, and sslError fields remain available for existing clients. Oblien SDK 2.4.0 already supports the nested response.

Namespace credentials can read and renew only Pages in their bound namespace. The generic POST /domain/ssls/:domain/renew endpoint enforces the same boundary; request body or query parameters cannot change the credential's namespace.

Disconnect custom domain

Removes the domain route, clears active SSL state from the edge, and clears the config.

DELETE /pages/:slug/domain

Renew SSL

Force-renew the SSL certificate for a connected custom domain.

POST /pages/:slug/domain/ssl/renew