Checks

Pause a check

Sets paused=true on the check. A paused check does not alert.

post/api/v1/checks/{id}/pause

Request

  • Base URL: https://app.lastping.dev
  • URL: https://app.lastping.dev/api/v1/checks/{id}/pause
  • Auth: API key in header X-Api-Key

Response

Check with paused=true.

idstring uuid required

Unique check identifier.

namestring required

Human-readable name.

slugstring required

Stable project-scoped identifier (may be empty string if not set).

schedule_kind'simple' | 'cron' | 'on_demand' required

on_demand means the check has no cadence: it never arms an absence deadline, so silence between runs never alerts. Run-scoped detection (max_runtime_s, step_timeout_s) still applies once a run starts, and expect_every_s — the silence floor — is the only way to detect absence between runs.

period_sinteger required

Period in seconds (only meaningful for schedule_kind=simple).

cron_exprstring

Cron expression (only present when schedule_kind=cron).

tzstring required

IANA timezone.

grace_sinteger required

Grace period in seconds — the silence tolerance and the first-run deadline, and the overrun budget when max_runtime_s is unset.

max_runtime_sinteger nullable

Run-duration budget in seconds for the overrun deadline only. Omitted from the response when unset, in which case the overrun rule falls back to grace_s. Never set on http monitors.

step_timeout_sinteger nullable

Progress budget in seconds for the stall rule. Omitted from the response when unset, in which case stall detection is disabled. Never set on http monitors.

expect_every_sinteger nullable

Silence floor in seconds. Omitted from the response when unset, in which case absence is detected only by the schedule — and, for an on_demand monitor, not at all between runs.

notify_min_run_sinteger nullable

Notification duration floor in seconds. Omitted from the response when unset, in which case every info-class notification (success, started, every-run, note) fires regardless of how short the run was. Never set on http monitors. Never suppresses down, fail, recovery or blocked.

blocked_timeout_sinteger nullable

How long (in seconds) the check may sit blocked before a blocked incident opens. Omitted from the response when unset — that does NOT mean the check waits forever, it means the 24-hour default applies.

failure_thresholdinteger required

Consecutive explicit failures required before an incident opens (fail cause only). Always present; 1 means "open on the first failure", the default.

monitor_fromstring date-time nullable

RFC 3339 timestamp from which deadlines are computed.

status'new' | 'up' | 'late' | 'down' required

Current check status derived from ping history.

last_ping_atstring date-time nullable

RFC 3339 timestamp of the most recent ping received.

due_atstring date-time nullable

RFC 3339 timestamp when the next ping is expected.

alert_afterstring date-time nullable

RFC 3339 timestamp after which an alert is sent if no ping arrives.

pausedboolean required

When true the check does not alert regardless of ping status.

maintenance_untilstring date-time nullable

RFC 3339 timestamp until which the check is snoozed. Alerts are suppressed while this is in the future; null or absent when the check is not snoozed.

created_atstring date-time required

RFC 3339 UTC timestamp when the check was created.

ping_urlstring uri required

The URL your service should HTTP-GET to record a successful ping.

monitor_type'heartbeat' | 'ci' | 'http'

Monitor mode. Omitted on responses when the value is the default heartbeat.

probe_urlstring uri

URL being probed (HTTP monitors only; omitted otherwise).

probe_method'GET' | 'HEAD' | 'POST'

HTTP method used for the probe (HTTP monitors only; omitted otherwise).

probe_expected_bodystring

Expected response body substring (HTTP monitors only; omitted otherwise).

probe_interval_sinteger

Probe interval in seconds (HTTP monitors only; omitted otherwise).

probe_expected_statusinteger

Expected HTTP status code (HTTP monitors only; omitted otherwise).

probe_timeout_sinteger

Probe timeout in seconds (HTTP monitors only; omitted otherwise).

probe_follow_redirectsboolean

Whether the probe follows redirects (HTTP monitors only; omitted otherwise).

next_probe_atstring date-time nullable

RFC 3339 UTC timestamp when the next probe is scheduled (HTTP monitors only; omitted otherwise).

ci_provider'github' | 'gitlab' | 'jenkins'

CI provider bound to this check (omitted when no CI binding is set).

ci_configuredboolean

True when a CI binding is set on this check (omitted when false).

ci_webhook_urlstring uri

Webhook URL for this CI check (omitted when no CI binding is set). POST this URL from your CI provider with the ci_secret as the HMAC secret.

ci_secretstring

