Website Uptime Monitor
Pricing
from $2.00 / 1,000 url checkeds
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
| Field | Meaning |
|---|---|
isUp | true only if the URL returned an expected status AND any keyword match passed |
healthScore | 0–100, penalized for slow responses, SSL issues, redirects, content mismatches |
performanceGrade | A (<300 ms), B (<600 ms), C (<1.2 s), D (<2.5 s), F (slower or down) |
statusCode / statusText | Final HTTP status after redirects |
responseTimeMs | Time to final response in milliseconds |
ssl | Issuer, valid-from, valid-to, days until expiry, expired/expiring flags |
contentMatch | Whether the response body contains your keyword or matches your regex |
redirects | Ordered chain of every hop |
headers | Server, content-type, content-length, cache-control, x-powered-by |
diagnostic | When 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:
- HTTP status + redirects — what every checker does.
- SSL inspection — issuer, expiry date, "expiring in N days" warnings (avoid the typical "we forgot to renew" outage).
- Content match — verify the page actually contains the text it should ("Sign up", "Add to cart", "OK").
- Performance grade — instant signal for slow-down detection.
- Composite health score — one 0–100 number an agent or dashboard can branch on.
- Failure diagnostics — when down, the actor tells you why and what to do.
Quick start
Apify Console
- Open the actor and click Start.
- Add URLs to URLs to monitor.
- (Optional) set a Content keyword like
Sign upto verify the page rendered. - 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 ApifyClientclient = 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-monitorstartUrls: [{ 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
| Event | Price | When charged |
|---|---|---|
actor-start | $0.00005 per GB-RAM | Once when the run starts (covers compute usage) |
url-checked | $0.002 per URL | Each 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
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls | array of { url } | sample 3 URLs | Standard Apify URL list |
urls | array of strings | [] | Simpler alternative for AI agents |
keyword | string | null | Case-insensitive substring required in body |
regex | string | null | Case-insensitive regex required in body (overrides keyword) |
expectedStatusCodes | array of integers | [] (= 2xx/3xx OK) | Strict allowlist e.g. [200] |
method | enum | GET | GET / HEAD / POST / PUT / DELETE / OPTIONS |
checkSsl | boolean | true | Inspect SSL on HTTPS URLs |
followRedirects | boolean | true | Follow 3xx |
maxRedirects | integer | 5 | Hop limit |
timeoutMs | integer | 30000 | Per-request timeout |
maxConcurrency | integer | 20 | Parallel workers (1–100) |
userAgent | string | default UA | Custom UA |
useApifyProxy | boolean | false | Route through Apify proxy |
proxyConfiguration | object | {} | 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
| Key | Type | Description |
|---|---|---|
SUMMARY | JSON | Aggregated metrics: total / up / down, uptime %, avg response time, avg health score, SSL/grade/diagnostic breakdowns |
REPORT | HTML | Sortable table report, shareable link |
RUN_CONFIG | JSON | Snapshot of effective run settings |
Diagnostic kinds
When isUp is false (or quality is degraded), diagnostic.kind will be one of:
| Kind | Meaning |
|---|---|
dns_error | DNS lookup failed (ENOTFOUND, EAI_AGAIN) |
connection_refused | Server actively refused the connection |
connection_reset | Server closed the connection mid-flight |
timeout | Request exceeded timeoutMs |
ssl_error | SSL handshake failed (untrusted, self-signed, …) |
ssl_expired | Certificate expiration date in the past |
4xx | Client error (404 / 403 / 429 / …) |
5xx | Server error |
content_mismatch | Response OK but keyword / regex not found |
network_error | Other network failure |
invalid_url | URL string could not be parsed |
internal_error | Bug 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
/healthendpoint really returnsOK). - 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/regexnot 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.
Legal & disclaimer
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.
Related actors by khadinakbar
- Broken Link Checker — find every broken link on a site.
- Bulk Website Contact Extractor — pull emails/phones/socials from any list of domains.
- Contact Details Scraper — single-domain contact extraction.
See the full portfolio at https://apify.com/khadinakbar.