# Vendor Status Page & Incident Digest Monitor (`taroyamada/status-page-incident-digest-monitor`) Actor

Monitor public vendor status pages and incident feeds. Returns one digest row per vendor with executive summary, incident state, affected components, and change detection.

- **URL**: https://apify.com/taroyamada/status-page-incident-digest-monitor.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Business, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Status Page Incident Digest Monitor

Monitor public vendor status pages and incident RSS feeds. Returns **one executive digest row per vendor** with change detection, incident state classification, affected components, and actionable recommendations.

### Quickstart (1 minute)

1. Click **Try for free** and paste this input:

```json
{
  "vendors": [
    {
      "id": "stripe",
      "name": "Stripe",
      "criticality": "high",
      "owner": "Ops",
      "statusPageUrl": "https://status.stripe.com",
      "incidentFeedUrl": "https://status.stripe.com/history.rss"
    }
  ],
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "status-page-quickstart"
}
````

2. **First run** seeds the baseline snapshot.
3. **Second run** shows `changedSinceLastRun` for any vendors that changed state.

### Output Shape

Each row in the dataset represents one vendor:

| Field | Type | Description |
|---|---|---|
| `vendorId` | string | Stable slug identifier |
| `vendorName` | string | Human-readable name |
| `executiveSummary` | string | One-liner plain-English status |
| `incidentState` | enum | `operational` / `degraded` / `outage` / `maintenance` / `unknown` |
| `incidentCount` | integer | Active / recent incidents in the lookback window |
| `affectedComponents` | string\[] | Component names that are not fully operational |
| `actionNeeded` | boolean | `true` when outage, degraded, or state changed for high-criticality |
| `recommendedActions` | string\[] | Actionable steps for the on-call owner |
| `changedSinceLastRun` | boolean | State or components changed vs previous snapshot |
| `evidence` | object\[] | Raw incidents / feed items supporting the digest |
| `meta` | object | Vendor config + parse diagnostics |

### Input Reference

#### Vendor Object

| Field | Required | Description |
|---|---|---|
| `id` | No | Stable slug (auto-generated from `name` if omitted) |
| `name` | No | Display name |
| `statusPageUrl` | **Yes** | Public status page URL |
| `incidentFeedUrl` | No | RSS / Atom incident feed URL |
| `criticality` | No | `mission_critical` / `high` / `standard` / `low` (default: `standard`) |
| `owner` | No | Team responsible for this vendor |
| `tags` | No | Freeform tags for filtering |

#### Top-Level Options

| Field | Default | Description |
|---|---|---|
| `delivery` | `dataset` | `dataset` or `webhook` |
| `datasetMode` | `all` | `all` / `changes_only` / `action_needed` |
| `webhookUrl` | — | Required when `delivery=webhook` |
| `notifyOnNoChange` | `false` | Fire webhook even when nothing changed |
| `snapshotKey` | `status-page-incident-snapshots` | Key for run-to-run state |
| `incidentLookbackDays` | `30` | Days of feed history to include (0 = all) |
| `maxIncidentsPerVendor` | `10` | Max evidence rows per vendor |
| `concurrency` | `3` | Parallel vendor fetches |
| `requestTimeoutSeconds` | `30` | HTTP timeout per request |
| `dryRun` | `false` | Preview without saving snapshots |

### Supported Status Page Formats

1. **statuspage.io JSON API** – Automatically tries `/api/v2/summary.json` for any status page URL. Returns structured component status, active incidents, and scheduled maintenance.
2. **HTML scraping fallback** – Keyword-based detection of operational / degraded / outage / maintenance state from any public status page HTML.
3. **RSS / Atom incident feed** – Parses incident history feed; respects `incidentLookbackDays`.

### Templates

| Template | Use Case |
|---|---|
| `quickstart_dataset` | Single vendor, all rows, baseline first run |
| `recurring_changes_only` | Daily schedule, multi-vendor, changes only |
| `webhook_action_needed` | Webhook alert when actionNeeded=true |

### Change Detection

State is fingerprinted as a SHA-256 hash of `(incidentState, sortedAffectedComponents, incidentCount)`. On each run the fingerprint is compared to the stored snapshot. `changedSinceLastRun=true` means something in that tuple changed.

The first run always sets `isFirstRun=true` and `changedSinceLastRun=false` (no previous state to compare).

### FAQ

**Q: Which vendors work without an incidentFeedUrl?**\
A: All vendors. The feed is optional and supplements the status page parsing.

**Q: Does this use a headless browser?**\
A: No. Pure HTTP + JSON/RSS parsing. Low resource usage, high throughput.

**Q: How do I monitor more than 3 vendors?**\
A: Add more vendor objects to the `vendors` array. Use `concurrency: 5` for faster runs.

**Q: What happens if a status page is unreachable?**\
A: The vendor row gets `incidentState: "unknown"` and `actionNeeded: true` with an error explanation in `recommendedActions`.

# Actor input Schema

## `vendors` (type: `array`):

List of vendors with their status page URLs. Each vendor must have a statusPageUrl. Optionally provide an incidentFeedUrl for RSS/Atom incident history. Starter path: 1 vendor, dataset mode.

## `requestTimeoutSeconds` (type: `integer`):

HTTP timeout per status page or incident feed request.

## `userAgent` (type: `string`):

Optional User-Agent override for HTTP requests.

## `maxIncidentsPerVendor` (type: `integer`):

Maximum number of recent incidents to include in the evidence array per vendor.

## `incidentLookbackDays` (type: `integer`):

How many days back to look for incidents when filtering feed entries. 0 = all available.

## `delivery` (type: `string`):

dataset: write rows to Apify dataset. webhook: POST digest to a URL. Starter path: dataset.

## `datasetMode` (type: `string`):

all: every vendor row. changes\_only: only vendors whose state changed since last run. action\_needed: only vendors where actionNeeded=true.

## `webhookUrl` (type: `string`):

Required when delivery=webhook. Receives the full digest payload as JSON POST.

## `notifyOnNoChange` (type: `boolean`):

When false (recommended), webhook delivery is skipped if no vendor changed state.

## `snapshotKey` (type: `string`):

Stable key for storing run-to-run state. Keep this constant across runs so change detection works correctly.

## `concurrency` (type: `integer`):

Number of vendors to fetch in parallel. Keep at 2-3 to avoid rate limiting.

## `nowIso` (type: `string`):

Optional deterministic timestamp for testing. Leave empty for real runs.

## `dryRun` (type: `boolean`):

When true, no snapshots are saved and no webhook is fired. Use for previewing output.

## Actor input object example

```json
{
  "vendors": [
    {
      "id": "stripe",
      "name": "Stripe",
      "criticality": "high",
      "owner": "Ops",
      "tags": [
        "payments",
        "core"
      ],
      "statusPageUrl": "https://status.stripe.com",
      "incidentFeedUrl": "https://status.stripe.com/history.rss"
    }
  ],
  "requestTimeoutSeconds": 30,
  "maxIncidentsPerVendor": 10,
  "incidentLookbackDays": 30,
  "delivery": "dataset",
  "datasetMode": "all",
  "notifyOnNoChange": false,
  "snapshotKey": "status-page-incident-snapshots",
  "concurrency": 3,
  "dryRun": false
}
```

# 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 = {
    "vendors": [
        {
            "id": "stripe",
            "name": "Stripe",
            "criticality": "high",
            "owner": "Ops",
            "tags": [
                "payments",
                "core"
            ],
            "statusPageUrl": "https://status.stripe.com",
            "incidentFeedUrl": "https://status.stripe.com/history.rss"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/status-page-incident-digest-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 = { "vendors": [{
            "id": "stripe",
            "name": "Stripe",
            "criticality": "high",
            "owner": "Ops",
            "tags": [
                "payments",
                "core",
            ],
            "statusPageUrl": "https://status.stripe.com",
            "incidentFeedUrl": "https://status.stripe.com/history.rss",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/status-page-incident-digest-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "vendors": [
    {
      "id": "stripe",
      "name": "Stripe",
      "criticality": "high",
      "owner": "Ops",
      "tags": [
        "payments",
        "core"
      ],
      "statusPageUrl": "https://status.stripe.com",
      "incidentFeedUrl": "https://status.stripe.com/history.rss"
    }
  ]
}' |
apify call taroyamada/status-page-incident-digest-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=taroyamada/status-page-incident-digest-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vendor Status Page & Incident Digest Monitor",
        "description": "Monitor public vendor status pages and incident feeds. Returns one digest row per vendor with executive summary, incident state, affected components, and change detection.",
        "version": "0.1",
        "x-build-id": "0nejWwB4rYNvPIjM5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~status-page-incident-digest-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-status-page-incident-digest-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/taroyamada~status-page-incident-digest-monitor/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-status-page-incident-digest-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/taroyamada~status-page-incident-digest-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-status-page-incident-digest-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "vendors"
                ],
                "properties": {
                    "vendors": {
                        "title": "Vendors to monitor (starter: 1 vendor)",
                        "type": "array",
                        "description": "List of vendors with their status page URLs. Each vendor must have a statusPageUrl. Optionally provide an incidentFeedUrl for RSS/Atom incident history. Starter path: 1 vendor, dataset mode."
                    },
                    "requestTimeoutSeconds": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "HTTP timeout per status page or incident feed request.",
                        "default": 30
                    },
                    "userAgent": {
                        "title": "Custom User-Agent",
                        "type": "string",
                        "description": "Optional User-Agent override for HTTP requests."
                    },
                    "maxIncidentsPerVendor": {
                        "title": "Max incidents in evidence",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of recent incidents to include in the evidence array per vendor.",
                        "default": 10
                    },
                    "incidentLookbackDays": {
                        "title": "Incident lookback window (days)",
                        "minimum": 0,
                        "maximum": 365,
                        "type": "integer",
                        "description": "How many days back to look for incidents when filtering feed entries. 0 = all available.",
                        "default": 30
                    },
                    "delivery": {
                        "title": "Delivery mode",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "dataset: write rows to Apify dataset. webhook: POST digest to a URL. Starter path: dataset.",
                        "default": "dataset"
                    },
                    "datasetMode": {
                        "title": "Dataset filter",
                        "enum": [
                            "all",
                            "changes_only",
                            "action_needed"
                        ],
                        "type": "string",
                        "description": "all: every vendor row. changes_only: only vendors whose state changed since last run. action_needed: only vendors where actionNeeded=true.",
                        "default": "all"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Required when delivery=webhook. Receives the full digest payload as JSON POST."
                    },
                    "notifyOnNoChange": {
                        "title": "Notify even when nothing changed",
                        "type": "boolean",
                        "description": "When false (recommended), webhook delivery is skipped if no vendor changed state.",
                        "default": false
                    },
                    "snapshotKey": {
                        "title": "Snapshot key (recurring monitor)",
                        "type": "string",
                        "description": "Stable key for storing run-to-run state. Keep this constant across runs so change detection works correctly.",
                        "default": "status-page-incident-snapshots"
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of vendors to fetch in parallel. Keep at 2-3 to avoid rate limiting.",
                        "default": 3
                    },
                    "nowIso": {
                        "title": "Override current time (ISO 8601)",
                        "type": "string",
                        "description": "Optional deterministic timestamp for testing. Leave empty for real runs."
                    },
                    "dryRun": {
                        "title": "Dry run",
                        "type": "boolean",
                        "description": "When true, no snapshots are saved and no webhook is fired. Use for previewing output.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
