# Website Availability Checker — Pingdom Alternative (`khadinakbar/pingdom-alternative`) Actor

Check public website and API endpoints on demand. Return HTTP status, response time, redirects, TLS details, and expected-text checks per URL for deployment reviews and operational triage.

- **URL**: https://apify.com/khadinakbar/pingdom-alternative.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Developer tools, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 availability checks

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Availability Checker — Pingdom Alternative

Check public website and API endpoints on demand. Return HTTP status, response time, redirects, TLS details, and expected-text checks per URL for deployment reviews and operational triage. For deployment operators, each dataset row is one current endpoint observation rather than a continuous monitoring history.

### Workflow: put the results to work

List the public endpoints that must respond after a deployment. Specify acceptable HTTP statuses and a stable health phrase where useful, then inspect each endpoint observation. Use a monitoring system for continuous probes, alert delivery, or private-network checks.

### When to use it

Use this Actor when you need a bounded programmatic release check for public websites, health endpoints, landing pages, or read-only API endpoints. Start with a small list of canonical public URLs, define the HTTP statuses that mean healthy, and optionally require a stable response phrase.

For private-network services, authenticated endpoints, browser journeys, customer telemetry, recurring alerts, or continuous uptime history, select a workflow designed for that scope. This Actor accepts public standard-port HTTP(S) endpoints and rejects local, credentialed, private, and non-standard-port URLs before a network request is made.

### Deployment-check workflow

A release operator starts with the small set of public endpoints that must be healthy after a deployment, then supplies the expected HTTP status and a stable health phrase when it matters. The Actor returns one current record per endpoint, the operator reads the Dataset plus `OUTPUT` to identify any unavailable or indeterminate observations, and the team can then continue with the appropriate release or incident workflow.

### What it returns

One Dataset row represents one endpoint availability report.

| Field                                             | Meaning                                                                                              |
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `availabilityState`                               | `available`, `unavailable`, or `indeterminate` based on the bounded check.                           |
| `statusCode`, `responseTimeMs`                    | Final HTTP response and elapsed time across accepted redirects.                                      |
| `tls`                                             | Certificate validity, issuer, subject, expiry, and a safe TLS diagnostic when available.             |
| `contentExpectation`                              | Whether the optional expected text was checked and matched; the text itself is redacted from output. |
| `diagnostic`                                      | Actionable status, content, DNS, timeout, connection, TLS, or safe-target explanation.               |
| `targetUrl`, `finalUrl`, `redirects`, `checkedAt` | Source, final destination, accepted redirect path, and observation time.                             |

The default key-value store also writes `OUTPUT` and `RUN_SUMMARY` on every terminal path. They expose the named outcome, persisted and incomplete counts, named-event charges, accepted targets, and warnings without including request credentials or response bodies.

### Quick start

```json
{
    "targets": [{ "url": "https://example.com" }, { "url": "https://example.com/health" }],
    "expectedStatusCodes": [200],
    "expectedText": "healthy",
    "checkTls": true,
    "timeoutSecs": 20,
    "maxRedirects": 3
}
```

The expected text is checked only in the first 512 KB of the final response and is redacted from actor output. Leave it blank for an HTTP-only availability check.

### Example result

```json
{
    "reportId": "availability-7d2c53f6a91a",
    "reportType": "deployment-availability-check",
    "targetUrl": "https://example.com/health",
    "finalUrl": "https://example.com/health",
    "availabilityState": "available",
    "isAvailable": true,
    "statusCode": 200,
    "responseTimeMs": 184,
    "redirects": [],
    "tls": {
        "checked": true,
        "valid": true,
        "issuer": "Example Certificate Authority",
        "subject": "example.com",
        "validTo": "ISO-8601 certificate expiration timestamp",
        "daysUntilExpiry": 116,
        "error": null
    },
    "contentExpectation": {
        "checked": true,
        "matched": true,
        "bodyTruncated": false
    },
    "diagnostic": null,
    "checkedAt": "ISO-8601 timestamp at completion"
}
```

