---
title: "Get the first-ping waiting/received card data for a check"
method: GET
path: "/api/v1/checks/{id}/first-ping"
tags: ["Checks"]
---

# Get the first-ping waiting/received card data for a check

`GET /api/v1/checks/{id}/first-ping`

## Request

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

The REST equivalent of the dashboard's "listening for your first
heartbeat" card. `received` becomes `true` once the monitor has
reported in any way — including an outstanding `/start` that was
later cancelled or consumed by detection — using the same predicate
the dashboard's own card polls against (the monitor's state alone
cannot tell a cancelled start from a monitor that was truly never
pinged, so this endpoint also looks at its pings, same as the
dashboard).

`signal_word`/`instruction`/`command` are a pure function of the
monitor's own configuration (`monitor_type`, `ci_provider`), never of
whether it has reported yet — they stay populated after `received`
becomes `true`, unlike the HTML fragment which stops rendering them.
`command` is omitted for `http` monitors, which probe automatically
and so have no copy-paste command.

`test_ping_only` separates "we have heard from the console's own test
ping" from "your job has reported". Without it, pressing
`POST /api/v1/checks/{id}/test-ping` on a monitor nothing has reported
to flips `received` to `true` and a client that reads only `received`
tells the user their integration works.

404 if the check does not exist in the authenticated project (no
existence oracle).

**Console stability note.** This response is shaped by a console screen:
the fields are the ones that screen draws, in the grouping it draws them
in. It stays published because reading it is a reasonable thing to
automate, and no field will be removed or change meaning without a
version. Fields may be ADDED as the screen grows, so treat unknown keys
as normal rather than as an error.

## Response `200`

First-ping card data.

- FirstPing: The body of GET /api/v1/checks/{id}/first-ping — the REST equivalent of the dashboard's "listening for your first heartbeat" card. `signal_word`/`instruction`/`command` are a pure function of the monitor's own configuration, so they are always populated, even after `received` becomes `true`.
  - `received` boolean, required: True once the monitor has reported in any way — including an outstanding `/start` later cancelled or consumed by detection — using the same predicate the dashboard's own card polls against.
  - `test_ping_only` boolean, required: True when the monitor has reported but none of its most recent 20 pings came from anything other than the console's own `POST /api/v1/checks/{id}/test-ping` button. Always `false` while `received` is `false`. Read `received && test_ping_only` as "the test ping arrived, the caller's own job has not reported yet": a client that treats `received` alone as "connected" lets the test button satisfy its own acceptance check.
  - `signal_word` 'ping' | 'check' | 'pipeline event', required
  - `instruction` string, required
  - `command` string: Omitted for `http` monitors — they probe automatically, so there is no copy-paste command.

## Other responses

- `400`: id is not a valid UUID.
- `401`: Missing or invalid API key.
- `404`: Check not found in this project (`MONITOR_NOT_FOUND`).
- `429`: Too many requests. The per-principal fixed-window rate limit has been exceeded. Retry after the number of seconds indicated by the `Retry-After` response header. The problem body's `code` is `RATE_LIMITED`. It names this limiter specifically, so a client can tell it apart from the application-level throttles that also answer 429 with their own codes and their own, much longer, `Retry-After` values (`TEST_PING_RATE_LIMITED`, `TOO_MANY_ATTEMPTS`). Back off globally on `RATE_LIMITED`; back off on the one operation for the others. The principal is the API key for a key-authenticated request and the USER for a browser session, so every tab one person has open shares one budget.

---

[API](https://skmtc.dev/lastping/apis/lastping-management-api.md) · [All operations](https://skmtc.dev/lastping/apis/lastping-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lastping/apis/lastping-management-api/revisions/bbc6eda91c46?raw)
