For the complete documentation index, see llms.txt. This page is also available as Markdown.

Services

Manage services displayed on a status page

List services

get
Authorizations
AuthorizationstringRequired

Organization API key — issue one via the Rails console (management UI coming soon)

Path parameters
subdomainstringRequired

Status page subdomain (e.g. acme-status)

Responses
200

OK

application/json
get/status_pages/{subdomain}/services
GET /api/v1/status_pages/{subdomain}/services HTTP/1.1
Host: next.statuspal.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "data": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "slug": "api-gateway",
      "name": "API Gateway",
      "description": null,
      "status": "ok",
      "order": 1,
      "scope": "global",
      "containers": [
        "eu",
        "us"
      ],
      "container_statuses": [
        {
          "container_slug": "eu",
          "status": "major"
        }
      ],
      "created_at": "2026-01-01T00:00:00.000Z",
      "updated_at": "2026-01-01T00:00:00.000Z"
    }
  ]
}

Create a service

post
Authorizations
AuthorizationstringRequired

Organization API key — issue one via the Rails console (management UI coming soon)

Path parameters
subdomainstringRequired

Status page subdomain (e.g. acme-status)

Body
namestring · max: 255Required
slugstringOptional

Optional URL-safe identifier. If omitted, it is auto-generated from name. If a non-unique value is provided, a numeric suffix is appended (e.g. api-1).

descriptionstring · nullableOptional
containersstring[]Optional

The containers to include this service in, by slug. This is what determines the service scope: listing one or more containers creates a Container Service, while passing an explicit empty array creates a Global Service. Omitting the field defaults to every container on the status page, which keeps existing clients working unchanged. On a page with no containers that default is empty, so the service is Global. An unknown slug returns 422.

Example: ["eu","us"]
statusstring · enumOptional

Optional initial status for a Global Service. Defaults to ok. Ignored for a Container Service; use container_statuses there instead.

Possible values:
Responses
201

Created

application/json
post/status_pages/{subdomain}/services
POST /api/v1/status_pages/{subdomain}/services HTTP/1.1
Host: next.statuspal.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 151

{
  "name": "text",
  "slug": "text",
  "description": null,
  "containers": [
    "eu",
    "us"
  ],
  "container_statuses": [
    {
      "container_slug": "eu",
      "status": "major"
    }
  ],
  "status": "ok"
}
{
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "slug": "api-gateway",
    "name": "API Gateway",
    "description": null,
    "status": "ok",
    "order": 1,
    "scope": "global",
    "containers": [
      "eu",
      "us"
    ],
    "container_statuses": [
      {
        "container_slug": "eu",
        "status": "major"
      }
    ],
    "created_at": "2026-01-01T00:00:00.000Z",
    "updated_at": "2026-01-01T00:00:00.000Z"
  }
}

Get a service

get
Authorizations
AuthorizationstringRequired

Organization API key — issue one via the Rails console (management UI coming soon)

Path parameters
subdomainstringRequired

Status page subdomain (e.g. acme-status)

service_slugstringRequired

Service slug (auto-generated from name, e.g. api-gateway)

Responses
200

OK

application/json
get/status_pages/{subdomain}/services/{service_slug}
GET /api/v1/status_pages/{subdomain}/services/{service_slug} HTTP/1.1
Host: next.statuspal.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "slug": "api-gateway",
    "name": "API Gateway",
    "description": null,
    "status": "ok",
    "order": 1,
    "scope": "global",
    "containers": [
      "eu",
      "us"
    ],
    "container_statuses": [
      {
        "container_slug": "eu",
        "status": "major"
      }
    ],
    "created_at": "2026-01-01T00:00:00.000Z",
    "updated_at": "2026-01-01T00:00:00.000Z"
  }
}

Delete a service

delete
Authorizations
AuthorizationstringRequired

Organization API key — issue one via the Rails console (management UI coming soon)

Path parameters
subdomainstringRequired

Status page subdomain (e.g. acme-status)

service_slugstringRequired

Service slug (auto-generated from name, e.g. api-gateway)

Responses
204

Deleted

No content

delete/status_pages/{subdomain}/services/{service_slug}
DELETE /api/v1/status_pages/{subdomain}/services/{service_slug} HTTP/1.1
Host: next.statuspal.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Update a service

patch
Authorizations
AuthorizationstringRequired

Organization API key — issue one via the Rails console (management UI coming soon)

Path parameters
subdomainstringRequired

Status page subdomain (e.g. acme-status)

service_slugstringRequired

Service slug (auto-generated from name, e.g. api-gateway)

Body
namestring · max: 255Optional
slugstringOptional

Optional. If provided, replaces the URL slug (with uniqueness suffixing if needed).

descriptionstring · nullableOptional
orderintegerOptional

Position in the display list (1-indexed). Other services shift accordingly.

containersstring[]Optional

Replaces the set of containers this service is included in, by slug, and with it the service scope. Passing an empty array makes the service Global; passing one or more containers makes it a Container Service. An unknown slug returns 422. Status is preserved across a scope change, never reset. Switching Global to Container-scoped gives every newly-included container the service current status. Switching Container-scoped to Global discards the per-container configuration and keeps the worst-case of the discarded statuses — the status the public page was already showing.

Example: ["eu","us"]
statusstring · enumOptional

Sets the live status of a Global Service — the API equivalent of the operational dashboard. Rejected with 422 for a Container Service; use container_statuses there instead.

Possible values:
Responses
200

OK

application/json
patch/status_pages/{subdomain}/services/{service_slug}
PATCH /api/v1/status_pages/{subdomain}/services/{service_slug} HTTP/1.1
Host: next.statuspal.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 161

{
  "name": "text",
  "slug": "text",
  "description": null,
  "order": 1,
  "containers": [
    "eu",
    "us"
  ],
  "container_statuses": [
    {
      "container_slug": "eu",
      "status": "major"
    }
  ],
  "status": "ok"
}
{
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "slug": "api-gateway",
    "name": "API Gateway",
    "description": null,
    "status": "ok",
    "order": 1,
    "scope": "global",
    "containers": [
      "eu",
      "us"
    ],
    "container_statuses": [
      {
        "container_slug": "eu",
        "status": "major"
      }
    ],
    "created_at": "2026-01-01T00:00:00.000Z",
    "updated_at": "2026-01-01T00:00:00.000Z"
  }
}

Last updated