# Status Page SLA Monitor: Uptime & Incidents (`offerastudio/status-page-sla-monitor`) Actor

Uptime, incidents and a monthly SLA table from the public status pages of SaaS vendors (Atlassian Statuspage, incident.io, Better Stack, Instatus). Impact-weighted availability per component, MTTR and changes since the last run. Computed from vendor-published incidents, not independent monitoring.

- **URL**: https://apify.com/offerastudio/status-page-sla-monitor.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 status page checkeds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Status Page SLA Monitor do?

**Status Page SLA Monitor** turns the public status pages of your SaaS vendors into numbers you can put in a vendor review: **uptime, incidents, mean time to resolve and a monthly SLA table**. Give it status page URLs (or just vendor domains) and a look-back window of up to 90 days. For every page you get:

- 🚦 **overall status now** and **every component with its status**
- 🧯 **incidents in the window**: impact, start and resolve time, **duration in minutes** and the **affected components**
- 📊 **availability % per component and for the whole service**, computed from incident durations **weighted by impact**: a major outage counts as full downtime, a partial outage as 50 %, degraded performance as 0 %. **The weights are yours to change** to match your contract.
- 📅 a **monthly SLA table**, the **MTTR** (mean time to resolve) and the **number of incidents by impact**
- 🔔 **changes since the last run**: new incidents, resolved incidents and status changes, with a snapshot kept in a named key-value store

It reads the vendor's public JSON: **Atlassian Statuspage** (`/api/v2/summary.json`, `incidents.json`), **incident.io** pages (same endpoints), **Better Stack** pages (`/index.json`) and **Instatus** pages (`/summary.json`). The platform is detected from the page's HTML and headers. No proxy, no login, no API key.

> **Be honest about what this is.** The numbers are computed from the **vendor's own published incidents**. This is **not independent monitoring**: an outage the vendor never posted is not in the data, an incident may be posted late or rated mildly, and a vendor's SLA is decided by its contract, not by this table. Use it to compare vendors, to prepare reviews and to spot trends, not as proof in a dispute.

### Who is it for?

- **Vendor risk and procurement teams** comparing the reliability of SaaS suppliers before a renewal.
- **SRE and platform teams** that build a quarterly report of the third-party outages that affected them.
- **Competitor analysts and product teams** that compare reliability across rival products.
- **Customer success and account teams** that need a quick, sourced answer to "how reliable is this vendor?".

### How to use it

1. Click **Start** with the default input: GitHub, Cloudflare and OpenAI, last 30 days.
2. Replace **Status pages or vendor domains** with your own list (up to 300). An entry can be a status page URL (`https://www.githubstatus.com`), a status host (`status.openai.com`) or a vendor domain (`github.com`). For a domain the Actor tries `status.<domain>` and then the status links on the vendor's home page, footer first.
3. Set the **look-back window** (1 to 90 days), an optional **component filter** (for example `API` or `Actions`) and, if your contract counts partial outages differently, the **downtime weights**.
4. Open the **Status pages**, **Incidents**, **Components** and **Monthly SLA** tabs.

To watch for changes, schedule the Actor and choose **Only pages with changes since the last run**: a row is only added when a new incident opens, an incident is resolved or a status changes (the first run saves the snapshots). Connect the dataset to Slack, e-mail or a webhook.

### Input example

```json
{
    "pages": ["https://www.githubstatus.com", "status.openai.com", "cloudflare.com"],
    "lookbackDays": 30,
    "componentFilter": ["API", "Actions"],
    "weightMajorOutage": 1,
    "weightPartialOutage": 0.5,
    "weightDegraded": 0,
    "mode": "report"
}
```

| Field | Meaning |
| --- | --- |
| `pages` | Up to 300 status page URLs, status hosts or vendor domains. |
| `lookbackDays` | 1 to 90, default 30. |
| `componentFilter` | Only components whose name or group contains one of these words. Incidents that name no component are left out when a filter is set. |
| `weightMajorOutage`, `weightPartialOutage`, `weightDegraded` | Share of an incident's duration that counts as downtime, 0 to 1. Defaults 1, 0.5 and 0. Incident impact `critical` = major outage, `major` = partial outage, `minor` = degraded performance. |
| `mode` | `report` (default): a full row per page. `changes`: a row only when something changed since the last run. |
| `includeUnchanged` | In `changes` mode, also return rows for unchanged pages (off by default; on in the example input so a first try shows rows). |
| `monitorName` | Names the snapshot store, so you can edit the page list without losing history. |