WRITE-ONCE — returned ONLY in the 201 create response and the POST /api/v1/checks/{id}/ci/regenerate response. NEVER returned on GET or list. Copy it immediately; it cannot be retrieved again (use regenerate to rotate).

ci_workflowstring

Optional workflow/job name filter narrowing which CI runs this check watches (omitted when unset, which watches every workflow).

ci_branchstring

Optional branch filter narrowing which CI runs this check watches (omitted when unset, which watches every branch).

runaway_ceilinginteger nullable

Maximum pings allowed in a rolling 1-hour window. Exceeding it opens a runaway-cause incident, which detects a looping agent or job pinging abnormally fast. Omitted from the response when disabled for this monitor.

tagsstring[] required

Labels attached to this monitor. Always returned as an array (never null); empty array when no tags are set.

agent_idstring uuid nullable

Id of the agent that owns this monitor. Omitted/null when the monitor is unattached — including right after its owning agent was deleted: DELETE /api/v1/agents/{id} unowns the monitors it owned, it does not delete them.

source_kindstring

The scanner that discovered this monitor (crontab, github-actions, k8s-cronjob, systemd-timer). Omitted when a human created the monitor, which is the state of every monitor that predates discovery — and such a monitor is never reconciled, so a scan can neither adopt nor delete it.

source_refstring

The stable path within source_kind that identifies exactly what was found. Together with source_kind and the project it is the discovery reconcile key.

source_kind and source_ref are always either both present or both omitted: a half-set identity is never stored.

trace_content'redacted' | 'dropped' required

What this monitor's traces keep of prompt, command and tool content. dropped (the default) removes the content attributes (prompts, completions, commands, tool arguments, results and definitions, retrieved documents, working directories) of every recognised vocabulary entirely; lengths such as user_prompt_length, token counts and cost are kept. Error text (error, error.message, exception.message, exception.stacktrace and the span's status message) is kept at dropped, redacted and then cut to 512 characters, and a cut marks the span or log event truncated. redacted opts in to storing that content, with every secret-shaped value replaced by [REDACTED:<class>] at ingest, before anything is queued or stored: API keys (LastPing, Anthropic, OpenAI, GitHub, GitLab, npm, AWS access key ids, Slack, Stripe, Google, Hugging Face, Perplexity, Fireworks, Supabase, New Relic, Airtable, Terraform Cloud, Firebase), HashiCorp Vault tokens, age secret keys, Discord bot tokens, Slack, Discord and Teams webhook URLs, Authorization header values, JWTs, private key blocks, password=/token=/api_key= style assignments (subscripted ones such as os.environ["API_KEY"] = ... and Dockerfile ENV/ARG lines included), SQL PASSWORD '...' and IDENTIFIED BY clauses, the Redis AUTH command, .netrc passwords, command-line password flags and the argument after them (any secret-named --flag, -p after a login subcommand, redis-cli -a), cookies, credentials in URLs, the value of any attribute or JSON field whose name is secret-named (password, token, api_key, secret, the same word in several other languages, an Authorization or X-Api-Key header and the like; Idempotency-Key and request, correlation and trace ids are not secrets), including JSON carried inside another JSON string such as tool-call arguments, and long high-entropy tokens. A bytes attribute that is valid UTF-8 is scanned and stored as its text. A span that had a value redacted carries lastping.redacted_values. A request whose redaction work exceeds a fixed budget stores [REDACTED:over_budget] for the values it could not scan, never the values themselves. In both modes every remaining value is redacted the same way. There is no setting that stores content unredacted. A change reaches ingest within 60 seconds: ingest caches each monitor's setting for up to a minute, so an export sent just after the change may still be handled the old way.

Always present.

kind'cron' | 'ci' | 'agent' | 'http' required

The console's four-way grouping of this monitor, derived server-side so every surface groups it the same way. agent wins over the rest: an agent's heartbeat is the agent's. A CI monitor is one with a ci_provider, not one with monitor_type: "ci" — nothing in the product writes that value.

uptime_90dnumber double nullable required

Uptime over the last 90 days, or since the monitor was created if that is more recent, as a percentage with two decimals. For an HTTP monitor this is the share of probes that succeeded; for every other type it is derived from incident downtime over the window. Null when an HTTP monitor has no probe history yet, and null for any other monitor that has never been pinged. A monitor created three days ago reports on those three days, not on 90 days of assumed success, so the window varies per monitor and the console says so beside the figure.

latency_msinteger nullable required

