On this pagetap to expand
ServicePulse Docs
Monitor third-party vendors, build a public status page, and get alerted when your dependencies go down.
Looking for the full reference docs?
In-app guides below cover product behavior end-to-end. The API Reference section lists public HTTP surfaces (personal API under /api/v1, posting keys, widgets, ingest, audit export). Official open-source clients, CI, and orchestrator examples live on GitHub (see Open source & pipelines). For a Swagger-style explorer (try requests, schemas, authorize), use API Explorer.
Getting Started
Everything you need to know in your first 5 minutes.
What is ServicePulse?
It also lets you build a public status page so your customers can see your service health, and monitors your own HTTP endpoints and databases via heartbeat.
Adding your first vendor
Your dashboard
- Green — operational, no issues
- Yellow — degraded performance or partial outage
- Red — major outage or active incident
Vendor Monitoring
Track third-party services and get alerted when they have incidents.
Vendor catalog
Filtering regions (e.g. Snowflake, AWS)
Custom vendors
Polling frequency
Trust Portal & Subprocessors
yourslug.servicepulse.dev/trust.Share this URL with customers and security reviewers to demonstrate GDPR-minded vendor transparency. The trust portal lists all your marked subprocessors with their current status.
Incidents
Track and understand active and historical vendor incidents.
Incident timeline
AI summaries
ServicePulse uses Claude to read long incident threads and produce a single plain-English sentence:
"Stripe is experiencing elevated error rates on charge creation in the US-East region, affecting ~15% of API calls. Engineers are investigating."
Incident history
Incident scope & ignore
- Component scope — on the vendor page, select only the components or regions you watch (e.g. Snowflake regions, AWS AZs).
- Exclude / unless keywords — per vendor, add keywords that hide incidents (e.g.
fedramp) and "unless" overrides (e.g.commercial,api). - Ignore incident — dismiss a single incident; ServicePulse can suggest scope keywords with AI when you ignore.
Scoped incidents are hidden on your dashboard, excluded from alerts and SLA calculations, and filtered in the AI assistant. Vendor-wide status may still show degraded if other customers are affected — your effective view reflects scope.
Correlation & war room
When multiple vendors have active incidents, ServicePulse detects possible shared causes — incidents starting within a short window, or text mentioning shared infrastructure (AWS, Cloudflare, etc.).
The War Room lists each cluster with confidence (low / medium / high), affected vendors, and an AI root-cause narrative. From there you can:
- Draft a postmortem (markdown timeline + action items)
- Push the draft to a Notion page (if Notion is connected under Account → Integrations)
- Dispatch chat (Business) — ask questions and run live tools against your Connections (Dagster asset graph, Temporal workflows, Cloudflare zone health, GitHub, Airflow, MCP, and more)
Dispatch resolves tools by connection slug. Link connections to services on the Connections page so War Room knows which credentials apply during an incident.
Correlation signals: when Push or workflow failures arrive within 30 minutes of a vendor cluster, War Room attaches related push/workflow signals to the cluster and may raise confidence. Proactive playbooks auto-run list_connections and vendor discovery when you open a cluster (Business).
Unified service timeline: on My Services, expand a service to see vendor incidents, Push events, and ping failures from the last 7 days in one feed.
Scheduled maintenance
Planned downtime on your public status page — not the same as third-party vendor incidents above.
What it is
Scheduled maintenance is your planned work — database failovers, deploy freezes, region migrations — that you announce on your status page so customers know what to expect.
In the app
Automation & API
Notifications
Get alerted when vendors go down — before your customers notice.
Setting up notifications
Go to Account → Notifications. Enter your email, Slack incoming webhook URL (channel alerts only), Microsoft Teams webhook URL, PagerDuty integration key, or other listed channels. You can configure which events trigger alerts: new incident, incident updated, incident resolved, SLA breaches, and more.
For the Slack workspace app with slash commands (
/servicepulse …), use Account → Integrations — documented under Integrations.Natural-language alert rules
Add rules in plain English, for example: "Alert me if Stripe payment API is down for more than 30 minutes."or "Alert when checkout ping fails AND Stripe is down."ServicePulse parses vendor names, title keywords, minimum duration, severity, ping monitor names, and composite AND conditions into structured rules.
When you have any alert rules enabled, incident notifications must match at least one rule — in addition to your channel preferences and incident scope. With no rules, normal channel + scope behavior applies. Ping monitor alerts follow the same pattern: if you add ping-specific rules, a ping failure must match at least one before it notifies. Each saved rule shows a parsed summary (vendors, keywords, duration, severity). Claude parses rules when
ANTHROPIC_API_KEY is configured; otherwise a heuristic parser is used.Quiet hours
Alert grouping
- Every incident separately — distinct alert per new incident; no vendor-level cooldown
- Smart grouping (default) — merge multiple new incidents from one poll into one alert; 20-minute cooldown before another new-incident alert on the same vendor/channel
- Maximum quiet — same poll merging with a 60-minute cooldown
Per-incident deduplication always applies — you won't get repeat alerts for the same incident. Skipped alerts from grouping show in Notif. History.
Notification channels by plan
| Channel | Plan required |
|---|---|
| Pro+ | |
| Microsoft Teams | Pro+ |
| Discord | Pro+ |
| Slack incoming webhook | Team+ |
| Slack app (OAuth, slash commands) | Team+ |
| PagerDuty | Team+ |
| Outbound Webhook | Team+ |
| Google Chat | Team+ |
| Zapier | Team+ |
| Jira Automation | Team+ |
All channels apply to both vendor incidents and your own ping monitor alerts.
Outbound webhooks
ServicePulse will POST a signed JSON payload to your URL every time a vendor status changes or an incident fires.
The request includes a signature header for verification:
POST <your-webhook-url>
X-ServicePulse-Signature: sha256=<hmac-sha256-hex>
Content-Type: application/json
{
"vendor_name": "Stripe",
"status": "major_outage",
"incident_title": "Elevated API error rates",
"incident_description": "...",
"timestamp": "2026-03-17T14:32:00.000Z"
}Verify the signature using HMAC-SHA256 with your webhook secret as the key. Use this to trigger runbooks, Slack bots, or incident management workflows.
Notification history
- Out of incident scope or ignored incident
- No matching natural-language alert rule
- Quiet hours
- Deduplicated or merged duplicate update from the same vendor poll
- Vendor multi-incident grouping (when Alert grouping is not "Every incident separately")
Use this to debug why an alert didn't arrive — misconfigured webhooks, scope filters, and alert rules all show up here.
Account & Integrations
Profile and billing live under Account; OAuth tools (Slack, metrics, files) live under Account → Integrations.
Account (profile & billing)
Integrations hub
Open Account → Integrations (signed in) to manage OAuth and long-lived connections: Slack workspaces, Vercel project discovery, external metric sources (e.g. Datadog), and contract/document imports (Google Drive, Dropbox, Common Paper) where your plan supports them.
This is separate from Account → Notifications, which is where you enable alert channels (email, webhooks, PagerDuty, etc.) and routing rules. Use both together: connect a tool here, then choose how you want to be notified when something breaks.
Integration connection registry (Business)
Register named connections for GitHub orgs, Dagster/Airflow/Prefect deployments, Temporal namespaces, Cloudflare accounts, dbt Cloud, Fivetran, Snowflake, and MCP servers. War room Dispatch resolves tools by connection
slug — credentials and repo indexes are isolated per ServicePulse workspace.Platform connections (War Room):
- Dagster deployment — GraphQL asset graph, orchestrator vendor discovery via
watchedVendorSlugs; pair with Dagster+ Push webhooks for enriched alerts - Temporal namespace — list recent workflow executions during incidents
- Cloudflare account — zone health and DNS/proxy status (distinct from tracking the Cloudflare vendor in My Stack for platform outages)
GitHub (multi-tenant): each customer org admin installs the shared ServicePulse GitHub App on their GitHub organization (one click in Connections). Set the connection's
orgLogin to match that GitHub org exactly. Repo sync runs automatically via platform webhooks when repositories are added or removed — customers do not configure webhooks themselves.Remediation: Dispatch can propose human-approved actions (PRs, DAG reruns, dbt job runs, GitHub Actions dispatches, workflow reruns) using secrets stored on your connections only.
Setup wizards (Business): Account → Connections → Setup wizard… for guided setup: dbt Cloud, Dagster+, Temporal, n8n, Kestra, GCP Workflows, and Azure Data Factory. Each wizard walks through connection fields, Push webhook URL/body,
watchedVendorSlugs, and War Room checklist — then pre-fills the Add connection form.Test connection: expand a connection row and click Test connection to verify API reachability (updates
lastUsedAt / lastError).Cloud API auth (GCP / Azure / Step Functions): prefer an internal executions proxy URL over storing long-lived tokens. The Add connection form shows proxy vs token guidance; setup wizards include copy-paste webhook bodies. See Cloud executions proxy for ServicePulse Managed Proxy (Business) and BYO reference servers.
Cloud executions proxy
Workflow platforms need a stable HTTP API to list recent executions (and optionally redrive Step Functions). ServicePulse supports two modes:
- ServicePulse Managed Proxy (recommended) — when you create a cloud connection without a BYO URL, we assign
https://your-app/api/cloud-proxy/{token}automatically. Store GCP/Azure/AWS credentials as connection secrets; the token only identifies the connection. - Bring your own proxy — deploy reference servers from integrations/cloud-proxies (Cloud Run, Azure Functions, Lambda) and paste the URL as
executionsProxyUrl.
Contract (GET):
GET /api/cloud-proxy/{token}?limit=10&workflow=...&pipeline=...&stateMachine=...
{
"platform": "gcp_workflows",
"executions": [
{ "id": "exec-1", "name": "daily-sync", "status": "FAILED", "startedAt": "..." }
]
}Step Functions redrive (POST):
POST /api/cloud-proxy/{token}/redrive with body {"executionArn":"..."}.Setup: Account → Connections → Setup wizard… → GCP / Azure / Step Functions. Choose ServicePulse Managed or Bring your own URL (with Test proxy URL). Use Test connection on the connection row to verify.
Workflow failure → status page (opt-in): expand a workflow connection → enable Open status page incidents when failed executions are detected. Link the connection to a service on your status page first. A cron job checks every 5 minutes; incidents auto-resolve when failures clear.
Slack workspace app
/servicepulse status— rollup of tracked vendors (scope-aware)/servicepulse incidents— active vendor incidents/servicepulse sla,/servicepulse credits— SLA breach and credit summary/servicepulse services,/servicepulse stack— services and dependency stack/servicepulse maintenance,/servicepulse ping/servicepulse ack,/servicepulse who,/servicepulse subscribe,/servicepulse alerts/servicepulse help— full command list
Interactive alerts include buttons to ignore an incident, snooze a vendor, or acknowledge a ping monitor down state. @mention the bot in a channel for the same live-data AI assistant as the web app (Team+). Scheduled report presets can post recurring digests to a channel.
Self-hosted deployments must set SLACK_CLIENT_ID, SLACK_CLIENT_SECRET, and SLACK_SIGNING_SECRET in the environment.
Slack incoming webhook vs Slack app
Slack app (this section): interactive workspace install; use slash commands to query status on demand. You can use both if you want push alerts and in-channel lookups.
Uptime & Endpoint Monitoring
Monitor your own services, jobs, and databases.
HTTP monitors
https://api.yourapp.com/health) and ServicePulse pings it at regular intervals. If it returns an unexpected status code or times out, you get an alert. Supports GET, HEAD, and POST (with optional headers and body).HTTP monitors are for endpoints you can reach over the public internet with a stable success signal. They do not replace warehouse drivers: Snowflake, Databricks, and similar need a script-based check (see Database monitoring) or your own health proxy.
Heartbeat monitors
You get a unique URL. Your job calls it at the end of each run. If ServicePulse doesn't hear from it within 2× the expected interval, the monitor turns red and you get alerted.
Example: a nightly backup job that runs at 2am. If it doesn't check in by 2:10am, you know something went wrong.
ServicePulse probe (install wizard)
- A
probe-config.jsonfor private HTTP, Postgres, or shell-command checks - Copy-paste steps for Docker, pip + cron, or Kubernetes CronJob
The open-source servicepulse-probe runs inside your VPC, checks private endpoints, and pings your heartbeat URL on success. ServicePulse never connects inbound to your network.
Vercel integration
{project}.vercel.app), and lets you create HTTP monitors in one click. Monitors are linked to the Vercel catalog vendor so deployment uptime sits alongside Vercel platform status.When you monitor a production deployment, ServicePulse also provisions a Push endpoint for Vercel deploy webhooks (
deployment.error, etc.) so failed deploys appear in your timeline without manual webhook setup.Platform outages are still tracked via the Vercel vendor status page — add Vercel to My Stack if you have not already. Think of three layers: vendor (Vercel platform status), HTTP monitor (your production URL), and Push (deploy events).
Database monitoring
- Connects with your existing drivers or CLI
- Runs a health query (e.g.
SELECT 1) - Pings the ServicePulse heartbeat URL if successful
When you create a Private DB monitor, ServicePulse generates scripts for PostgreSQL, MySQL, Snowflake, Databricks, SQL Server, Oracle, SQLAlchemy (many engines), shell, Python, and Node — or use the probe install wizard for a config-driven setup.
You can customize the query — for example, check that a table has been updated in the last 10 minutes. For vendor-wide incidents at Snowflake and similar, track them under Vendors separately from private DB heartbeats.
Alert thresholds
Setting "alert after 2 consecutive failures" means a single blip won't wake anyone up — only a sustained outage will. Recovery alerts (when the monitor comes back up) can also be toggled independently.
Monitor detail page
- 24h and 90-day uptime percentages
- Average and p95 response time
- Response time chart (90 days)
- Day-by-day uptime calendar with 7/30/90d toggle
- Full incident log with duration and cause
Status Pages
Give your customers a public place to check your service health.
Your public status page
yourslug.servicepulse.dev. You can also configure a custom domain (e.g. status.yourcompany.com).Services and dependencies
Example: "Payments" depends on Stripe. If Stripe has a partial outage, your Payments service shows degraded automatically.
Embeddable widget & badge
YOUR_APP_URL with your deployment, e.g. https://servicepulse.dev, and slug with your public page slug):Iframe — compact or badge
<iframe src="YOUR_APP_URL/s/slug/embed?style=badge&theme=light" width="280" height="42" frameborder="0" title="Status"></iframe>JavaScript badge (injects a pill with live text)
<script src="YOUR_APP_URL/api/widget/slug" data-style="badge" data-theme="light"></script>JSON API for custom UIs:
GET YOUR_APP_URL/api/widget/slug/statusLinking a ping monitor to a service
Incidents API
Post your own status-page incidents programmatically from Datadog, PagerDuty, or any tool that can send an HTTP request. Then POST to:
POST /api/status-page/[slug]/incidentsInclude your Bearer token and a JSON body with
title, body, and status. Full examples: API Reference → Incidents.Scheduled maintenance (planned downtime)
Custom CSS for Status Pages
Use the Custom CSS textarea to override the look of your public and secure status pages.
Your CSS is applied inside the status page component; use the documented hooks below for predictable styling.
ServicePulse sets these CSS variables on the page:
--bg— the status page background--fg— the status page text color--accent— the status page accent color
Documented CSS hooks (stable):
.sp-status-page— top-level status page container.header— the page header area.service-item— each service card row.sp-overall-banner— overall status banner.sp-overall-banner-dot— status dot inside the overall banner.sp-overall-banner-label— banner label text.sp-maintenance-banner— maintenance banner (and children like...-title,...-item).sp-maintenance-banner-title— maintenance banner title.sp-maintenance-banner-list— list container.sp-maintenance-banner-item— each maintenance entry.sp-maintenance-banner-link— “View all maintenance…” link.sp-incident-card— each incident details card (active + historical).sp-incident-card--historical— historical incident card styling (Recent Updates).sp-incident-summary— incident summary row (title + status badge + timestamp).sp-incident-body— incident body shown when expanded.sp-incident-created-at— timestamp on the incident summary row.sp-incident-resolved-at— resolved timestamp (historical incidents).sp-incident-status— incident status badge.sp-service-history— the 30-day history region inside each service card.sp-service-history-item— the service card wrapper when history is enabled.sp-service-history-summary— the summary row inside the service card.sp-service-name— service name text.sp-service-history-toggle— “30-day history” toggle text.sp-service-history-header— “Last 30 days” header row.sp-service-history-day— each 30-day day cell in the history strip.sp-service-history-days— strip/container for the day cells.sp-embed-snippet-toggle— “Embed this status page” summary.sp-embed-snippet-body— embed snippet body.sp-embed-snippet— the “Embed this status page” widget
You can override variables and/or target any elements inside the page. Example:
.sp-status-page { background: var(--bg); color: var(--fg); }
.sp-status-page .header { border-bottom: 0; }
.sp-status-page .service-item { padding: 20px; }
.sp-overall-banner { border-width: 0; }
.sp-overall-banner-dot { border-radius: 9999px; }
.sp-maintenance-banner-title { text-transform: uppercase; }
.sp-incident-card { border-color: rgba(37, 99, 235, 0.25) !important; }
/* You can also override variables like: */
/* .sp-status-page { --accent: #22c55e; } */Custom numeric metrics on public status pages
ServicePulse supports user-defined numeric metrics (time series) that you post via API. These charts are shown on your public status page under Status Page → Metrics.
POST /api/status-page/<slug>/metrics
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"metric": "web_traffic", // stable key you pick
"value": 120, // number
"timestamp": "2026-03-17T14:22:00Z", // optional ISO string (defaults to now)
"unit": "req/s", // optional (stored and shown in charts)
"label": "Web traffic" // optional (stored as display name)
}Notes:
- First ingest will upsert the metric and create the public chart configuration if needed.
- You can remove metrics from Status Page → Metrics; ingesting again may re-add them.
Trust Portal / Subprocessors
yourslug.servicepulse.dev/trust. Share this URL with customers and prospects to demonstrate GDPR compliance.RSS / Atom feed
/s/yourslug/feed with the last 50 incident updates and your service summary.Copy the feed URL from Status Page settings (RSS section). Subscribe in Feedly, Slack RSS, IFTTT, or any RSS reader.
This is separate from vendor RSS (custom vendors with an RSS source URL), which ServicePulse polls on your vendor schedule like any other tracked vendor.
Public vendor status pages (catalog)
/status/vendor-slug (e.g. /status/stripe) for vendors in the catalog. These are separate from your custom status page at /s/yourslug.Metrics
Uptime history, response time charts, and custom numeric metrics — for vendors, monitors, and your own data.
Vendor metrics
- A response time chart (avg and p95) with a 7/30/90-day toggle
- A day-by-day uptime calendar color-coded by worst status
Ping monitor metrics
- 24h and 90-day uptime percentages
- Average and p95 response time
- Response time chart (90 days)
- Day-by-day uptime calendar with a 7/30/90-day toggle
Custom metrics — pushing your own data
The Metrics page in the sidebar shows all custom numeric metrics you push via API. Use these for anything you want to track over time: request rates, error counts, queue depth, revenue, deploy frequency.
Push a data point with your status page posting key:
POST /api/status-page/<slug>/metrics
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"metric": "error_rate", // stable key you choose
"value": 0.42, // numeric value
"unit": "%", // optional — stored and shown in charts
"timestamp": "2026-04-01T12:00:00Z" // optional, defaults to now
}The first ingest auto-creates the metric. You can send a single object or an array of objects in one request.
External metric sources (Datadog, New Relic)
Under Account → Developers → External Metric Sources (or connect Datadog OAuth under Account → Integrations), add Datadog or New Relic queries and link each source to a catalog vendor. ServicePulse polls every few minutes, backfills ~7 days on first connect, and stores points for charts.
On the vendor detail page, linked sources appear as APM metrics — 90-day charts with bucket (raw / 1h / 1d / 1w) and aggregation (avg, min, max, sum, count).
Use cases:
- Surface API latency or error rate next to vendor status page health
- Correlate a Datadog monitor spike with a vendor incident timeline
- Compare product ping latency vs Datadog-reported latency for the same vendor
Series API (signed-in): GET /api/vendors/<slug>/metrics/<sourceId>/series?bucket=1d&agg=avg
The number of external metric sources you can connect depends on your plan. See Billing for limits.
Metrics on your public status page
In Status Page → Metrics, opt in to show charts publicly. You can add any tracked vendor, ping monitor, custom metric, or linked Datadog/New Relic APM source. For vendor and monitor charts, toggle uptime and/or response time visibility independently. APM and custom metrics support bucket/aggregation presentation (raw, 1h, day, week).
Visitors to your status page see the charts with the same 7/30/90-day toggle.
Uptime & SLA comparison
The Uptime page shows all your tracked vendors side-by-side: uptime %, SLA target, and whether they're meeting it. Set a custom SLA target per vendor under its detail page → SLA tab. Vendors with attached contracts show their committed uptime automatically. SLA calculations respect incident scope — out-of-scope incidents do not count against measured uptime.
Vendor reliability scores
Push & Webhooks
Receive incident data from vendors that push rather than publish a status page.
Inbound push webhooks — overview
Some vendors and internal tools push incident data rather than publishing a status page you can poll. Go to Push in the sidebar, create an endpoint, and paste the generated URL into the vendor's webhook settings. Each endpoint has its own unique token embedded in the URL — no extra auth header required.
Incoming payloads are auto-detected and normalized. Supported formats:
- Native ServicePulse JSON (events + service status push)
- Atlassian Statuspage (incident & component_update webhooks)
- PagerDuty webhook v3
- Alertmanager (Prometheus)
- Datadog alert webhooks — fires when a monitor alert triggers or recovers
- New Relic alert webhooks — fires on policy condition state changes
- Dagster+ alert webhooks — fires on alert policy triggers
- Workflow platforms — n8n, Kestra, ZenML, Argo, Step Functions, Flyte, GCP Workflows, Azure Data Factory, dbt Cloud runs
- Jira Automation (outbound POST to your rule's URL)
Push endpoint templates
Open-source wiring guides: integrations/recipes
Setting up a PagerDuty webhook
- Go to Push in the sidebar and click New Endpoint. Copy the generated URL.
- In PagerDuty, open Integrations → Webhooks and add a new webhook pointing to that URL.
- Select the event types you want forwarded (recommended: incident.triggered, incident.resolved, incident.acknowledged).
- Save — ServicePulse will start receiving events immediately.
PagerDuty payloads are auto-detected as v3 format. No extra config required on the ServicePulse side.
Setting up Alertmanager (Prometheus)
webhook_configs receiver in your Alertmanager config pointing to your push URL:receivers:
- name: servicepulse
webhook_configs:
- url: https://servicepulse.dev/api/ingest/<token>
send_resolved: trueSet send_resolved: true so ServicePulse can auto-resolve incidents when Alertmanager sends a resolved status.
Setting up Dagster+ alert webhooks
Steps in Dagster+:
- Go to Alerts in your Dagster+ deployment.
- Create or edit an alert policy. Under Notification channel, choose Webhook.
- Set the webhook URL to your ServicePulse push endpoint:
https://servicepulse.dev/api/ingest/<your-token> - Save the alert policy. ServicePulse will start receiving events immediately.
Dagster+ sends the following fields in the webhook payload — all are available for alert rules in ServicePulse:
alert_summary— short summary of the alertalert_content— full alert bodyalert_policy_name— name of the policy that firedalert_policy_id— policy IDalert_policy_description— policy descriptionalert_id— unique ID for this alert instancedeployment_name— Dagster+ deployment namedeployment_url— URL to the deploymentnotification_type— type of notificationis_sample—truewhen triggered by a test alert
To also update a service status when a Dagster job fails, add
serviceId and status fields to the webhook body (see Pushing service status below).Pushing service status from pipelines
Add
serviceId and status to any ingest payload:POST https://servicepulse.dev/api/ingest/<token>
Content-Type: application/json
{
"type": "service_status",
"serviceId": "<your-service-id>",
"status": "degraded_performance",
"title": "ETL pipeline latency elevated",
"message": "p95 exceeds SLA threshold in us-east-1"
}Valid status values: operational, degraded_performance, partial_outage, major_outage, maintenance, unknown.The pushed status is combined with vendor dependency status — the worst of the two is shown. Find your service ID on the Status Page → Services settings page.
Native push payload format
1. Log an event (recorded in your push feed, can trigger notifications):
POST https://servicepulse.dev/api/ingest/<token>
Content-Type: application/json
{
"type": "deploy.failed",
"title": "API latency spike",
"message": "p95 latency is elevated in us-east-1",
"severity": "minor" // info | minor | major | critical
}2. Push a service status — updates the displayed health of a specific service on your status page. Use this when your own pipeline is degraded even though all your upstream vendors are green:POST https://servicepulse.dev/api/ingest/<token>
Content-Type: application/json
{
"type": "service_status",
"serviceId": "<your-service-id>",
"status": "degraded_performance",
"title": "ETL pipeline latency elevated",
"message": "p95 exceeds SLA threshold in us-east-1"
}Valid status values: operational, degraded_performance, partial_outage, major_outage, maintenance. The pushed status is combined with vendor dependency status — the worst of the two is what your status page shows. Find your service ID on the Status Page → Services settings page.The token in the URL is your push endpoint token — find it on the Push page. No Authorization header needed.
Alert rules for push events
Organizations
Share monitoring with your whole team. Requires Team plan or above.
Creating an organization
Go to Organization in the sidebar. Click Create Organization, enter a name, and invite teammates by email. Once you switch to the org context, all monitored vendors, services, ping monitors, alerts, and the status page are shared across the team.
Plan limits: Team plan includes 1 organization. Business plan includes unlimited organizations.
Switching between personal and org workspace
API tokens are also workspace-scoped. A token created while in your personal workspace cannot read org data, and vice versa. Create a separate personal API token for each workspace you need to automate.
Inviting and managing team members
- Invite members by email (they receive a Clerk invite link)
- Assign roles: Admin or Member
- Remove members or revoke pending invitations
Admins can access billing, audit log, and org settings. Members can view and manage the shared vendor stack but cannot change billing or see the audit log.
SAML SSO
ServicePulse sign-in is powered by Clerk Organizations. Enable SAML 2.0 so teammates authenticate with your identity provider — Okta, Microsoft Entra ID, Google Workspace SAML, OneLogin, and others.
- Open Account → Organization while in your org workspace
- In the organization profile, go to SSO
- Add a SAML connection and paste your IdP metadata (or use Clerk's setup wizard)
- Map attributes so email is required; test with a non-admin user before enforcing
Personal workspaces continue to use email/password or social login. SSO applies only to organization members after you enable it in Clerk.
Audit log
The audit log records every meaningful action taken in your workspace:
- Vendor added or removed from tracking
- Ping monitor created, updated, or deleted
- Notification channel added or removed
- Status page settings changed
- API token created or revoked
- Push endpoint created or deleted
- Organization member invited or removed
In a personal workspace, you always see your own history. In an org, only admins (Clerk role org:admin) can access the audit log. Each entry shows the actor's name, email, action, and a timestamp.
Export via the in-app UI (CSV or JSON), or call GET /api/audit-log?format=csv with a browser session. For scripted access, use GET /api/v1/audit-log with a personal API token (personal workspace only — org audit log requires browser session).
My Services
Internal view of your own products and their vendor dependencies.
What are services?
Creating a service and adding dependencies
You can add as many dependencies as you need. The service card on the dashboard shows an aggregated status badge and the individual status of each dependency below it.
Unified health score
My Services vs. Status Page
Status Page is the public-facing view your customers see — simplified, with only the services you choose to expose. You decide which of your services to surface publicly and what to call them. Configure which services appear publicly under Status Page → Settings.
SLA Contracts
Vendor agreements in the app (Business), SLA targets vs measured uptime (Pro+), breach exports (Team+).
What are SLA contracts?
SLA contracts record the committed availability targets from your agreements and compare them to measured uptime from each vendor's status page.
Go to Contracts in the sidebar to upload or import agreements (Business). Each contract links to a tracked vendor. The Uptime & SLA page shows targets vs actuals and breach signals for plans that include SLA intelligence (Pro+).
Contract ingestion sources
The Contract Integrations page (Settings → Contract Integrations) lets you connect document sources to pull contracts in automatically:
- CommonPaper — sync signed agreements directly from your CommonPaper account
- Google Drive — index PDFs in a specified Drive folder
- Dropbox — pull contracts from a Dropbox folder
After connecting a source, ServicePulse parses SLA clauses (uptime percentage, measurement window, exclusions) and pre-fills the contract record. You review and confirm before it goes live.
SLA breach reports
GET /api/sla/report).With contracts attached to vendors (Business), export SLA breach reports from the Uptime & SLA page: pick a vendor, a measurement window (monthly, quarterly, or annual), and download as CSV or view inline.
Same export via API (signed-in browser session, not a personal API token):
GET /api/sla/report.SLA claims & service credits
When a vendor breaches your SLA window, ServicePulse opens a claim on SLA Claims (
/sla/claims) with a filing deadline countdown.- Dashboard widget shows estimated service credits (USD) parsed from contract remedy text when available
- Generate a draft vendor credit email with measured uptime evidence
- Track claim status: open → filed → resolved
Repo Analyzer
Scan your codebase to discover which vendors your application actually depends on.
What does Repo Analyzer do?
Repo Analyzer scans your GitHub repositories for third-party SDK imports, API calls, and dependency references — then cross-references them against the ServicePulse vendor catalog. The result is a suggested list of vendors to add to your stack, based on what your code is actually using.
This is especially useful when onboarding: instead of manually searching for every vendor, connect your repo and ServicePulse discovers most of them for you.
Connecting a repository
Analysis typically completes in seconds for smaller repos. Results show matched vendors with confidence scores. Click Track next to any vendor to add it to your stack immediately.
What gets detected?
- package.json / requirements.txt / go.mod — official SDK package names (e.g.
stripe,@sendgrid/mail) - Source code imports — SDK imports and API client instantiation patterns
- Environment variables — API key variable names (e.g.
STRIPE_SECRET_KEY,TWILIO_ACCOUNT_SID) - Config files — references to vendor hostnames and API base URLs
Plans & Billing
What each plan includes and how limits work.
Plan overview
| Feature | Free | Pro | Team | Business |
|---|---|---|---|---|
| Tracked vendors | 5 | 25 | 100 | Unlimited |
| Ping monitors | 3 | 20 | 50 | Unlimited |
| Uptime history | 7 days | 90 days | 1 year | 1 year |
| AI summaries | — | ✓ | ✓ | ✓ |
| AI assistant (live data) | — | — | ✓ | ✓ |
| Natural-language alert rules | — | — | ✓ | ✓ |
| War room & correlations | ✓ | ✓ | ✓ | ✓ |
| Email notifications | — | ✓ | ✓ | ✓ |
| Slack / PagerDuty | — | — | ✓ | ✓ |
| Outbound webhooks | — | — | ✓ | ✓ |
| Organizations | — | — | 1 | Unlimited |
| SLA breach reports | — | — | ✓ | ✓ |
| SLA claims & credit drafts | — | ✓ | ✓ | ✓ |
| Contract ingestion | — | — | — | ✓ |
| Custom CSS status page | — | — | — | ✓ |
Usage meters
Upgrading and managing subscriptions
Migrate from Statuspage.io
Import your components, incident history, and subscribers from Atlassian Statuspage in minutes.
One-click importer
The built-in importer connects to the Statuspage Manage API using your existing API key and brings over everything — no CSV exports, no manual work.
- Components → Services — each Statuspage component becomes a service on your status page, in the same order.
- Incident history — historical incidents with original timestamps, status, and update bodies.
- Email subscribers — imported as unconfirmed; subscribers receive a one-time re-confirmation email (CAN-SPAM required) before going live.
Find the importer under Account → Import from Statuspage in the app sidebar, or go directly to /import/from-statuspage. Most migrations complete in under 2 minutes.
Migrating your automation (CI/CD scripts)
If you have scripts or CI pipelines that post to the Statuspage API, you can point them at ServicePulse with a one-line environment variable change. No code changes needed — ServicePulse accepts the same request shapes.
# Old
STATUSPAGE_API_BASE=https://api.statuspage.io
STATUSPAGE_API_KEY=<your-statuspage-oauth-key>
STATUSPAGE_PAGE_ID=<your-statuspage-page-id>
# New — only these three lines change
STATUSPAGE_API_BASE=https://servicepulse.dev/api/compat/statuspage
STATUSPAGE_API_KEY=<your-servicepulse-posting-key>
STATUSPAGE_PAGE_ID=<your-servicepulse-slug> # e.g. "acme"The compat shim supports Authorization: OAuth <key> (Statuspage format) and Authorization: Bearer <key> (ServicePulse format). Full endpoint list: API Reference → Statuspage compatibility shim.
Open source & pipelines
CI (GitHub, GitLab, Azure), Terraform, GitOps, probe, clients in Python/Node/Go, orchestrators, and recipes — same APIs as the product.
GitHub: servicepulsehq/integrations
The open-source integrations monorepo lives at github.com/servicepulsehq/integrations. It includes:
- Python
servicepulse-clientand typed JS/Go clients - Orchestrator and CI integrations — Airflow, Dagster, Prefect (see
libraries/andexamples/), plus GitHub Actions, GitLab, and Azure templates - Terraform
stack_health, GitOps samples, probe, webhooks
Use a Personal API token (sp_…) from Developers in the app. Vendors must be tracked in the same workspace the token was created for. Pipelines typically call GET /api/v1/tracked-vendors or GET /api/v1/stack-summary for a rolled-up health signal.
API Reference
Automate status updates, read dashboard data, embed widgets, and integrate with your existing tooling.
Overview — API families
Pick the surface that matches your integration. Each section below documents request shape, auth, and query parameters.
- API Explorer (OpenAPI) — interactive reference (Swagger UI): try requests, request bodies, and Authorize for Bearer tokens
- Authentication — three token types (personal
sp_..., status page posting key, push URL) - Personal API — dashboard automation with a Bearer
sp_...token; base path/api/v1(see also open-source examples on GitHub) - Public status & widgets — JSON for public pages (no token)
- Status page posting key — incidents, services, maintenance, and custom metrics for one page
- Statuspage.io compatibility shim — point existing Statuspage scripts at ServicePulse with one env-var change
- Push ingest — inbound webhooks to your account
- SLA breach report — export (browser session, Team+)
- Audit log export — CSV/JSON with a signed-in browser session (Team+)
- Audit log (personal API) — Team+; personal workspace tokens only
- Outbound webhooks — ServicePulse notifies your URL
- curl examples
Authentication
- Personal API token — account-level Bearer token. Generate one under Developers in the sidebar. Pass as
Authorization: Bearer sp_.... Use with the Personal API and the discovery endpointGET /api/v1. - Status page posting key — a Bearer token scoped to a single status page. Generate it under Developers → Status Page Posting Key. Use it for incidents, maintenance windows, and posting custom metrics — not for
/api/v1. - Push endpoint token — embedded directly in the ingest URL (
/api/ingest/<token>). NoAuthorizationheader needed. Create one under Push in the sidebar.
Workspace scope: when you create a personal API token, it is bound to the workspace active in the app (personal account vs organization). Use a separate token per workspace if you automate both.
Personal API (Bearer sp_…, /api/v1)
/api/v1/audit-log is Team+). Check Billing for your quota.JSON API for scripts, CI, and integrations (mostly reads; create monitors via POST /api/v1/ping-targets). Auth: Authorization: Bearer sp_... (personal tokens from Developers, or Organization API tokens minted there when a Clerk org is active — same /api/v1 behavior, org-owned so automation survives member churn; org admins only). Discovery: GET /api/v1 returns the endpoint index as JSON.
| Method | Path | Description |
|---|---|---|
| GET | /api/v1 | Discovery (endpoint index) |
| GET | /api/v1/me | tokenKind: personal (user id, email) vs organization (no user; organizationName, Clerk org id) |
| GET | /api/v1/ping-targets | List monitors; type: heartbeat includes heartbeatUrl + interval for agents (treat like a secret). hasAuthHeaders only flags — no probe secrets |
| POST | /api/v1/ping-targets | Create HTTP monitor; optional requestHeaders, requestBody (e.g. JSON POST probes) |
| GET | /api/v1/tracked-vendors | Tracked vendors + current status snapshot |
| GET | /api/v1/stack-summary | Rolled-up stack health (worstStatus, summary, non-operational list) — useful for CI and orchestrators |
| GET | /api/v1/incidents | Vendor incidents; query limit, activeOnly, resolvedOnly, status, vendorSlug, severity |
| GET | /api/v1/metrics | Custom numeric metrics (id, key, unit) |
| GET | /api/v1/metrics/{id}/series | Time series; query bucket = raw | 1h | 1d | 1w, agg = sum | avg | min | max | count |
| GET | /api/vendors/{slug}/metrics/{sourceId}/series | Datadog/New Relic APM series for a linked metric source (browser session; same bucket / agg query params) |
| GET | /api/v1/status-page | Your status page slug, title, public URL for this workspace |
| POST | /api/v1/ask | Natural-language Q&A over live data (Team+; personal token only) |
| GET | /api/v1/audit-log | Audit entries (Team+). Personal workspace token only — use the app for org audit history. Query from, to, q, actionType, limit (≤500) |
Custom metric charts call GET /api/metrics/{id}/series with a browser session. Vendor APM charts (Datadog/New Relic) use GET /api/vendors/{slug}/metrics/{sourceId}/series. For automation, use GET /api/v1/metrics/{id}/series with a personal or organization API token.
Audit log (same Personal API) — response includes actor (name, email) per entry. Org-scoped tokens cannot use this endpoint; open Settings → Audit log in the app when an organization is active.
MCP server (Cursor & Claude Desktop)
Connect ServicePulse to Cursor, Claude Desktop, eltPulse, or other MCP hosts. Use the hosted MCP at mcp.servicepulse.dev (Streamable HTTP + SSE, Authorization: Bearer sp_…) or run the stdio server locally. Tools wrap the Personal API.
Hosted (eltPulse / remote clients): URL https://mcp.servicepulse.dev, transport HTTP, header Authorization: Bearer sp_your_token.
- Create a personal API token under Developers (
sp_…). - Build the server:
cd integrations/mcp-server && npm install && npm run build - Add to
.cursor/mcp.json(see.cursor/mcp.json.examplein the repo).
{
"mcpServers": {
"servicepulse": {
"command": "node",
"args": ["/path/to/servicepulse/integrations/mcp-server/dist/index.js"],
"env": {
"SERVICEPULSE_API_TOKEN": "sp_your_token",
"SERVICEPULSE_BASE_URL": "https://servicepulse.dev"
}
}
}
}Tools include servicepulse_health_snapshot, servicepulse_stack_summary, servicepulse_list_incidents (with activeOnly, vendorSlug filters), servicepulse_create_ping_target, servicepulse_ask (Team+), and MCP resources at servicepulse://docs/getting-started. Remote hosts can use npm run start:http (Streamable HTTP + SSE on port 3100). Full list: integrations/mcp-server README.
Audit log export (browser session)
When you are signed into the app, you can export the same audit log your org admins see (with org rules applied) without a Bearer token:
GET /api/audit-log?format=json|csv— optional query paramsfrom,to,q,actionType,limit(max 2000),offset. Uses the session cookie; not ansp_...token.
GET /api/v1 lists the current discovery payload (including /api/v1/audit-log when deployed).
Public status & embed widgets (no auth)
These endpoints work for public status pages only (isPublic in settings). No Bearer token.
GET /api/status-page/<slug>/status— overall status, services, active incidents (JSON for dashboards and monitors).GET /api/widget/<slug>/status— CORS-enabled JSON for embeds;Cache-Control: public, max-age=60.GET /api/widget/maintenance/<slug>/status— upcoming / active maintenance for widgets; supportsaudienceandleadMinutesquery params.GET /s/<slug>/feed— RSS feed of public status page incident updates (no auth).
Heartbeat monitors (cron) use GET|POST /api/heartbeat/<token> — the token is in the path, not the posting key. With a personal API token, GET /api/v1/ping-targets returns heartbeatUrl for each heartbeat monitor so on-prem agents (for example the integrations probe) do not need copy-paste from the app.
Status page posting key — what it covers
One key (shown under Developers → Status Page Posting Key) authenticates write APIs for a single status page slug. It is not the same as a personal sp_... token.
- Incidents — create, update, resolve
- Services — list and update components
- Maintenance windows — list and schedule
- Custom numeric metrics — POST data points
The sections below follow that order: incidents, maintenance, and metrics are different APIs (different paths) that share the same posting key — maintenance is not a sub-resource of incidents.
Status page — incidents API (posting key)
sp_... token.Post, update, and resolve incidents on your public status page. Auth:
Authorization: Bearer <posting-key>.Create incident
POST /api/status-page/<slug>/incidents
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"title": "Elevated error rates",
"body": "We are investigating reports of elevated error rates.",
"status": "investigating", // investigating | identified | monitoring | resolved
"severity": "major" // minor | major | critical
}Update incidentPATCH /api/status-page/<slug>/incidents/<id>
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"body": "Fix has been deployed. Monitoring.",
"status": "monitoring"
}Resolve incidentPATCH /api/status-page/<slug>/incidents/<id>
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"body": "Fully resolved as of 14:32 UTC.",
"status": "resolved"
}Planned downtime is not created here — use the maintenance windows API next.
Status page — services API (posting key)
List and update services (components) on your status page programmatically. Useful for CI/CD pipelines that need to mark a service as degraded without creating a full incident.
List servicesGET /api/status-page/<slug>/services
Authorization: Bearer <your-posting-key>Get one serviceGET /api/status-page/<slug>/services/<serviceId>
Authorization: Bearer <your-posting-key>Update a servicePATCH /api/status-page/<slug>/services/<serviceId>
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"name": "Payments",
"public_name": "Payment Processing",
"description": "Stripe payment flows",
"active": false
}All fields in the PATCH body are optional. Set active: false to mark a service as inactive (hidden from the status page). The id of each service is returned in the list — use that as serviceId.
Statuspage.io compatibility shim
If you have CI/CD scripts, Terraform configs, or automation that targets the Statuspage.io API, you can point them at ServicePulse with a one-line change. Replace https://api.statuspage.io with https://servicepulse.dev/api/compat/statuspage and use your ServicePulse posting key as the OAuth token.
The page ID used in URL paths can be either your status page slug (e.g. acme) or the numeric-style page ID returned by the GET /v1/pages discovery call.
| Method | Path | Description |
|---|---|---|
| GET | /v1/pages | Discover your page ID |
| GET | /v1/pages/:pageId | Page metadata |
| GET | /v1/pages/:pageId/components | List all components (services) |
| GET | /v1/pages/:pageId/components/:id | Get one component |
| PATCH | /v1/pages/:pageId/components/:id | Update component status / name |
| GET | /v1/pages/:pageId/incidents | List incidents |
| POST | /v1/pages/:pageId/incidents | Create incident |
| GET | /v1/pages/:pageId/incidents/:id | Get one incident |
| PATCH | /v1/pages/:pageId/incidents/:id | Update incident status / body |
| DELETE | /v1/pages/:pageId/incidents/:id | Delete incident |
| POST | /v1/pages/:pageId/incidents/:id/incident_updates | Append incident update (status + body) |
# Before
STATUSPAGE_API_KEY=your-statuspage-oauth-key
STATUSPAGE_PAGE_ID=your-statuspage-page-id
STATUSPAGE_API_BASE=https://api.statuspage.io
# After (set these, no code changes needed)
STATUSPAGE_API_KEY=your-servicepulse-posting-key
STATUSPAGE_PAGE_ID=your-servicepulse-slug-or-page-id
STATUSPAGE_API_BASE=https://servicepulse.dev/api/compat/statuspageAuth: use Authorization: OAuth <posting-key> (Statuspage style) or Authorization: Bearer <posting-key> (ServicePulse style) — both work.
Status page — maintenance windows API (posting key)
Separate from the incidents API above: different paths (/maintenance vs /incidents). Same posting key Bearer token. List or schedule planned work on your status page.
GET /api/status-page/<slug>/maintenance?limit=50
Authorization: Bearer <your-posting-key>limit is optional (1–100, default 50). Response includes maintenance array with window metadata.
POST /api/status-page/<slug>/maintenance
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"title": "Database upgrade",
"description": "Brief read-only window while we fail over.",
"startsAt": "2026-04-01T02:00:00.000Z",
"endsAt": "2026-04-01T03:00:00.000Z",
"serviceIds": ["clxxxxxxxx"],
"audienceMode": "inherit",
"notifyOnCreate": true,
"notifyMinutesBefore": 60,
"notifyOnStart": true,
"notifyOnEnd": true
}audienceMode: inherit | public-only | internal-only.serviceIds must be valid service IDs on your page (empty array = no specific services).
Status page — custom metrics ingest (posting key)
POST numeric time-series points for metrics defined on your status page.
POST /api/status-page/<slug>/metrics
Authorization: Bearer <your-posting-key>
Content-Type: application/json
{
"metric": "request_rate",
"value": 42.5,
"timestamp": "2026-04-01T12:00:00.000Z",
"unit": "req/s",
"label": "Optional label"
}You can send a single object or an array of objects. Each item requires metric (key) and a numeric value.
Push webhook endpoint
Receive incident data from external tools by creating a push endpoint. Go to Push in the sidebar, create an endpoint, and paste the URL into your external tool's webhook configuration.
POST https://servicepulse.dev/api/ingest/<token>ServicePulse auto-detects the payload format. Supported formats:
- Native ServicePulse JSON
- Atlassian Statuspage (incident / component_update webhooks)
- PagerDuty webhook v3
- Alertmanager (Prometheus)
- Datadog alert webhooks — fires when a monitor alert triggers or recovers
- New Relic alert webhooks — fires on policy condition state changes
- Jira Automation (outbound POST to your rule's URL)
Datadog & New Relic on Push endpoints receive alert/incident events (monitor fired, policy breached). For time-series charts on vendor pages, use External Metric Sources under Developers (see APM charts on vendor pages). You can use push alerts and metric sources together.
Native push payload
POST /api/ingest/<token>
Content-Type: application/json
{
"status": "degraded", // operational | degraded | outage | maintenance
"title": "API latency spike",
"message": "p95 latency is elevated in us-east-1",
"severity": "minor" // info | minor | major | critical
}SLA breach report (browser session)
GET /api/sla/report — exports SLA breach analysis for a vendor and time window (slaBreachReports).
Query params: vendorId, window (monthly | quarterly | annual), periodStart (ISO date), optional format=csv.
curl examples
curl -s https://servicepulse.dev/api/v1/me \
-H "Authorization: Bearer sp_your_personal_token..."Personal API — list ping monitors:curl -s https://servicepulse.dev/api/v1/ping-targets \
-H "Authorization: Bearer sp_your_personal_token..."Personal API — create authenticated API monitor:curl -X POST https://servicepulse.dev/api/v1/ping-targets \
-H "Authorization: Bearer sp_your_personal_token..." \
-H "Content-Type: application/json" \
-d '{"name":"Payments API","url":"https://api.example.com/v1/health","method":"GET","expectedStatus":200,"requestHeaders":{"Authorization":"Bearer YOUR_TOKEN"}}'Create incident (status page posting key — not sp_):curl -X POST https://servicepulse.dev/api/status-page/acme/incidents \
-H "Authorization: Bearer <your-posting-key>" \
-H "Content-Type: application/json" \
-d '{"title":"Database degraded","status":"investigating","severity":"major"}'Push ingest (account push URL):curl -X POST https://servicepulse.dev/api/ingest/<token> \
-H "Content-Type: application/json" \
-d '{"status":"operational","title":"Deploy complete","severity":"info"}'Schedule maintenance (posting key):curl -X POST https://servicepulse.dev/api/status-page/acme/maintenance \
-H "Authorization: Bearer <your-posting-key>" \
-H "Content-Type: application/json" \
-d '{"title":"Planned DB maintenance","startsAt":"2026-04-01T02:00:00.000Z","endsAt":"2026-04-01T03:00:00.000Z","serviceIds":[]}'Outbound webhook payload
When you configure an outbound webhook (Settings → Notifications → Outbound Webhook), ServicePulse sends a signed POST request on each trigger:
POST <your-webhook-url>
X-ServicePulse-Signature: sha256=<hmac-sha256-hex>
Content-Type: application/json
{
"vendor_name": "Stripe",
"status": "major_outage",
"incident_title": "Elevated API error rates",
"incident_description": "Stripe is reporting elevated error rates...",
"timestamp": "2026-03-17T14:32:00.000Z"
}The signature uses HMAC-SHA256 with your webhook secret as the key. Verify it to confirm the payload came from ServicePulse.
Something missing or unclear? Contact support or check the roadmap.