### Output example

Real output of a local run on 2 October 2026 with the default input (30 days). One row per page; the table shows the main figures:

| Page | Platform | Status now | Availability | Incidents (none / minor / major / critical) | MTTR | Figures cover |
| --- | --- | --- | --- | --- | --- | --- |
| GitHub | Atlassian Statuspage | none (all operational) | **99.336 %** (287 weighted minutes) | 16 (0 / 12 / 2 / 2) | 148 min | 30 days |
| Cloudflare Status | Atlassian Statuspage | minor | **99.911 %** | 50 (12 / 38 / 0 / 0) | 393 min | **16 days** (the page lists only its latest 50 incidents) |
| OpenAI | incident.io | none | **99.463 %** | 25 (7 / 14 / 3 / 1) | 248 min | **18 days** (25 incidents listed) |

GitHub's monthly table from the same run (a month that is only partly inside the window is marked `partial`):

| Month | Availability | Weighted downtime | Incidents | Days covered |
| --- | --- | --- | --- | --- |
| 2026-09 | 99.307 % | 287 min | 13 | 28.8 (partial) |
| 2026-10 | 100 % | 0 min | 3 | 1.2 (partial) |

One row (Cloudflare, shortened to two components and two incidents; it has 471 components):

```json
{
    "input": "https://www.cloudflarestatus.com",
    "foundVia": "url",
    "checkedAt": "2026-10-02T05:48:55.398Z",
    "changeStatus": "baseline",
    "changes": null,
    "pageName": "Cloudflare Status",
    "pageUrl": "https://www.cloudflarestatus.com",
    "platform": "atlassian-statuspage",
    "overallStatus": "minor",
    "overallStatusDescription": "Minor Service Outage",
    "operational": false,
    "windowDays": 30,
    "windowStart": "2026-09-02T05:48:55.398Z",
    "windowEnd": "2026-10-02T05:48:55.398Z",
    "effectiveWindowStart": "2026-09-16T02:03:10.004Z",
    "windowCoverage": "partial",
    "coverageNote": "The page lists only its latest 50 incidents, which reach back 16 days; the figures cover those 16 days, not the 30 requested.",
    "weights": { "majorOutage": 1, "partialOutage": 0.5, "degraded": 0 },
    "componentFilter": null,
    "componentCount": 471,
    "componentsNotOperational": 42,
    "components": [
        { "componentId": "57ctn3f2qsyj", "componentName": "Amsterdam, Netherlands - (AMS)", "group": "Europe", "componentStatus": "operational", "componentAvailabilityPct": 100, "componentDowntimeMinutes": 0, "componentIncidentCount": 0, "availabilitySource": "incidents" },
        { "componentId": "y12kn5nkvb44", "componentName": "Amman, Jordan - (AMM)", "group": "Middle East", "componentStatus": "operational", "componentAvailabilityPct": 100, "componentDowntimeMinutes": 0, "componentIncidentCount": 0, "availabilitySource": "incidents" }
    ],
    "availabilityPct": 99.911,
    "downtimeMinutes": 20.6,
    "incidentCount": 50,
    "ongoingIncidents": 1,
    "incidentsByImpact": { "none": 12, "minor": 38, "major": 0, "critical": 0 },
    "mttrMinutes": 392.6,
    "medianResolutionMinutes": 60,
    "longestIncidentMinutes": 13585.6,
    "componentAttribution": "partial",
    "incidents": [
        { "incidentId": "hyv5p7wn1c8v", "incidentName": "Increased Errors for Durable Objects and R2", "impact": "minor", "incidentStatus": "resolved", "startedAt": "2026-10-01T20:59:56.244Z", "resolvedAt": "2026-10-01T21:18:42.733Z", "ongoing": false, "durationMinutes": 18.8, "affectedComponents": ["Durable Objects", "R2"], "affectedComponentsKnown": true, "incidentUrl": "https://www.cloudflarestatus.com/incidents/hyv5p7wn1c8v" },
        { "incidentId": "4c842mwy6z4l", "incidentName": "Intermittent network connectivity issues in Mumbai", "impact": "none", "incidentStatus": "resolved", "startedAt": "2026-10-01T19:30:00.000Z", "resolvedAt": "2026-10-01T19:30:00.000Z", "ongoing": false, "durationMinutes": 0, "affectedComponents": [], "affectedComponentsKnown": false, "incidentUrl": "https://www.cloudflarestatus.com/incidents/4c842mwy6z4l" }
    ],
    "monthlySla": [
        { "month": "2026-09", "monthAvailabilityPct": 99.904, "monthDowntimeMinutes": 20.6, "monthIncidents": 47, "daysCovered": 14.9, "partial": true },
        { "month": "2026-10", "monthAvailabilityPct": 100, "monthDowntimeMinutes": 0, "monthIncidents": 3, "daysCovered": 1.2, "partial": true }
    ],
    "notes": ["17 of 50 incidents name no affected component: they count for the service as a whole but not for any single component."],
    "dataSource": "The vendor's own published status page (incidents and component statuses as the vendor reports them). Not independent monitoring.",
    "error": null,
    "errorMessage": null
}
```

