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
- Build in a workspace VM (e.g.
npm run build) - Create a page with the output folder path (
POST /pages) - Files are copied from the VM to the host filesystem
- An etcd route is created so the edge proxy serves them as a static page
- 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 /pagescurl "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
| Parameter | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Workspace to export files from |
path | string | Yes | Folder inside VM to export (e.g. /app/dist) |
name | string | No | Display name (max 100 chars, defaults to workspace name) |
slug | string | No | Subdomain slug (auto-generated if omitted) |
domain | string | No | Base 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"}'| Parameter | Type | Required | Description |
|---|---|---|---|
workspace_id | string | Yes | Workspace to export files from |
path | string | Yes | Folder 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/disableDelete a page
Removes the etcd route, DB record, and host files. If a custom domain is connected, it is also disconnected.
DELETE /pages/:slugCustom 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"}'| Parameter | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Custom domain to connect |
include_www | boolean | No | Also route www. subdomain (defaults to false) |
Before connecting, configure DNS:
- CNAME record pointing your domain to the edge host (e.g.
edge.oblien.com) - 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/domainThe 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/domainRenew SSL
Force-renew the SSL certificate for a connected custom domain.
POST /pages/:slug/domain/ssl/renew