Websites (Monitors)

A “website” (referred to as a “monitor” in some responses) is the core resource in PingPing. Each monitor carries a URL plus the two checks PingPing runs against it: an uptime check and a certificate health check.

All requests below require a Bearer token. See Authentication for details.

Retrieve all websites (monitors)

GET https://pingping.io/webapi/monitors

Returns an array of every monitor on the authenticated account, with their current check status inlined.

Response 200

200 OK
[
{
  "id": 3,
  "identifier": "iolqRzxr",
  "alias": "google.com",
  "scheme": "https",
  "host": "google.com",
  "port": "",
  "url": "https://google.com/",
  "status_page": "https://pingping.io/iolqRzxr",
  "checks": {
    "uptime": {
      "id": 5,
      "status": "ok",
      "error": null,
      "interval": 30,
      "is_enabled": true,
      "notification_threshold": 0,
      "last_check_at": "2026-05-31 14:56:03",
      "meta": {
        "http_status_code": 200,
        "average_uptime_percentage": 100,
        "average_response_time": 0.17569,
        "offline_since": null
      }
    },
    "certificate_health": {
      "id": 6,
      "status": "ok",
      "error": null,
      "interval": 86400,
      "is_enabled": true,
      "notification_threshold": 604800,
      "last_check_at": "2026-05-31 14:56:10",
      "meta": {
        "issuer": "TeleSec ServerPass Class 2 CA",
        "signature_algorithm": "RSA-SHA256",
        "is_self_signed": false,
        "valid_from": "2026-02-14 05:30:26",
        "valid_to": "2027-02-19 23:59:59"
      }
    }
  }
}
]

Retrieve a specific website (monitor)

GET https://pingping.io/webapi/monitors/{id}

Path parameters

NameTypeDescription
idnumberThe monitor id. Use the id field from the list response, not the identifier.

Returns the same shape as a single element of the list endpoint above.

Response 404

404 Not Found
{
"message": "No monitor found with that id."
}

Retrieve statistics from a specific website (monitor)

GET https://pingping.io/webapi/monitors/{id}/statistics

Returns the daily uptime history and the daily response-time history of one monitor, newest first, dated in the account’s timezone, for every day PingPing has stored. There is no date filter and no pagination, so a monitor that has been checked for years returns its whole history in one response. A day’s entries are written a few minutes after midnight in the account’s timezone, so from then on yesterday is the newest day. Days can be missing, and the two lists do not always cover the same days, so match entries by date, not by position.

Path parameters

NameTypeDescription
idnumberThe monitor id.

Response 200

200 OK
{
"uptimes": [
  {
    "date": "2026-10-26",
    "uptime_percentage": 100,
    "downtime_in_seconds": 0
  },
  {
    "date": "2026-10-25",
    "uptime_percentage": 99.89,
    "downtime_in_seconds": 93
  }
],
"response_times": [
  {
    "date": "2026-10-26",
    "time_namelookup": 0.029886,
    "time_tcp_connection": 0.044678,
    "time_redirect": 0,
    "time_content_generation": 0.021374,
    "time_content_transfer": 0.013167,
    "time_total": 0.109105
  },
  {
    "date": "2026-10-25",
    "time_namelookup": 0.030485,
    "time_tcp_connection": 0.040476,
    "time_redirect": 0,
    "time_content_generation": 0.019742,
    "time_content_transfer": 0.012513,
    "time_total": 0.103216
  }
]
}

uptimes entries

NameTypeDescription
datestringThe day, as YYYY-MM-DD in the account’s timezone.
uptime_percentagenumberThe share of that day the website was up, with two decimals. 100 means no confirmed downtime.
downtime_in_secondsnumberThe seconds of confirmed downtime on that day.

response_times entries

Each timing is the average over that day’s checks that received a response, in seconds. On a day without checks, or when no check got a response, the timings are null.

NameTypeDescription
datestringThe day, as YYYY-MM-DD in the account’s timezone.
time_namelookupnumberDNS lookup.
time_tcp_connectionnumberConnecting to the server, the TLS handshake included.
time_redirectnumber0 for current data. Redirects are followed as separate requests, and every timing describes the last request of the chain.
time_content_generationnumberWaiting for the first byte of the response once the request was sent.
time_content_transfernumberDownloading the response body.
time_totalnumberThe whole request to the final URL, from DNS lookup to the last byte.

The four phase timings (time_namelookup, time_tcp_connection, time_content_generation, time_content_transfer) add up to time_total.

To get a monthly figure, average the uptime_percentage of the days present in that month, or sum downtime_in_seconds over them.

Create a website (monitor)

POST https://pingping.io/webapi/monitors

Request body

NameTypeDescription
urlstringFull URL including scheme. Required.
aliasstringDisplay name. Defaults to the host portion of the URL.
intervalnumberUptime check interval in seconds. Defaults to 30. See Checks for valid values.
notification_thresholdnumberWait this many seconds of confirmed downtime before firing an alert. Default 0 (alert on first confirmed failure).
Request
curl -X POST https://pingping.io/webapi/monitors \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
  "url": "https://example.com",
  "alias": "Marketing site",
  "interval": 30
}'

Response 201

201 Created
{
"id": 482,
"identifier": "RvX29qLp",
"alias": "Marketing site",
"scheme": "https",
"host": "example.com",
"url": "https://example.com/",
"status_page": "https://pingping.io/RvX29qLp",
"checks": {
  "uptime": { "id": 901, "status": "pending", "interval": 30, "is_enabled": true },
  "certificate_health": { "id": 902, "status": "pending", "interval": 86400, "is_enabled": true }
}
}

Response 422

Returned when the request body fails validation (missing url, invalid scheme, etc.).

422 Unprocessable Entity
{
"message": "The given data was invalid.",
"errors": {
  "url": ["The url field is required."]
}
}

Update a website (monitor)

PUT https://pingping.io/webapi/monitors/{id}

Update the display alias or the underlying URL. To change check intervals, use the Checks API instead.

Request body

NameTypeDescription
aliasstringNew display name. Optional.
urlstringNew URL. Optional. Changing the host resets historical stats.

Response 200

Returns the updated monitor in the same shape as the create response.

Delete a website (monitor)

DELETE https://pingping.io/webapi/monitors/{id}

Permanently removes the monitor and all associated checks, history, and the status page. This action cannot be undone.

Response 204

Empty body on success.