**How the numbers are made**

- **Weighted downtime.** Each incident becomes stretches of time with a status. Where the page records component status changes in the incident's updates (Atlassian does), those are used: a component is degraded from the update that says so until the update that says "operational". Otherwise the incident's impact decides for the components it lists: `critical` = major outage, `major` = partial outage, `minor` = degraded performance. An incident that lists no component counts for the whole service. Overlapping incidents do not add up: at any moment the worst one counts. **Scheduled maintenance never counts.**
- **Availability** = 100 % minus weighted downtime divided by the length of the period. The **service** figure counts every incident; a **component** figure counts the incidents that name it.
- **MTTR** is the mean time from start to resolution of the incidents that are resolved; open incidents are counted as ongoing and run to now in their duration.
- **Monthly table**: the same calculation per UTC calendar month.
- **Better Stack** pages publish their own daily downtime history per component (up to 90 days); the Actor uses that for availability and says so (`availabilitySource: "vendor-history"`).

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Status page checked (one row with components, incidents and SLA figures) | **$0.003** |
| Pages that cannot be read (unreachable, not found, no supported status page, invalid entry) | **free** |

- 100 pages cost **$0.30**; the default run (3 pages) costs **$0.009**.
- In "changes only" mode a page that did not change is still checked, so it is charged, but it adds no row (unless you ask for unchanged rows).
- Apify also charges a tiny standard start fee per run. A run of 100 pages needs about 300 requests (the page itself, then its two JSON documents), spaced politely, and finishes in a few minutes.
- Set **Maximum cost per run** in the run options and the Actor stops when it is reached.

### Limitations

- **Vendor data only.** See the note at the top: published incidents, not measured uptime.
- **Atlassian and incident.io list only their latest incidents** (50 and 25, without paging). A busy vendor may not reach back 30 days: the row then says `windowCoverage: "partial"` with a `coverageNote`, and the figures cover the days the page reaches (above: 16 of 30 days for Cloudflare). Shorten the look-back or run the Actor regularly and keep the datasets for longer history.
- **incident.io pages do not say which components an incident affected**, so they get a service availability and a monthly table but **no per-component availability** (`componentAttribution: "none"`). Other pages may leave some incidents without components (`"partial"`): those count for the service as a whole only.
- **Instatus** publishes only its current status and active incidents in its public JSON, so you get the status and components but **no availability, past incidents or SLA** (`windowCoverage: "current-only"`).
- **Pages that need JavaScript or a login** (other platforms, custom pages) are not supported and come back as a free `unsupported` row. Enter the status page URL if the domain lookup does not find it.
- Times are UTC. A vendor's SLA terms (what counts as downtime, credits, exclusions) are in its contract: change the weights to match them.
- Impact weights are a simple model. A "major" incident that hits one small feature counts as half downtime for the components it lists and for the service.

### FAQ

#### Is this independent uptime monitoring?

No. It is computed from what the vendor itself publishes. It tells you how the vendor reports its own reliability, which is exactly what its customers see.

#### Which status pages work?

