Pulse API Reference
Base URL: https://api.solenoid.systems/v1/pulse
All endpoints require a Bearer token. See Authentication.
See Rate Limits for per-tier request limits.
List monitors
GET /v1/pulse
Query parameters:
| Parameter | Type | Description |
|---|---|---|
status | string | Filter: up, down, or unknown |
limit | number | Max results, 1-100 (default 50) |
cursor | string | Pagination cursor from previous response |
curl "https://api.solenoid.systems/v1/pulse?status=down&limit=10" \
-H "Authorization: Bearer YOUR_KEY"
Response (200):
{
"monitors": [
{
"monitor_id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://api.example.com/health",
"status": "down",
"latency_ms": 10042,
"last_checked_at": 1234567890,
"consecutive_failures": 3
}
],
"cursor": "10"
}
Response fields:
monitor_id— UUID of the monitorurl— monitored endpointstatus—up,down, orunknownlatency_ms— last check latency in ms (null if never checked)last_checked_at— Unix timestamp of last check (null if never checked)consecutive_failures— count of consecutive failures
Create monitor
POST /v1/pulse
Request body:
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | HTTP/HTTPS endpoint to monitor |
interval | number | Yes | Check interval in ms (tier-dependent minimum) |
method | string | No | GET, HEAD, or POST (default GET) |
headers | object | No | Custom request headers (Pro/Scale) |
body | string | No | Request body for POST checks |
timeout | number | No | Timeout in ms, 1000-30000 (default 10000) |
consecutive_threshold | number | No | Failures before alert, 1-10 (default 1) |
cooldown_ms | number | No | Alert cooldown in ms, 60000-3600000 (default 300000) |
webhook_url | string | No | Webhook URL for alerts (Starter+) |
email_alert | boolean | No | Enable email alerts (Pro/Scale) |
notify_recovery | boolean | No | Send UP notification after DOWN (default false) |
curl -X POST "https://api.solenoid.systems/v1/pulse" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.example.com/health",
"interval": 60000,
"webhook_url": "https://your-app.com/webhooks/pulse"
}'
Response (201):
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://api.example.com/health",
"method": "GET",
"interval": 60000,
"timeout": 10000,
"consecutive_threshold": 1,
"cooldown_ms": 300000,
"active": true,
"status": "unknown",
"webhook_url": "https://your-app.com/webhooks/pulse",
"notify_recovery": false,
"created_at": 1234567890,
"updated_at": 1234567890
}
If the requested interval is below your tier minimum, it is coerced upward with a warning field in the response. See Tier Limits for minimums.
Get monitor status
GET /v1/pulse/:monitorId
curl "https://api.solenoid.systems/v1/pulse/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_KEY"
Response (200):
{
"monitor_id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://api.example.com/health",
"status": "up",
"latency_ms": 142,
"last_checked_at": 1234567890,
"consecutive_failures": 0
}
Update monitor
PUT /v1/pulse/:monitorId
Send only the fields you want to change. Same fields as Create.
curl -X PUT "https://api.solenoid.systems/v1/pulse/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"interval": 300000, "notify_recovery": true}'
Response (200): updated monitor object (same format as Create).
Delete monitor
DELETE /v1/pulse/:monitorId
curl -X DELETE "https://api.solenoid.systems/v1/pulse/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_KEY"
Response (200): {"deleted": true}
Check now (manual)
POST /v1/pulse/:monitorId/check
Executes an immediate check, bypassing the scheduled interval. Manual checks do not trigger webhook notifications.
curl -X POST "https://api.solenoid.systems/v1/pulse/550e8400-e29b-41d4-a716-446655440000/check" \
-H "Authorization: Bearer YOUR_KEY"
Response (200): same format as Get monitor status.
Rate limits
API requests are rate-limited per API key by tier:
| Tier | Limit | Burst |
|---|---|---|
| Free | 10/min | 15 |
| Starter | 30/min | 45 |
| Pro | 100/min | 150 |
| Scale | 300/min | 450 |
Rate limit headers are included on every response:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1234567890
See Pricing for tier details.
Metering
| Operation | Cost |
|---|---|
| All API operations | 1 credit per request |
Scheduled background checks (executed by Durable Object alarms) are not API calls and don’t cost credits. Only explicit API requests cost credits.
Error responses
All errors return a JSON body with an error field. See Errors for the full list.
| Status | Meaning |
|---|---|
| 400 | Invalid request body or parameters |
| 401 | Missing or invalid API key |
| 403 | Feature not available on your tier |
| 404 | Monitor not found or not owned by you |
| 429 | Rate limit exceeded |