Website Uptime & Status Checker avatar

Website Uptime & Status Checker

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Website Uptime & Status Checker

Website Uptime & Status Checker

Check public websites: HTTP status, response time, redirects and TLS verification in a flat JSON or CSV table. No target-site API key.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

ninhothedev

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

7

Monthly active users

16 hours ago

Last modified

Share

Check public websites in one run and export a flat status table: HTTP status, response time, redirects and TLS verification. Use scheduled snapshots for a health dashboard or a post-deployment smoke check. No target-site API key or login is required.

Start with one URL

Paste a URL into URLs to check, then start the Actor. The Console prefills one small example. For the API, supply urls explicitly:

{"urls": ["https://example.com"], "maxItems": 1}

Open Status results (JSON) or Download CSV when the run finishes. A reported outage is a valid measurement: an Actor run can succeed while a checked website is down.

What the result means

  • up: true: the final HTTP response was 200–399. Redirects with a Location header are followed, up to 10 hops.
  • up: false: HTTP 400–599, a network failure or an exhausted deadline. A 403 or 429 means this client was denied or limited; it does not prove the site is down for everyone.
  • ssl_valid: true: the final HTTPS connection passed certificate verification. false specifically means certificate verification failed. null means HTTP or no conclusive certificate result, for example a timeout or DNS failure.
  • response_time_ms: elapsed time through DNS and redirects to the final response headers, or to failure. Response bodies are not downloaded in full. This measures neither full page load time nor browser rendering.
  • error_type: stable category for network/policy failures. HTTP error status codes have error: null; inspect status_code.

Each URL is checked once, without a retry that could hide a brief outage or double the timeout. Requests use an HTTP client with a Chrome TLS fingerprint; there is no JavaScript rendering or guaranteed access through bot protection.

Input

FieldDefaultBehavior
urlsRequired; Console prefill is https://example.comPublic HTTP(S) URLs. Bare domains use HTTPS. Fragments are removed; normalized duplicates yield one row.
modecheckKept for compatibility; only check is supported.
timeoutSec15Integer 1–120. One total deadline for DNS and all redirect requests.
maxItems200Integer 1–2000. Global cap after URL normalization and deduplication.

All supplied URLs and option types are validated before HTTP work, including URLs beyond the cap. Empty input {}, empty lists, unsupported schemes, credentials in URLs and non-public hosts are rejected. Schemes/hosts are case normalized, default ports are omitted and an empty path becomes /. Query parameters and path case are preserved. Output rows can arrive in any order.

Public addresses are checked before each request and redirect, and the DNS answer is pinned for the connection. Private IPs, loopback, link-local hosts and mixed public/private DNS answers are unsupported. This Actor cannot check your local development server or private network.

A bounded list

{
"urls": ["https://example.com", "https://www.iana.org"],
"timeoutSec": 10,
"maxItems": 2
}

Output

Illustrative values; timing and server headers vary:

{
"url": "https://example.com/",
"up": true,
"status_code": 200,
"response_time_ms": 143,
"final_url": "https://example.com/",
"redirected": false,
"server": "cloudflare",
"content_type": "text/html",
"content_length": null,
"ssl_valid": true,
"error": null,
"error_type": null,
"checked_at": "2026-09-05T18:46:03+00:00",
"source": "uptime-monitor",
"scraped_at": "2026-09-05T18:46:03+00:00"
}

One dataset row represents one normalized URL observation. Existing field names are retained; error_type is additive. url is the normalized original target; final_url is known only after a final response. redirected records followed redirects. content_length is the nonnegative server-provided Content-Length header, not the number of bytes downloaded. Server/content headers may be absent. Times are UTC ISO 8601; response time is integer milliseconds. HTTP status, final URL, headers and TLS status can be null when a request fails. Blocked-target diagnostics use the same field structure in SKIPPED_TARGETS but are not dataset results.

Failure categories: timeout, dns_error, connection_error, tls_error, tls_certificate_error, redirect_limit, blocked_target, network_error. Unexpected internal exceptions fail the Actor instead of becoming billable outage rows.

Pricing and limits

The current published price is $0.0005 per delivered status row ($0.50 per 1,000) plus $0.00005 per Actor start at this Actor's 512 MB memory setting. Price settings in the Store are authoritative. This release does not change prices.

ScenarioActor event fees
1 URL, one run$0.00055
100 URLs, one run$0.05005
1,000 URLs, one run (maxItems: 1000)$0.50005
100 URLs hourly for 30 days (720 runs)$36.036

Down and timeout observations are chargeable measurements when delivered, just like up results. Targets resolving or redirecting to non-public/unsupported addresses are skipped and recorded in the uncharged SKIPPED_TARGETS key-value-store record instead of the dataset. Normalized duplicates and URLs excluded by the global cap produce no rows. There are no paid target APIs or proxies in this Actor. Apify account charges, applicable tax and any separately enabled platform-usage charges are outside these event-fee examples; check the run's pricing preview.

Use Apify's maximum cost per run alongside maxItems. Work is scheduled in waves of at most 10 and restricted to the SDK's remaining chargeable row count. Results are pushed as they finish; no new wave starts after the limit. Synthetic dataset events are charged automatically by Apify and are never charged manually a second time.

On resurrection, URLs already present in the run's default dataset are skipped. Start a new run to obtain a fresh observation. An interrupted in-flight check without a stored row can be repeated. A non-graceful abort can prevent unfinished work from being delivered.

Recurring monitoring and limitations

Use Apify Schedules to collect observations repeatedly, then use a dataset integration or your own workflow to inspect up, status_code and error_type. A run-success webhook alone is not a website-down alert. This Actor does not itself send notifications, calculate historical uptime percentages, inspect certificate expiry, or guarantee a 99% service level. Measurements reflect one run location and one moment; a single snapshot does not establish an SLA.

Troubleshooting

403/429: inspect the status and compare from your own browser. The target may block this client or rate-limit it.

DNS or timeout: confirm the domain is public and reachable; increase timeoutSec if the target is legitimately slow. TLS status stays unknown unless certificate verification produces a conclusive result.

Fewer rows: check maxItems, deduplication, the maximum run cost, and whether this run was resurrected with existing rows.

For a bug, open the Actor's Issues tab with the run ID, expected behavior and a minimal public test URL. Remove sensitive query parameters before sharing.

Development

Python 3.11+; install requirements.txt and requirements-dev.txt in a virtual environment. Run deterministic tests with python -m pytest -q. To exercise the real Actor runtime, put the example input into storage/key_value_stores/default/INPUT.json and run apify run with the virtual environment active. Local storage is not uploaded to Apify.