Atlassian Statuspage (most large SaaS vendors), incident.io, Better Stack and Instatus pages that do not need JavaScript to read their public JSON. Other pages come back as free `unsupported` rows.

#### Why does a page say "partial" coverage?

Its public JSON lists only the latest incidents (50 at Atlassian, 25 at incident.io). If the oldest listed incident is newer than the start of your window, the Actor cannot know about older ones and computes the figures from where the list starts.

#### Can I change what counts as downtime?

Yes: set the three weights (0 to 1). Impact `critical` is a major outage, `major` a partial outage, `minor` degraded performance.

#### How do I get alerts?

Choose "Only pages with changes since the last run", schedule the Actor (for example every 15 minutes) and connect the dataset or a webhook to Slack, e-mail or Zapier. The first run saves the snapshots.

#### Does it keep my page list?

Only as snapshots (statuses and incident IDs of the public pages) in a named key-value store of your account. No personal data is processed.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a platform or a field you need? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/status-page-sla-monitor/changelog.md

# Actor input Schema

## `pages` (type: `array`):

Up to 300 entries. Each is a status page URL (https://www.githubstatus.com), a status host (status.openai.com) or a vendor domain (github.com). For a domain the Actor tries status.<domain> and the status links on the vendor's home page (footer first). Supported: Atlassian Statuspage, incident.io, Better Stack and Instatus pages.

## `lookbackDays` (type: `integer`):

Incidents and availability are computed for this many days up to now (1 to 90). A page that lists only its latest incidents (Atlassian: 50, incident.io: 25) may not reach back that far; the row says so (windowCoverage, coverageNote) and the figures cover the days it does reach.

## `componentFilter` (type: `array`):

Only report on components whose name or group contains one of these words (case-insensitive), for example API or Actions. Incidents that name no affected component are left out when a filter is set.

## `weightMajorOutage` (type: `number`):

Share of the time that counts as downtime during a major outage (0 to 1).

## `weightPartialOutage` (type: `number`):

Share of the time that counts as downtime during a partial outage (0 to 1).

## `weightDegraded` (type: `number`):

Share of the time that counts as downtime during degraded performance (0 to 1).

## `mode` (type: `string`):

Full report: one row per page with everything, plus a changes section when an earlier snapshot exists. Changes only: a row only for pages where something changed since the last run (and the first snapshot of each page).

## `includeUnchanged` (type: `boolean`):

In "changes only" mode, also add a row for pages with no changes. Off by default so alerts only fire on changes. It is switched on in the example input only so a first try shows a row for every page.

## `monitorName` (type: `string`):

Name of this monitor's snapshot store (letters, digits, spaces, - and \_). Runs with the same name share snapshots. Leave empty to derive it from the page list; then adding or removing a page starts a new monitor.

## Actor input object example

```json
{
  "pages": [
    "https://www.githubstatus.com",
    "https://www.cloudflarestatus.com",
    "https://status.openai.com"
  ],
  "lookbackDays": 30,
  "weightMajorOutage": 1,
  "weightPartialOutage": 0.5,
  "weightDegraded": 0,
  "mode": "report",
  "includeUnchanged": true
}
```

# Actor output Schema

## `pages` (type: `string`):

No description

## `incidents` (type: `string`):

No description

## `components` (type: `string`):

No description

## `monthlySla` (type: `string`):

No description

# 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 = {
    "pages": [
        "https://www.githubstatus.com",
        "https://www.cloudflarestatus.com",
        "https://status.openai.com"
    ],
    "lookbackDays": 30,
    "includeUnchanged": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/status-page-sla-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 = {
    "pages": [
        "https://www.githubstatus.com",
        "https://www.cloudflarestatus.com",
        "https://status.openai.com",
    ],
    "lookbackDays": 30,
    "includeUnchanged": True,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/status-page-sla-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 '{
  "pages": [
    "https://www.githubstatus.com",
    "https://www.cloudflarestatus.com",
    "https://status.openai.com"
  ],
  "lookbackDays": 30,
  "includeUnchanged": true
}' |
apify call offerastudio/status-page-sla-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/status-page-sla-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/cKUPCbhuseX0GhkhE/builds/jbukCbhYEsA13g4kt/openapi.json
