Website Uptime Monitor โ SSL, Health Score & Alerts
Pricing
from $2.00 / 1,000 url checkeds
Website Uptime Monitor โ SSL, Health Score & Alerts
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 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 =newApifyClient({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.
- Google SERP Scraper โ spot ranking pages that go down so you can prioritize fixes before they lose traffic.
- 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.
