Skip to content
Developer API · v1

PulseWatch API reference

Programmatic access to outage intelligence. Query services, incidents, and metrics — or wire PulseWatch directly into your on-call tooling.

Overview

The PulseWatch API exposes the same data that powers your dashboards — monitored services, detected incidents, 15-minute metric buckets, and alert configuration — behind a single authenticated HTTPS endpoint.

JSON over HTTPS

Every request is a POST with a JSON body. Every response is JSON.

Bearer token auth

One API key per integration, rotatable from the dashboard.

Webhook-native

Every incident event can also be delivered to your URL as a signed webhook.

All requests hit a single dispatch endpoint. The operation is chosen via theendpoint field in the JSON body — for example "services.list" or"incidents.current".

Quickstart

  1. 1

    Create an API key

    Go to Dashboard → API keys and generate a new key. Keys start with pw_live_ and are shown exactly once.

  2. 2

    Make your first request

    Every call is a POST with a JSON body and a Bearer token. Start with services.list:

curl -X POST https://your-app.base44.app/functions/publicApi \
  -H "Authorization: Bearer pw_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"endpoint": "services.list"}'
  1. 3

    Wire up alerts (optional)

    Create an Alert rule in the dashboard and point it at a webhook URL to receive incident lifecycle events directly.

Authentication

Authenticate every request with a Bearer token. Generate and revoke keys from theAPI keyspage. Full keys are shown only at creation time — if lost, revoke and regenerate.

Authorization: Bearer pw_live_<32 characters>

Key hygiene

Never commit keys to source control. Rotate keys after any suspected exposure — revoked keys stop working immediately and do not grant a grace period.

Rate limits & quotas

Limits apply per API key. Both per-minute request caps and monthly request quotas are enforced.

PlanRequests / minuteMonthly quota
FreeNo API access
Pro300100,000
Business1,0001,000,000
EnterpriseCustomCustom

When limits are exceeded, the API returns 429 Too Many Requests. Back off exponentially and retry after the rate window resets (per-minute windows are 60 seconds).

Plan requirement

API keys can be created on Pro and Business plans. Requests made with a key whose account is on the Free plan return 403 plan_required.

Pagination

List endpoints accept an optional limit (incidents.history up to 500, metrics.buckets up to 288). Cursor pagination is not available yet: narrow the window with the endpoint's own filters instead of paging.

{
  "endpoint": "incidents.history",
  "limit": 100
}

Services

Read data about every service PulseWatch monitors.

POSTservices.list

Return all monitored services along with their current operational status.

Parameters

  • categorystring · optional. Filter by category (cloud, payments, social…)
  • statusstring · optional. Filter by currentStatus (normal, possible_issue, major_issue)

Request

{
  "endpoint": "services.list"
}

Response

{
  "services": [
    {
      "id": "svc_aws",
      "name": "AWS",
      "slug": "aws",
      "category": "cloud",
      "currentStatus": "normal",
      "baselinePerHour": 12
    }
  ]
}
POSTservices.get

Fetch a single service by its slug.

Parameters

  • slugstring · required. URL-safe service identifier (e.g. 'stripe')

Request

{
  "endpoint": "services.get",
  "slug": "stripe"
}

Response

{
  "service": {
    "id": "svc_stripe",
    "name": "Stripe",
    "slug": "stripe",
    "currentStatus": "possible_issue",
    "category": "payments"
  }
}

Incidents

Incidents represent detected disruptions with start, end, severity, and confidence scores.

POSTincidents.current

All currently-open incidents across every monitored service, sorted by severity.

Request

{
  "endpoint": "incidents.current"
}

Response

{
  "incidents": [
    {
      "id": "inc_123",
      "serviceId": "svc_stripe",
      "serviceName": "Stripe",
      "status": "major_issue",
      "severity": "high",
      "startedAt": "2026-04-23T14:32:11Z",
      "peakReports": 189,
      "confidenceScore": 0.82
    }
  ]
}
POSTincidents.history

Paginated historical incidents (resolved and still-open) for one service or your whole account.

Parameters

  • serviceIdstring · optional. Filter to a single service
  • limitinteger · optional. Page size, default 100, max 500
  • cursorstring · optional. Pagination cursor from previous response

Request

{
  "endpoint": "incidents.history",
  "serviceId": "svc_stripe",
  "limit": 50
}

Response

{
  "incidents": [
    {
      "id": "inc_98",
      "status": "resolved",
      "severity": "medium",
      "startedAt": "2026-04-20T09:10:00Z",
      "endedAt": "2026-04-20T09:48:00Z",
      "peakReports": 412
    }
  ],
  "next_cursor": null
}

Metrics

Detection metrics for any service, aggregated into 15-minute buckets with baseline and severity scores.

POSTmetrics.buckets

Most recent 15-minute report buckets for a service (baseline and severity included).

Parameters

  • serviceIdstring · required. Service to query
  • limitinteger · optional. Number of buckets, 1–288 (default 96 = 24 hours)

Request

{
  "endpoint": "metrics.buckets",
  "serviceId": "svc_stripe",
  "limit": 96
}

Response

{
  "data": [
    {
      "serviceId": "svc_stripe",
      "pointInTime": "2026-04-23T14:00:00Z",
      "intervalMinutes": 15,
      "totalReports": 42,
      "uniqueSessions": 31,
      "baselineValue": 8,
      "severityScore": 5.25
    }
  ]
}

Watchlists

Watchlists group services together so you can focus dashboards and alerts on the dependencies that matter to you.

POSTwatchlists.list

Watchlists owned by the authenticated API customer, with their service members.

Request

{
  "endpoint": "watchlists.list"
}

Response

{
  "watchlists": [
    {
      "id": "wl_1",
      "name": "Production stack",
      "serviceIds": ["svc_stripe", "svc_aws"]
    }
  ]
}

Alerts & webhooks

Alert rules are configured in the dashboard. Use the API to audit or script rule state.

POSTalerts.rules.create

Create an alert rule for the user linked to this API key (plan limits apply).

Parameters

  • serviceIdstring · required. Service to alert on
  • deliveryChannelstring · optional. email, webhook or in_app (default in_app)
  • thresholdTypestring · optional. possible_issue, major_issue (default) or any_change

Request

{
  "endpoint": "alerts.rules.create",
  "serviceId": "svc_stripe",
  "deliveryChannel": "email",
  "thresholdType": "major_issue"
}

Response

{
  "data": {
    "id": "ar_1",
    "serviceId": "svc_stripe",
    "deliveryChannel": "email",
    "thresholdType": "major_issue",
    "enabled": true
  }
}

Webhook deliveries

PulseWatch POSTs a signed JSON payload to your webhook URL on each triggered alert. Payloads include event.type, incident, and service. Every request includes anX-PulseWatch-Signature header so you can verify authenticity (see Webhooks in the dashboard for signature format).

Errors

All errors return a structured JSON body with an error code and a human-readable message. Always log both.

StatusMeaning
400Bad request — missing or invalid endpoint field or parameters.
401Missing or invalid API key.
403Key revoked, account inactive, or plan does not include API access.
404Unknown endpoint name or resource.
429Rate limit or monthly quota exceeded. Back off and retry.
500Unexpected server error — retry with exponential backoff.

Example error payload

{ "error": "quota_exceeded", "message": "Monthly quota of 100,000 exceeded. Upgrade your plan or wait until next cycle." }