Website Uptime Monitor avatar

Website Uptime Monitor

Pricing

from $2.00 / 1,000 url checkeds

Go to Apify Store
Website Uptime Monitor

Website Uptime Monitor

Bulk uptime monitor returning HTTP status, SSL expiry, content match, response time, A-F performance grade, 0-100 health score, and a specific failure diagnostic per URL — all in one call. Built for DevOps, SREs, SaaS founders, agencies, and AI agents.

Pricing

from $2.00 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Website Uptime Monitor — Health Score, SSL, Content Match

Bulk uptime monitor for websites and APIs. One call returns HTTP status, SSL certificate expiry, content keyword match, response time, an A–F performance grade, a composite 0–100 health score, and a specific failure diagnostic (DNS, SSL, timeout, 5xx, content mismatch, …) per URL.

Built for DevOps teams, SRE engineers, SaaS founders, agencies, and AI agents that need to verify a site is actually working — not just returning a status code.

What you get per URL

FieldMeaning
isUptrue only if the URL returned an expected status AND any keyword match passed
healthScore0–100, penalized for slow responses, SSL issues, redirects, content mismatches
performanceGradeA (<300 ms), B (<600 ms), C (<1.2 s), D (<2.5 s), F (slower or down)
statusCode / statusTextFinal HTTP status after redirects
responseTimeMsTime to final response in milliseconds
sslIssuer, valid-from, valid-to, days until expiry, expired/expiring flags
contentMatchWhether the response body contains your keyword or matches your regex
redirectsOrdered chain of every hop
headersServer, content-type, content-length, cache-control, x-powered-by
diagnosticWhen down: kind (dns_error, ssl_expired, timeout, 5xx, …) + message + actionable suggestion

A run summary and a shareable HTML report are also written to the default key-value store.

Why this monitor

Most uptime checkers tell you "the server replied with 200." That's not enough. A 200 with the wrong content (broken React app, blank page, "Maintenance" splash) is still down for your users. Your monitor should know.

This actor combines:

  1. HTTP status + redirects — what every checker does.
  2. SSL inspection — issuer, expiry date, "expiring in N days" warnings (avoid the typical "we forgot to renew" outage).
  3. Content match — verify the page actually contains the text it should ("Sign up", "Add to cart", "OK").
  4. Performance grade — instant signal for slow-down detection.
  5. Composite health score — one 0–100 number an agent or dashboard can branch on.
  6. Failure diagnostics — when down, the actor tells you why and what to do.

Quick start

Apify Console

  1. Open the actor and click Start.
  2. Add URLs to URLs to monitor.
  3. (Optional) set a Content keyword like Sign up to verify the page rendered.
  4. Click Start and watch results stream in.

Apify API (curl)

curl -X POST "https://api.apify.com/v2/acts/khadinakbar~website-uptime-monitor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [
{ "url": "https://example.com" },
{ "url": "https://api.example.com/health" }
],
"keyword": "OK",
"checkSsl": true,
"timeoutMs": 15000
}'