The most recent probe's latency. HTTP monitors only; null for every other type and for an HTTP monitor with no probe yet.

routes_countinteger required

How many distinct alert destinations would hear about this monitor FAILING: the destinations routed on down, fail, blocked or every-run. Distinct destinations, not route rows, so one destination routed on both down and fail is one place the alerts go. every-run counts because it fires for every completed run, a failed one included. A route on recovery, success, started or note is not counted: routes are resolved per event with no fallback, and none of those four ever fires for a failure, so a monitor routed only on them has nowhere for its bad news to go. 0 means failures would be silent, which the console flags as "Not routed" and Home counts in overview.alerts.monitors_unrouted.

recent_outcomesstring[] required

This monitor's last 20 run outcomes, newest first, for the console's run strip. Always an array, empty when the monitor has not completed a run yet. Only terminal outcomes appear: a start says a run began and is not one.

hook_versioninteger nullable required

Version of the Claude Code hook script last seen on a start ping; null when no hook that reports a version has sent a start. Older than hook_version_current means re-run set-up.

hook_version_currentinteger required

The hook script version set-up installs today. Compare it with hook_version.

hook_seen_atstring date-time nullable required

When hook_version was last recorded, from a start ping. Refreshed at most once an hour while the version is unchanged. Null when no hook that reports a version has sent a start.

claude_code_seen_atstring date-time nullable required

Latest time this monitor received a Claude Code run (a hook start that reported a version, or a trace whose source is Claude Code). With hook_version null and a recent value here, the machine runs an older hook or none.

Example response

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Daily backup job",
  "slug": "daily-backup",
  "schedule_kind": "simple",
  "period_s": 86400,
  "cron_expr": "0 3 * * *",
  "tz": "UTC",
  "grace_s": 600,
  "max_runtime_s": 14400,
  "step_timeout_s": 300,
  "expect_every_s": 900,
  "notify_min_run_s": 300,
  "blocked_timeout_s": 86400,
  "failure_threshold": 3,
  "monitor_from": "2026-01-01T00:00:00Z",
  "status": "up",
  "last_ping_at": "2026-07-10T03:00:05Z",
  "due_at": "2026-07-11T03:00:00Z",
  "alert_after": "2026-07-11T03:10:00Z",
  "maintenance_until": "2026-07-11T09:00:00Z",
  "created_at": "2026-07-01T12:00:00Z",
  "ping_url": "https://ingest.lastping.dev/550e8400-e29b-41d4-a716-446655440000",
  "monitor_type": "http",
  "probe_url": "https://example.com/healthz",
  "probe_method": "GET",
  "probe_expected_body": "\"status\":\"ok\"",
  "probe_interval_s": 60,
  "probe_expected_status": 200,
  "probe_timeout_s": 10,
  "next_probe_at": "2026-07-13T03:01:00Z",
  "ci_provider": "github",
  "ci_configured": true,
  "ci_webhook_url": "https://ingest.lastping.dev/ci/github/550e8400-e29b-41d4-a716-446655440000",
  "ci_secret": "a3f8c2d1e4b7a9f0c3d2e1b4a7f8c0d3e2b1a4f7",
  "ci_workflow": "ci.yml",
  "ci_branch": "main",
  "ci_ignored": {
    "count": 12,
    "last_at": "2026-10-08T14:02:11Z",
    "last_workflow": "CI",
    "last_branch": "feature/login",
    "last_matched_at": "2026-10-01T09:00:00Z",
    "filters_changed_at": "2026-09-20T12:00:00Z",
    "same_workflow_count": 3,
    "same_workflow_last_at": "2026-10-08T11:40:00Z",
    "same_workflow_last_branch": "release/2.4",
    "new_workflow": "Deploy prod",
    "new_workflow_first_at": "2026-10-06T09:12:00Z",
    "new_workflow_count": 2
  },
  "runaway_ceiling": 20,
  "tags": [
    "agent:claude",
    "env:prod"
  ],
  "agent_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
  "source_kind": "github-actions",
  "source_ref": ".github/workflows/nightly.yml#build",
  "trace_content": "dropped",
  "kind": "cron",
  "uptime_90d": 99.67,
  "latency_ms": 142,
  "routes_count": 2,
  "recent_outcomes": [
    "succeeded",
    "succeeded",
    "failed"
  ],
  "hook_version": 2,
  "hook_version_current": 2
}

Changes

No recorded changes to this operation across all 2 revisions of this API.