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
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
Make your first request
Every call is a
POSTwith a JSON body and a Bearer token. Start withservices.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"}'- 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.
| Plan | Requests / minute | Monthly quota |
|---|---|---|
| Free | No API access | |
| Pro | 300 | 100,000 |
| Business | 1,000 | 1,000,000 |
| Enterprise | Custom | Custom |
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.
services.listReturn 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
}
]
}services.getFetch 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.
incidents.currentAll 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
}
]
}incidents.historyPaginated historical incidents (resolved and still-open) for one service or your whole account.
Parameters
serviceIdstring · optional. Filter to a single servicelimitinteger · optional. Page size, default 100, max 500cursorstring · 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.
metrics.bucketsMost recent 15-minute report buckets for a service (baseline and severity included).
Parameters
serviceIdstring · required. Service to querylimitinteger · 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.
watchlists.listWatchlists 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.
alerts.rules.createCreate an alert rule for the user linked to this API key (plan limits apply).
Parameters
serviceIdstring · required. Service to alert ondeliveryChannelstring · 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.
| Status | Meaning |
|---|---|
| 400 | Bad request — missing or invalid endpoint field or parameters. |
| 401 | Missing or invalid API key. |
| 403 | Key revoked, account inactive, or plan does not include API access. |
| 404 | Unknown endpoint name or resource. |
| 429 | Rate limit or monthly quota exceeded. Back off and retry. |
| 500 | Unexpected 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." }