curl
The lowest-common-denominator way to fire a heartbeat: one HTTP call, one finished run. For the full endpoint reference, see GET /v1/ping and POST /v1/heartbeats.
The minimal heartbeat
curl 'https://eu.ingest.agentping.io/v1/ping?key=ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6&agent=daily-summary&status=ok'
Response is OK\n. The run lands in your dashboard within a second.
Adding cost and duration
curl 'https://eu.ingest.agentping.io/v1/ping?key=ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6&agent=daily-summary&status=ok&cost_usd=0.084&duration_ms=12300'
cost_usd is trusted as supplied on heartbeats; there are no llm_call events for the server to derive it from.
POST when query strings aren't enough
For structured metadata, explicit timestamps, or anything beyond the 256-char metadata field that GET supports:
curl -X POST https://eu.ingest.agentping.io/v1/heartbeats \
-H "Authorization: Bearer ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6" \
-H "Content-Type: application/json" \
-d '{
"id": "run_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b9",
"agent": "nightly-rollup",
"status": "ok",
"started_at": "2026-05-15T03:00:00.000Z",
"finished_at": "2026-05-15T03:04:17.300Z",
"cost_usd": 0.142,
"metadata": {"customers_processed": 4821, "shard": "eu-west"}
}'
id is optional. Supply one for idempotent retries (same id, matching fields = 200 no-op). Omit it and the server mints one.
Authentication
Three transports, all equivalent:
| Method | Example |
|---|---|
| Header | Authorization: Bearer apk_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6 |
| Header alias | X-AgentPing-Key: ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6 |
| Query string | ?key=ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6 (only on GET /v1/ping) |
Ping tokens in URLs, API keys in headers. See Authentication.
Error handling
curl --fail-with-body 'https://eu.ingest.agentping.io/v1/ping?key=ping_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b6&agent=competitor-scan&status=ok'
--fail-with-body returns a non-zero exit code on 4xx/5xx and still prints the body:
HTTP/1.1 401 Unauthorized
Content-Type: text/plain
This ping token is scoped to agent "daily-summary".
You attempted to fire a heartbeat for "competitor-scan".
Two agent slugs side by side, misconfiguration named in the body.