Gatus Status Extractor avatar

Gatus Status Extractor

Pricing

from $0.35 / 1,000 results

Go to Apify Store
Gatus Status Extractor

Gatus Status Extractor

Point at any self-hosted Gatus status page and export its monitored endpoints and health-check history from the public /api/v1/endpoints/statuses JSON: status code, response time, per-condition pass/fail, success and timestamp.

Pricing

from $0.35 / 1,000 results

Rating

0.0

(0)

Developer

Datamule

Datamule

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

15 hours ago

Last modified

Categories

Share

Point at any self-hosted Gatus status page and export its monitored endpoints and health-check history as clean, structured rows.

Gatus is a hugely popular self-hosted health-dashboard / status-page. Every Gatus instance — regardless of version or configuration — exposes the identical public JSON endpoint GET /api/v1/endpoints/statuses: a list of monitored endpoints, each with its recent result history (HTTP status, response time, per-condition pass/fail, success flag and timestamp). This actor speaks that one standard, so a single actor works against every Gatus instance in existence — no per-host scraper.

Give it a status page URL; get back a flat, fully-typed dataset row for every health-check result (or one row per endpoint), ready for a spreadsheet, a database, an uptime/SLA report or an observability pipeline.

Gatus only. Uptime-Kuma and other self-hosted status pages use a different API and are not supported by this actor.

Try it now

{"statusPageUrl":"https://status.twin.sh","latestResultOnly":false,"listEndpointsOnly":false,"maxRecords":25,"maxHistoryPages":1,"pageSize":25}

This bounded history run reads the freshest page and emits at most 25 rows. The global default is also 25 rows when maxRecords is omitted, unparsable, boolean, zero or negative. Any explicit positive cap, including a higher one, is preserved.