JavaScript (apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('khadinakbar/website-uptime-monitor').call({
startUrls: [{ url: 'https://example.com' }],
keyword: 'Example Domain',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].healthScore, items[0].diagnostic);

Python (apify-client)

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("khadinakbar/website-uptime-monitor").call(run_input={
"startUrls": [{"url": "https://example.com"}],
"keyword": "Example Domain",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["url"], item["healthScore"], item["diagnostic"])

MCP (Claude / GPT / agents)

Once available in the Apify MCP server, an agent can call:

apify--website-uptime-monitor
startUrls: [{ url: "https://example.com" }]
keyword: "Sign up"

and branch on the returned healthScore. Sub-second for a single URL, capped cost ≈ $0.002 + $0.00005 start.

Pricing — Pay Per Event

EventPriceWhen charged
actor-start$0.00005 per GB-RAMOnce when the run starts (covers compute usage)
url-checked$0.002 per URLEach URL that completes (up or down)

Examples:

  • 1 URL agent call → $0.002 + $0.00005 ≈ $0.0021
  • 50 URL daily run → $0.10 + $0.00005 ≈ $0.10
  • 1,000 URL bulk audit → $2.00 + $0.00005 ≈ $2.00
  • 10,000 URL run → $20.00 + $0.00005 ≈ $20.00

No hidden setup fees. No per-result tier traps. Failed URLs are charged the same as successful ones because they consume the same work and produce the same diagnostic data.

Input fields

FieldTypeDefaultNotes
startUrlsarray of { url }sample 3 URLsStandard Apify URL list
urlsarray of strings[]Simpler alternative for AI agents
keywordstringnullCase-insensitive substring required in body
regexstringnullCase-insensitive regex required in body (overrides keyword)
expectedStatusCodesarray of integers[] (= 2xx/3xx OK)Strict allowlist e.g. [200]
methodenumGETGET / HEAD / POST / PUT / DELETE / OPTIONS
checkSslbooleantrueInspect SSL on HTTPS URLs
followRedirectsbooleantrueFollow 3xx
maxRedirectsinteger5Hop limit
timeoutMsinteger30000Per-request timeout
maxConcurrencyinteger20Parallel workers (1–100)
userAgentstringdefault UACustom UA
useApifyProxybooleanfalseRoute through Apify proxy
proxyConfigurationobject{}Full proxy config

Output

Dataset (one item per URL)

{
"url": "https://example.com/",
"isUp": true,
"healthScore": 100,
"performanceGrade": "A",
"statusCode": 200,
"statusText": "OK",
"responseTimeMs": 187,
"ssl": {
"checked": true,
"valid": true,
"issuer": "Let's Encrypt",
"subject": "example.com",
"daysUntilExpiry": 64,
"isExpired": false,
"isExpiringSoon": false
},
"contentMatch": {
"checked": true,
"found": true,
"keyword": "Example Domain",
"matchType": "keyword"
},
"redirects": [],
"finalUrl": "https://example.com/",
"headers": {
"server": "ECAcc (lac/55B0)",
"contentType": "text/html; charset=UTF-8",
"contentLength": 1256
},
"diagnostic": null,
"checkedAt": "2026-05-03T19:55:00.000Z",
"durationMs": 213
}

Key-value store

KeyTypeDescription
SUMMARYJSONAggregated metrics: total / up / down, uptime %, avg response time, avg health score, SSL/grade/diagnostic breakdowns
REPORTHTMLSortable table report, shareable link
RUN_CONFIGJSONSnapshot of effective run settings

Diagnostic kinds

When isUp is false (or quality is degraded), diagnostic.kind will be one of:

KindMeaning
dns_errorDNS lookup failed (ENOTFOUND, EAI_AGAIN)
connection_refusedServer actively refused the connection
connection_resetServer closed the connection mid-flight
timeoutRequest exceeded timeoutMs
ssl_errorSSL handshake failed (untrusted, self-signed, …)
ssl_expiredCertificate expiration date in the past
4xxClient error (404 / 403 / 429 / …)
5xxServer error
content_mismatchResponse OK but keyword / regex not found
network_errorOther network failure
invalid_urlURL string could not be parsed
internal_errorBug in the actor (please report)

Each diagnostic includes a message and an actionable suggestion.

Use cases

  • SaaS founders — daily check that landing pages, signup, and pricing pages are alive and contain the right text.
  • DevOps / SRE — pre-deploy and post-deploy uptime sweeps with content verification (your /health endpoint really returns OK).
  • Agencies — white-label client uptime reports with SSL expiry warnings 30 days ahead.
  • E-commerce — verify product pages render the Add to cart button before peak traffic events.
  • AI agents — pre-flight check before scraping or transacting against a target ("is this site up?").
  • Marketing teams — confirm campaign landing pages are live before launching ads.
  • SEO — detect 404s, redirect chains, and slow pages affecting crawl budget and rankings.

Health score formula

Starting from 100, the score is reduced by:

  • Status code: −10 if 3xx, −50 if 4xx, −80 if 5xx
  • Response time: −5 (>600 ms), −10 (>1.2 s), −20 (>2.5 s), −30 (>5 s)
  • SSL: −10 if expiring within 30 days, −25 if invalid, −40 if expired
  • Content: −30 if keyword/regex not found
  • Diagnostic: capped at 30 if any diagnostic is present

A 100 means: 200 status, fast response, valid SSL with >30 days left, content match passed.

Scheduling and alerting

Pair with Apify Scheduler to run every N minutes/hours. Combine with the Apify webhooks (built-in) to ping Slack / Discord / PagerDuty / your own endpoint when a run produces any isUp: false records.

For full alert workflows, route the dataset into n8n / Make / Zapier — every modern automation tool has an Apify connector.

FAQ

Why is isUp: false even though statusCode: 200? Because your keyword or regex did not match the response body. The page returned but didn't render the expected text — usually a soft failure that only this monitor will catch.

Why is SSL checked: false? The URL is plain HTTP (not HTTPS), or you set checkSsl: false.

Can I monitor APIs that require headers/auth? Currently, custom request headers and bodies aren't input fields. Open an issue if you need them — easy add.

Does it support POST checks? Yes — set method to POST (or any HTTP verb). The body is empty for now.

Can I run from a specific country? Yes — set useApifyProxy: true and configure proxyConfiguration.countryCode (e.g., "DE").

What's the maximum concurrency? 100. Default is 20, which handles bulk runs of 1,000+ URLs in seconds.

This actor only sends standard HTTP requests with a transparent User-Agent (ApifyUptimeMonitor/1.0). It does not bypass security, scrape protected content, or store any credentials. You are responsible for ensuring you have permission to monitor any URL you submit; do not use this actor against sites where you have no authorization. By using this actor you agree to the Apify Store Terms of Use.

See the full portfolio at https://apify.com/khadinakbar.