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?
This page is a quick-start guide. The complete API reference, advanced configuration, and integration guides live on our external docs site.
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
Incidents
Track and understand active and historical vendor incidents.
Incident timeline
AI summaries (Pro+)
"Stripe is experiencing elevated error rates on charge creation in the US-East region, affecting ~15% of API calls. Engineers are investigating."
AI summaries appear on the vendor page and in email notifications.
Incident history
Notifications
Get alerted when vendors go down — before your customers notice.
Setting up notifications
Notification channels by plan
| Channel | Plan required |
|---|---|
| Pro+ | |
| Microsoft Teams | Pro+ |
| Discord | Pro+ |
| Slack | 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.
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.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.
Database monitoring
- Connects to your database
- Runs a health query (e.g.
SELECT 1) - Pings the ServicePulse heartbeat URL if successful
When you create a Database monitor, ServicePulse generates copy-paste scripts for PostgreSQL, MySQL, Python, and Node.js. You can customize the query — for example, check that a table has been updated in the last 10 minutes.
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
<iframe src="https://yourslug.servicepulse.dev/widget" />Copy the embed code from the Status Page settings page.
Linking a ping monitor to a service
Incidents API (Pro+)
POST /api/status-page/[slug]/incidentsInclude your Bearer token and a JSON body with
title, body, and status.Custom CSS for Status Pages (Business)
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 (Pro+)
Posting requires your Status Page Posting Key (same key as the Incidents API).
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.Metrics
Uptime history and response time charts — for your vendors and your own monitors.
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
Metrics on your public status page
Visitors to your status page see the charts with the same 7/30/90-day toggle.
Uptime & SLA comparison
Push & Webhooks
Receive incident data from vendors that push rather than publish.
Inbound push webhooks
Organizations
Share monitoring with your whole team. Requires Team plan.
Creating an organization
Switching between personal and org
My Services
Internal view of your own products and their vendor dependencies.
What are services?
My Services vs. Status Page
Status Page is the public-facing view your customers see — simplified, with only the services you choose to expose. Configure which services appear publicly under Status Page → Settings.
API Reference
Automate status updates, post incidents, and integrate with your existing tooling.
Authentication
- Personal API token — account-level Bearer token. Generate one under Developers in the sidebar. Pass as
Authorization: Bearer sp_.... - Status page posting key — a Bearer token scoped to a single status page. Generate it under Developers → Status Page Posting Key.
- Push endpoint token — embedded directly in the ingest URL (
/api/ingest/<token>). NoAuthorizationheader needed. Create one under Push in the sidebar.
Push webhook endpoint
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 (incoming webhook)
Note on Datadog & New Relic: these integrations receive alert/incident events (monitor fired, policy breached), not raw time-series metrics. Full metric ingestion (response times, error rates) from external APM tools is on the roadmap.
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
}Status page incidents API
Create incident
POST /api/status-page/<slug>/incidents
Authorization: Bearer <your-api-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-api-key>
Content-Type: application/json
{
"body": "Fix has been deployed. Monitoring.",
"status": "monitoring"
}Resolve incidentPATCH /api/status-page/<slug>/incidents/<id>
Authorization: Bearer <your-api-key>
Content-Type: application/json
{
"body": "Fully resolved as of 14:32 UTC.",
"status": "resolved"
}curl examples
curl -X POST https://servicepulse.dev/api/status-page/acme/incidents \
-H "Authorization: Bearer sp_a1b2c3d4e5f6..." \
-H "Content-Type: application/json" \
-d '{"title":"Database degraded","status":"investigating","severity":"major"}'Push a status update from CI/CD:curl -X POST https://servicepulse.dev/api/ingest/<token> \
-H "Content-Type: application/json" \
-d '{"status":"operational","title":"Deploy complete","severity":"info"}'Outbound webhook payload
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.
Need deeper reference docs? docs.servicepulse.dev →