Developer Documentation

API Reference

Enterprise-grade uptime for distributed systems

Base URL: https://api.sentinelpulse.io/v2 | Version: 2.4.1 | Last Updated: March 14, 2024

Endpoints

Core resources for managing uptime monitors, alert policies, and synthetic checks.

POST /v2/monitors

Create a new HTTP, TCP, or DNS monitor. Requires name, type, interval_seconds, and targets array. Returns monitor UUID and initial status.

PATCH /v2/monitors/{id}

Update monitor configuration. Supports partial updates for maintenance windows, escalation policies, and TLS certificate tracking thresholds.

DELETE /v2/monitors/{id}

Permanently remove a monitor and associated historical data. Purges cached DNS records and cancels active synthetic probes within 60 seconds.

GET /v2/monitors/{id}/status

Retrieve real-time health metrics, including last check latency, error rate, and SSL expiration timeline. Supports JSON and CSV response formats.

Authentication

All requests require a valid API key passed via the Authorization header. Keys are scoped to your organization and environment.

Generate keys in your dashboard under Settings > API Access. Use Bearer token format. Keys are rotated every 90 days for compliance with SOC 2 Type II standards. Read-only keys are prefixed with sp_live_ while write-enabled keys use sp_prod_.

curl -X GET https://api.sentinelpulse.io/v2/monitors \
  -H "Authorization: Bearer sp_live_8f9a2b1c4d5e6f7g8h9i0j" \
  -H "Content-Type: application/json"

Rate Limits

Requests are throttled per API key to ensure platform stability during incident response windows.

1200
Requests / Minute
50
Concurrent Webhooks
429
HTTP Status Code

Exceeding limits returns a 429 Too Many Requests response with a Retry-After header. Burst allowance is capped at 150 requests within a 10-second window. Enterprise plans support custom limit negotiations via your CSM.

Examples

Implementation patterns for provisioning monitors across your CI/CD pipeline.

Python (requests)

import requests

headers = {"Authorization": "Bearer sp_live_8f9a2b1c4d5e6f7g8h9i0j"}
payload = {
    "name": "Production API Gateway",
    "type": "http",
    "interval_seconds": 30,
    "targets": ["https://api.example.com/health"],
    "alert_policy": "critical_pagerduty"
}

response = requests.post(
    "https://api.sentinelpulse.io/v2/monitors",
    json=payload,
    headers=headers
)
print(response.json())

Go (net/http)

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

func main() {
    monitor := map[string]interface{}{
        "name": "Database Replica Sync",
        "type": "tcp",
        "interval_seconds": 15,
        "targets": []string{"db-replica.internal:5432"},
    }

    body, _ := json.Marshal(monitor)
    req, _ := http.NewRequest("POST", "https://api.sentinelpulse.io/v2/monitors", bytes.NewBuffer(body))
    req.Header.Set("Authorization", "Bearer sp_live_8f9a2b1c4d5e6f7g8h9i0j")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    fmt.Println(resp.Status)

Node.js (fetch)

const createMonitor = async () => {
  const response = await fetch('https://api.sentinelpulse.io/v2/monitors', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sp_live_8f9a2b1c4d5e6f7g8h9i0j',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Checkout Microservice',
      type: 'http',
      interval_seconds: 10