A read-only REST API for pulling your monitors, incidents, and check history into your own dashboards, scripts, and tooling. Available on the Business plan.
Every request needs an API key in the Authorization header. Generate one from Settings → API Keys, the key is shown once, at creation, and never again, so store it somewhere safe.
curl https://impulseye.com/api/v1/monitors \
-H "Authorization: Bearer iek_live_xxxxxxxxxxxxxxxxxxxx"Anyone with the key can read your monitoring data. Treat it like a password, don't commit it, don't put it in client-side code, and revoke it immediately from Settings if it ever leaks.
https://impulseye.com/api/v15,000 requests/hour per key, on a fixed hourly window (it resets at the top of each hour, not 60 minutes after your first request). Every response carries headers so you can self-throttle before hitting the limit:
X-RateLimit-Limit: the ceiling for the current window (5000)X-RateLimit-Remaining: requests left before you're throttledExceeding the limit returns 429 Too Many Requests until the next hour begins.
List endpoints accept ?limit= (default 50, max 200) and ?offset=. Every list response includes a pagination object with the total row count so you know when to stop paging.
{
"data": [ /* … */ ],
"pagination": { "limit": 50, "offset": 0, "total": 9 }
}/monitorsReturns every monitor owned by the authenticated key, most recently created first.
curl "https://impulseye.com/api/v1/monitors?limit=20" \
-H "Authorization: Bearer $IMPULSEYE_API_KEY"{
"data": [
{
"id": "af037a1a-f660-4321-9f32-ce04bd689f23",
"name": "Impulseye (Dogfood)",
"url": "https://impulseye.com",
"type": "http",
"status": "up",
"active": true,
"check_interval_minutes": 0.5,
"port": 443,
"created_at": "2026-07-14T15:58:31.590Z",
"last_checked_at": "2026-07-19T09:14:31.047Z"
}
],
"pagination": { "limit": 20, "offset": 0, "total": 9 }
}/monitorsSend a single monitor object, or an array of up to 100 for bulk creation. A bulk request is all-or-nothing: if any item fails validation, nothing is created and the error tells you which item (by index) was the problem. The whole batch is also rejected up front if it would push the account over its plan's active-monitor limit.
Common fields: name (required), type (http default, or tcp, heartbeat, change, dns), url, check_interval_minutes, label, is_public. Type-specific fields: port (tcp), keyword_target/http_method/headers/request_body (http), content_selector (change), dns_record_type/dns_expected_value (dns), period_minutes/grace_minutes (heartbeat).
curl -X POST https://impulseye.com/api/v1/monitors \
-H "Authorization: Bearer $IMPULSEYE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{ "name": "API", "type": "http", "url": "https://api.example.com/health" },
{ "name": "DB", "type": "tcp", "url": "db.example.com", "port": 5432 }
]'{
"data": [
{ "id": "…", "name": "API", "type": "http", "status": "pending", "active": true, … },
{ "id": "…", "name": "DB", "type": "tcp", "status": "pending", "active": true, … }
]
}Some fields silently fall back to a safe default instead of erroring, e.g. an unrecognized check_interval_minutes value falls back to the fastest interval your plan allows, rather than rejecting the whole request over one odd value. Required fields (name, and url/port where the type needs them) still return a hard 400 if missing or invalid.
/monitors/:idReturns one monitor by id. A monitor that doesn't exist, or belongs to another account, returns 404 either way, the API never confirms whether an id you don't own exists.
curl https://impulseye.com/api/v1/monitors/af037a1a-f660-4321-9f32-ce04bd689f23 \
-H "Authorization: Bearer $IMPULSEYE_API_KEY"/monitors/:id/logsRecent per-check results for one monitor: status code, response time, and up/down state. Accepts the same limit/offset pagination. Data is only available for the plan's raw retention window (currently 14 days on Business); older checks have already been rolled up and pruned, so requesting further back just returns fewer rows, not an error.
curl "https://impulseye.com/api/v1/monitors/af037a1a-.../logs?limit=100" \
-H "Authorization: Bearer $IMPULSEYE_API_KEY"{
"data": [
{
"id": "9f8f10e2-6882-4e9f-9c4a-75dd10de86ac",
"monitor_id": "af037a1a-f660-4321-9f32-ce04bd689f23",
"status_code": 200,
"response_time_ms": 142,
"is_up": true,
"created_at": "2026-07-20T22:19:27.483Z"
}
],
"pagination": { "limit": 100, "offset": 0, "total": 4032, "retention_days": 14 }
}/incidentsIncidents across every monitor you own. Filter with ?monitor_id= to scope to one monitor, or ?status= (investigating, identified, monitoring, resolved, maintenance).
curl "https://impulseye.com/api/v1/incidents?status=identified" \
-H "Authorization: Bearer $IMPULSEYE_API_KEY"{
"data": [
{
"id": "59d79dcb-4df4-4690-89cf-db282edc71d7",
"monitor_id": "801ae360-938e-4b9e-b56f-c1f63a5d11db",
"title": "Cause identified",
"body": "Upstream payment gateway outage confirmed. Failover in progress.",
"status": "identified",
"created_at": "2026-06-28T21:06:30.137Z",
"updated_at": "2026-06-28T21:06:30.137Z"
}
],
"pagination": { "limit": 50, "offset": 0, "total": 2 }
}Errors are a JSON body with a single error string and an HTTP status:
{ "error": "Invalid or revoked API key" }| Status | Meaning |
|---|---|
| 401 | Missing, malformed, invalid, or revoked API key |
| 403 | Key is valid, but the account isn't on the Business plan |
| 404 | Resource doesn't exist, or belongs to a different account |
| 429 | Rate limit exceeded, wait for the hourly window to reset |
| 500 | Something broke on our end, safe to retry |
The API is versioned at the URL (/api/v1). Breaking changes will ship as a new version rather than changing v1's behavior under you, existing integrations won't silently break.
Need something this API doesn't cover yet? Email support@impulseye.com.