### Outcomes and operational states

| Outcome           | What it means                                                                                                                                 |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `COMPLETE`        | Every accepted endpoint produced a validated, persisted availability report. An unavailable endpoint is still a useful completed observation. |
| `PARTIAL`         | At least one report was persisted, while a target was rejected, a storage write was incomplete, or a caller cost cap stopped further checks.  |
| `INVALID_INPUT`   | The supplied endpoints, status codes, or expected text can be corrected before retrying; Dataset rows remain source-derived.                  |
| `UPSTREAM_FAILED` | Valid public targets were accepted, while an availability report was not persisted.                                                           |
| `CONFIG_ERROR`    | The deployed Actor requires a configuration review before its advertised workflow can begin.                                                  |

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~pingdom-alternative/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": [{"url": "https://example.com/health"}],
    "expectedStatusCodes": [200],
    "expectedText": "healthy"
  }'
```

After completion, read the default Dataset for endpoint reports and the `OUTPUT` and `RUN_SUMMARY` keys for the terminal contract.

### AI agent and MCP prompt card

> Use this focused Actor through the available Apify MCP or Actor API path to check these authorized public deployment URLs for expected HTTP status, TLS validity, redirects, and an optional stable health phrase. Read back the Dataset and `OUTPUT`, preserve each source URL and collection time, state the named outcome and cost boundary, and treat `indeterminate` as a safe-probe boundary rather than proof that the service is down.

### How this workflow compares with Pingdom

| Decision                | This Actor                                                                                                            | Pingdom                                                             | Best fit                                                                         |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Bounded job             | On-demand public endpoint availability records.                                                                       | Broader website monitoring service.                                 | Use this Actor for a small programmatic deployment check.                        |
| Input                   | One to five public URLs with explicit HTTP, TLS, content, timeout, and redirect expectations.                         | Broader monitoring configuration.                                   | Use this Actor when the release contract is already known and small.             |
| Billing                 | Per persisted report plus Apify platform usage.                                                                       | Subscription configuration on its pricing page.                     | Compare exact cost only for a dated, equal workload.                             |
| Output                  | Structured Dataset and terminal records.                                                                              | Monitoring product interface and its broader feature set.           | Use this Actor when a JSON-like per-endpoint record is needed downstream.        |
| Freshness               | `checkedAt` and source URL on each current record.                                                                    | Ongoing and historical monitoring capabilities.                     | Use this Actor for a point-in-time check.                                        |
| Programmatic interface  | Actor API call with Dataset and terminal-record readback; named client integrations remain outside the current claim. | Broader product workflow.                                           | Choose based on the required operating surface.                                  |
| Effective efficiency    | A same-job timing and usable-output comparison is pending final private-build evidence.                               | No equal-workload timing has been captured.                         | Select either product only after an equal-workload throughput claim is measured. |
| Continuous monitoring   | Out of scope.                                                                                                         | Designed for ongoing monitoring.                                    | Choose Pingdom when recurring probes and alerting are required.                  |
| RUM and transactions    | Out of scope.                                                                                                         | Product scope includes those capabilities.                          | Choose Pingdom for user telemetry or browser-flow monitoring.                    |
| Pricing and reliability | Exact same-job comparison is pending final private-build evidence.                                                    | Current plan comparison is pending a documented same-job benchmark. | Select either product only after a cost or reliability claim is measured.        |

Pingdom is a trademark of its owner. This independent Actor is not affiliated, associated, or endorsed by Pingdom.

### Best results

- Supply only endpoints you are authorized to assess and expect to be publicly reachable.
- Use a stable health phrase, not a changing timestamp, for `expectedText`.
- Prefer a dedicated public health route for API checks.
- Keep the run small and schedule a saved task only after validating one representative report.
- Treat DNS, TLS, redirect, and safe-target diagnostics as the start of operational investigation, not as an automated remediation instruction.

### Builder's note

I designed this Actor to make one release or incident check reproducible through a bounded input, a small per-endpoint record, and honest terminal outcomes. My goal was to keep public endpoint provenance, TLS observations, and safe diagnostics visible while concentrating the workflow on an on-demand deployment decision.

### Responsible use

Check only public endpoints you are authorized to assess. Follow applicable laws, service terms, and your organization's security and operations policies. The actor records endpoint availability metadata, not page content, credentials, cookies, request bodies, or customer telemetry.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/pingdom-alternative/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `availability-check` | Availability check | Charged once for each validated endpoint availability report persisted to the Dataset. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

# Actor input Schema

## `targets` (type: `array`):

One to five authorized public HTTP(S) URLs to check, such as https://example.com/health. Each accepted URL creates one timestamped Dataset report. Local, private, credentialed, non-HTTP(S), and non-standard-port targets are rejected.

## `expectedStatusCodes` (type: `array`):

HTTP status codes that count as available, for example \[200, 204]. Defaults to \[200, 204], so redirects are followed before the final response is evaluated. This is not a request body or a way to send an authenticated request.

## `expectedText` (type: `string`):

Optional case-sensitive text that must appear in the first 512 KB of a successful response, for example healthy. Leave empty to check HTTP availability only. This text is evaluated but never written into Dataset, OUTPUT, RUN\_SUMMARY, or logs.

## `checkTls` (type: `boolean`):

When enabled, inspect the certificate presented by each HTTPS endpoint and report its validity and expiry when available. Defaults to true. It does not add browser rendering, authentication, or private-network access.

## `timeoutSecs` (type: `integer`):

Maximum time for each HTTP request, from 3 to 60 seconds. Defaults to 20 seconds to make deployment checks fail predictably. This is not a whole-run timeout or a retry count.

## `maxRedirects` (type: `integer`):

Maximum public HTTP(S) redirect hops to follow, from 0 to 5. Defaults to 3 and records the accepted redirect chain. Redirects to unsafe hosts or non-standard ports fail safely instead of being followed.

## `maxConcurrency` (type: `integer`):

Number of endpoint checks run in parallel, from 1 to 5. Defaults to 3 for considerate, low-blast-radius monitoring. This setting does not create continuous monitoring or independent geographic probes.

## Actor input object example

```json
{
  "targets": [
    {
      "url": "https://example.com/health"
    }
  ],
  "expectedStatusCodes": [
    200,
    204
  ],
  "expectedText": "healthy",
  "checkTls": true,
  "timeoutSecs": 20,
  "maxRedirects": 3,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `reports` (type: `string`):

Dataset rows with availability state, HTTP response, redirects, TLS result, safe diagnostic, and collection time.

## `output` (type: `string`):

Stable outcome, report count, failed-check count, named event count, and warnings.

## `runSummary` (type: `string`):

Detailed terminal state, accepted targets, validation decisions, check outcomes, and charge count.

# 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 = {
    "targets": [
        {
            "url": "https://example.com"
        }
    ],
    "expectedStatusCodes": [
        200
    ],
    "expectedText": "",
    "checkTls": true,
    "timeoutSecs": 20,
    "maxRedirects": 3,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/pingdom-alternative").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 = {
    "targets": [{ "url": "https://example.com" }],
    "expectedStatusCodes": [200],
    "expectedText": "",
    "checkTls": True,
    "timeoutSecs": 20,
    "maxRedirects": 3,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/pingdom-alternative").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 '{
  "targets": [
    {
      "url": "https://example.com"
    }
  ],
  "expectedStatusCodes": [
    200
  ],
  "expectedText": "",
  "checkTls": true,
  "timeoutSecs": 20,
  "maxRedirects": 3,
  "maxConcurrency": 3
}' |
apify call khadinakbar/pingdom-alternative --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/pingdom-alternative"
        }
    }
}
```

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/hZG8bz0N4Zdr4YAsy/builds/pgyMAKyPWX3byHysJ/openapi.json
