Skip to main content
POST
/
v1
/
heartbeats
Heartbeat dead-man's-switch — auto-cancel orders on missed pings.
curl --request POST \
  --url https://api.polysimulator.com/v1/heartbeats \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "interval_ms": 30500,
  "client_label": "<string>"
}
'
{
  "expires_at_ms": 123,
  "ok": true
}

Authorizations

X-API-Key
string
header
required

Issue from /v1/keys (or admin-issued for enterprise tier).

Headers

X-API-Key
string | null

Your PolySimulator API key

POLY_API_KEY
string | null

Polymarket-CLOB-compat alias for X-API-Key (underscore form). SDK clients ported from Polymarket can authenticate without changing header names. X-API-Key takes precedence when both are provided.

Poly-API-Key
string | null

PM-CLOB-compat dashed-form alias for X-API-Key. Same value semantics as POLY_API_KEY but with HTTP-conventional dash separators. Audit P1 (staging audit 2026-05-16 0817 PR #1296): the per-tier middleware accepts both spellings but the auth dependency originally only matched the underscore form — now both work end-to-end.

authorization
string | null

PM-CLOB-compat: Authorization: Bearer ps_live_... (or ps_test_...) is accepted as an alias for X-API-Key so py-clob-client and other ported SDKs authenticate without header name changes. Bearer JWTs are NOT accepted here — use the dashboard-auth endpoints for those.

Body

application/json

Heartbeat registration / refresh.

interval_ms: how long the server should wait between heartbeats before declaring the bot dead and cancelling its orders. Bounded [1000, 60000]. The bot is expected to ping at interval_ms / 2 or so to stay ahead of expiry.

client_label: optional free-form label so a single API key can register multiple heartbeats from different bot processes. Defaults to "" (single-stream). Bots that don't multiplex can ignore.

interval_ms
integer
required
Required range: 1000 <= x <= 60000
client_label
string | null
Maximum string length: 64

Response

Successful Response

expires_at_ms
integer
required
ok
boolean
default:true