What it does

  • Any Gatus instance, one input. Pass a bare base (https://status.twin.sh) or the full .../api/v1/endpoints/statuses URL — both are normalized.
  • Three modes.
    • Full history (default) — one row per (endpoint × result), exporting the recent result history Gatus keeps.
    • Latest only (latestResultOnly) — one row per endpoint, using only its most-recent result.
    • Discovery (listEndpointsOnly) — one lightweight row per endpoint (name, group, key, latest status/success, result count); a fast way to enumerate what a page monitors.
  • Reads by key presence. Gatus instances differ only in which optional fields they populate. A non-HTTP check (TCP/ICMP/DNS) with no status, an endpoint with no group or hostname, a not-yet-run endpoint with no results — every one yields null / [] for that column, never an error.
  • History pagination, done right. Gatus paginates each endpoint's results[] via ?page=N&pageSize=M (newest first). Set maxHistoryPages to walk further back; paging stops automatically once a page contributes no new results.

Input

FieldRequiredDescription
statusPageUrlA Gatus base (https://status.twin.sh) or a full /api/v1/endpoints/statuses URL.
latestResultOnlyOne row per endpoint using only its most-recent result. Default false.
listEndpointsOnlyDiscovery mode: one row per endpoint, no history. Overrides latestResultOnly.
groupFilterCase-insensitive substring matched against each endpoint's group.
nameFilterCase-insensitive substring matched against each endpoint's name.
maxRecordsGlobal cap on emitted rows (default 25; each row is one billable result event). Any explicit positive cap is allowed.
maxHistoryPagesHow many pages of result history to walk (default 1, max 50). Ignored in latest/discovery mode.
pageSizeResults per endpoint per page (default 100; Gatus caps at 100).
bearerBearer token for a gated instance. Never logged.
extraHeadersExtra HTTP headers as a JSON object for a gated page. Never logged.

Other example inputs

{ "statusPageUrl": "https://status.twin.sh", "latestResultOnly": true, "groupFilter": "core" }
{ "statusPageUrl": "https://status.twin.sh", "listEndpointsOnly": true }

Output

One row per (endpoint, result) — or per endpoint in latest/discovery mode:

ColumnDescription
endpointNameThe monitored endpoint's name (e.g. blog-home).
groupThe endpoint's group, when Gatus groups it (e.g. core).
keyGatus's stable key for the endpoint (e.g. core_blog-home).
statusHTTP status code. null for a non-HTTP check (TCP/ICMP/DNS).
hostnameResolved hostname of the check, when present.
durationMsResponse time in milliseconds (Gatus's nanosecond duration, converted).
successWhether the check passed overall.
timestampResult timestamp (ISO-8601).
conditionCount / conditionsPassed / conditionsFailedPer-condition pass/fail tally for the result.
firstFailedConditionThe condition string of the first failed condition (e.g. [STATUS] == 200), else null.
errorsArray of error strings the check recorded, when present.
latestStatus / latestSuccess / resultCount(Discovery mode) the endpoint's most-recent status/success and how many results the freshest page held.
_rawThe complete original result object — nothing is ever dropped (raw nanosecond duration, full conditionResults, …).
_source / _endpointCountThe exact statuses URL and how many endpoints the page monitors.

Every field is nullable and read by key presence — a Gatus instance that omits group / hostname / status / errors simply yields null for that column, never an error.

Representative result

This genuine row was captured from https://status.twin.sh. Its endpoint identity and field types are representative; the timestamp and duration are naturally volatile.

{
"_type": "result",
"_source": "https://status.twin.sh/api/v1/endpoints/statuses",
"_endpointCount": 10,
"endpointName": "blog-article-43",
"group": "core",
"key": "core_blog-article-43",
"status": 200,
"hostname": "blog.default.svc.cluster.local",
"durationMs": 1.705845,
"success": true,
"timestamp": "2026-07-20T23:41:30.698756205Z",
"conditionCount": 5,
"conditionsPassed": 5,
"conditionsFailed": 0,
"firstFailedCondition": null,
"errors": null,
"latestStatus": null,
"latestSuccess": null,
"resultCount": null,
"_raw": {
"status": 200,
"success": true,
"duration": 1705845,
"hostname": "blog.default.svc.cluster.local",
"timestamp": "2026-07-20T23:41:30.698756205Z",
"conditionResults": [
{"condition": "[STATUS] == 200", "success": true},
{"condition": "[BODY].id == 43", "success": true},
{"condition": "[BODY].title == Writing a Simple Reverse Proxy in Go", "success": true},
{"condition": "[BODY].creationDate == 2020-04-18", "success": true},
{"condition": "len([BODY].tags) == 3", "success": true}
]
}
}

Notes & scope

  • Point-in-time freshness. Each run reads the status and retained history that the Gatus instance exposes at that moment; this actor does not monitor continuously or reconstruct history the source no longer retains.
  • Bounded coverage. The default run reads one page and emits at most 25 rows globally. Increase maxHistoryPages, pageSize and an explicit positive maxRecords when you intentionally need deeper source-retained history.
  • Public or supplied-auth status data only. This reads the same statuses JSON the dashboard renders. It does not discover private credentials or data outside that endpoint.
  • Find instances. Any public Gatus status page works; the demo instance at https://status.twin.sh is a good place to try it.

Troubleshooting

  • Wrong base, HTML or a non-array response: pass the Gatus base URL or its full /api/v1/endpoints/statuses URL. The actor appends the endpoint path and expects a top-level JSON array; an HTML login/error page, 404 body, JSON object or a different status-page product fails fast.
  • Authentication errors: set bearer or the required values in extraHeaders. Confirm those credentials can fetch /api/v1/endpoints/statuses directly; secret values are never logged.
  • Filters or zero rows: clear groupFilter / nameFilter and retry the bounded input above. A valid page with no endpoints, no recent results, or no filter matches returns 0 rows cleanly; discovery mode can confirm which endpoint names and groups exist.

Pricing

Pay-per-event: $0.0005 per result row returned. At the default global cap of 25 rows, the maximum FREE-tier event charge is $0.0125 (25 × $0.0005). Apify infrastructure usage is excluded. A run charges only for rows it actually emits; an explicit higher positive cap can raise that event charge.