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:

ParameterTypeDescription
statusstringFilter: up, down, or unknown
limitnumberMax results, 1-100 (default 50)
cursorstringPagination 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 monitor
  • url — monitored endpoint
  • statusup, down, or unknown
  • latency_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:

FieldTypeRequiredDescription
urlstringYesHTTP/HTTPS endpoint to monitor
intervalnumberYesCheck interval in ms (tier-dependent minimum)
methodstringNoGET, HEAD, or POST (default GET)
headersobjectNoCustom request headers (Pro/Scale)
bodystringNoRequest body for POST checks
timeoutnumberNoTimeout in ms, 1000-30000 (default 10000)
consecutive_thresholdnumberNoFailures before alert, 1-10 (default 1)
cooldown_msnumberNoAlert cooldown in ms, 60000-3600000 (default 300000)
webhook_urlstringNoWebhook URL for alerts (Starter+)
email_alertbooleanNoEnable email alerts (Pro/Scale)
notify_recoverybooleanNoSend 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:

TierLimitBurst
Free10/min15
Starter30/min45
Pro100/min150
Scale300/min450

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

OperationCost
All API operations1 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.

StatusMeaning
400Invalid request body or parameters
401Missing or invalid API key
403Feature not available on your tier
404Monitor not found or not owned by you
429Rate limit exceeded