# Statuspage Delta Monitor | Service Incident Changes (`sbio-apps/statuspage-delta-monitor`) Actor

Track changes in public Statuspage service summaries: overall status, components, unresolved incidents and scheduled maintenance. Keep persistent snapshots and return normalized records plus deterministic change IDs for operations workflows.

- **URL**: https://apify.com/sbio-apps/statuspage-delta-monitor.md
- **Developed by:** [Austin Aryain](https://apify.com/sbio-apps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 completed checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Statuspage Delta Monitor | Service Incident Changes

Track changes in public Statuspage service summaries: overall status, components, unresolved incidents and scheduled maintenance. Keep persistent snapshots and return normalized records plus deterministic change IDs for operations workflows.

### How it works

Supply the origin of a public status page implementing the Statuspage /api/v2/summary.json format. The Actor normalizes overall status, components, unresolved incidents and scheduled or active maintenance into one dataset row per service check. Repeated runs with the same monitor ID emit changes when normalized fields differ. Incident records include update IDs and their source updated timestamp, while component comparisons exclude volatile timestamps. This avoids treating routine timestamp changes as component-status changes. The first run can emit current entities or create a silent baseline.

### Quick start

1. Enter one or more public URLs in the Input tab, beginning with the supplied example.
2. Set a maximum run charge. A completed check costs $0.005; checking 10 sources once costs $0.05.
3. Start the Actor and inspect the dataset. Download JSON, CSV or Excel, or consume results through the Apify API.
4. Inspect the OUTPUT run summary as well as the dataset: failed or unprocessed inputs appear there. Save the input as a task if you want to schedule future runs.

### Pricing

**$0.005 per completed check ($5 per 1,000), with platform usage included.** There are no separate Actor-start or dataset-item fees. Empty and unchanged successful checks are charged. The maximum charge is checked before each source request and again before output. Failed network or format checks are free; see the specific HTTP-response cases below. Billing is per completed source check, not per nested array item, extracted URL, change or schema block.

### Limits and interpretation

The endpoint must return a complete public summary with components, incidents and scheduled\_maintenances arrays, fit within 2 MB and contain at most 2,000 entities. It does not call the authenticated management API, fetch historical incidents or support unrelated status-page formats. Absence from the next summary is reported as absent, not automatically labeled resolved: summaries may omit entities for several reasons. Incident message bodies are not copied into output. Polling only observes snapshots and can miss transitions between checks; this is not a real-time alert delivery service.

A run accepts 1-50 unique input URLs and requests them sequentially. Each check has an 18-second network deadline; new checks stop after 160 seconds. Use a 240-second run timeout and 512 MB memory. If the time or charge limit stops a batch, OUTPUT lists uncheckedUrls for a later run. No response exceeding the configured byte limit is accepted, and a complete record must fit within 6 MB. The Actor permits only public HTTP(S) destinations on standard ports, pins a validated DNS address per request, and refuses redirects into private networks or from HTTPS to HTTP.

The Actor uses direct HTTP requests, without a browser, residential proxy, login, CAPTCHA solving or access-control bypass. Rate limits and blocks may prevent checks. Avoid secret-bearing URLs. Results describe the source and network observed at check time.

### Persistent history

Reuse the same monitorId, or omit it on a saved task to use the task ID. Use a new ID to reset the baseline. Run one copy of a given monitor at a time, at least five minutes apart. Dataset output is written and charged before the checkpoint is saved. A failure between those steps can replay a transition; deduplicate deterministic eventId values downstream. Overlapping runs are unsupported. Failed checks and rejected charges retain prior history. Current snapshots are stored in a named key-value store and incur platform storage costs covered by this Actor pricing; remove unused monitor stores through Apify when no longer needed.

### Integrations and support

Connect the dataset and OUTPUT summary to your own n8n, Make, Zapier or API workflow. This Actor produces data; it does not automatically send email, Slack messages or webhooks to third parties. No external account credentials are needed for the supplied public examples. Report reproducible issues in the Actor Issues tab, including a non-sensitive input and run link. This is an independent utility and is not endorsed by the websites, standards bodies or services it reads.

### Input example

```json
{
  "urls": [
    "https://www.githubstatus.com/"
  ],
  "monitorId": "statuspage-monitor",
  "firstRun": "emit"
}
```

See the Input tab for all supported fields. Results are available through the dataset API and can be downloaded as JSON, CSV or Excel.

### Output fields

| Field | Meaning |
|---|---|
| inputUrl | Normalized supplied URL. |
| checkedAt | Check time in ISO format. |
| endpoint | Final public /api/v2/summary.json endpoint. |
| pageName | Service page name. |
| indicator | Source overall status indicator. |
| description | Source overall status description. |
| componentCount | Components in the summary. |
| incidentCount | Unresolved incidents included by the source. |
| maintenanceCount | Scheduled or active maintenance records included by the source. |
| items | Normalized current overall, component, incident and maintenance entities. |
| monitorId | Persistent history scope. |
| baselineCreated | True on the first complete observation. |
| changeCount | Changes relative to the last successful snapshot. |
| changes | eventId, type (new/updated/absent) and normalized item. Absence describes the source snapshot only. |

### Output example

Example from a public source check; live values vary. Long items, changes, groups and blocks arrays are shortened to two entries here for readability; the actual record contains the complete arrays within the documented limits.

```json
{
  "inputUrl": "https://www.githubstatus.com/",
  "checkedAt": "2026-09-07T21:05:13.195Z",
  "endpoint": "https://www.githubstatus.com/api/v2/summary.json",
  "pageName": "GitHub",
  "indicator": "none",
  "description": "All Systems Operational",
  "componentCount": 12,
  "incidentCount": 0,
  "maintenanceCount": 0,
  "items": [
    {
      "id": "component:0l2p9nhqnxpd",
      "sourceId": "0l2p9nhqnxpd",
      "kind": "component",
      "name": "Visit www.githubstatus.com for more information",
      "status": "operational"
    },
    {
      "id": "component:4230lsnqdsld",
      "sourceId": "4230lsnqdsld",
      "kind": "component",
      "name": "Webhooks",
      "status": "operational"
    }
  ],
  "monitorId": "statuspage-monitor",
  "baselineCreated": true,
  "changeCount": 13,
  "changes": [
    {
      "eventId": "05c64eb4e36a0f6d4751e7a992ed4d2afe7f58b57bb6d9733517f29697a5ffa1",
      "type": "new",
      "item": {
        "id": "component:0l2p9nhqnxpd",
        "sourceId": "0l2p9nhqnxpd",
        "kind": "component",
        "name": "Visit www.githubstatus.com for more information",
        "status": "operational"
      }
    },
    {
      "eventId": "ee28a193de8d1089ffc93193106863117dfbe2de17c985b72203bbd5f45de8c4",
      "type": "new",
      "item": {
        "id": "component:4230lsnqdsld",
        "sourceId": "4230lsnqdsld",
        "kind": "component",
        "name": "Webhooks",
        "status": "operational"
      }
    }
  ]
}
```

# Actor input Schema

## `urls` (type: `array`):

1-50 explicit public URLs on standard ports. Exact duplicate input URLs are checked once.

## `monitorId` (type: `string`):

Reuse this ID across runs; omit only when using a saved task. Use a new ID for a fresh baseline.

## `firstRun` (type: `string`):

Emit returns current entities; baseline saves them silently. Both are charged completed checks.

## Actor input object example

```json
{
  "urls": [
    "https://www.githubstatus.com/"
  ],
  "monitorId": "statuspage-monitor",
  "firstRun": "emit"
}
```

# Actor output Schema

## `checks` (type: `string`):

Priced dataset records, including observed unchanged checks or HTTP audit errors as documented.

## `summary` (type: `string`):

Free errors, spending/time stops and unprocessed inputs.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.githubstatus.com/"
    ],
    "monitorId": "statuspage-monitor"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sbio-apps/statuspage-delta-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.githubstatus.com/"],
    "monitorId": "statuspage-monitor",
}

# Run the Actor and wait for it to finish
run = client.actor("sbio-apps/statuspage-delta-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.githubstatus.com/"
  ],
  "monitorId": "statuspage-monitor"
}' |
apify call sbio-apps/statuspage-delta-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sbio-apps/statuspage-delta-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OXC5vpSwCja82wDVc/builds/MdO9DeSgytucyzWNO/openapi.json
