REST API
Programmatic access to incidents, schedules, services, teams, and more.
Base URL
https://api.notifyhero.com/v1
Authentication
All requests require a Bearer token:
curl https://api.notifyhero.com/v1/incidents \
-H "Authorization: Bearer nh_live_abc123"
Generate API keys at Settings → API Keys. Keys are prefixed:
nh_live_— production keysnh_test_— test keys (sandbox environment)
Rate Limits
| Plan | Requests/minute | |------|----------------| | Free | 60 | | Team | 300 | | Business | 1,000 | | Enterprise | 5,000 |
Rate limit headers are included in every response:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 298
X-RateLimit-Reset: 1709312400
When rate limited, you'll receive 429 Too Many Requests.
Incidents
List Incidents
curl https://api.notifyhero.com/v1/incidents \
-H "Authorization: Bearer nh_live_abc123" \
-G -d "status=triggered" -d "limit=10"
Parameters: status (triggered, acknowledged, resolved), service_id, priority, since, until, limit, offset
Get Incident
curl https://api.notifyhero.com/v1/incidents/INC-1042 \
-H "Authorization: Bearer nh_live_abc123"
Create Incident
curl -X POST https://api.notifyhero.com/v1/incidents \
-H "Authorization: Bearer nh_live_abc123" \
-H "Content-Type: application/json" \
-d '{
"title": "Manual incident — customer reports checkout failures",
"service_id": "srv_abc123",
"priority": "P1",
"severity": "critical",
"description": "Multiple customer reports of checkout timeouts"
}'
Acknowledge
curl -X PUT https://api.notifyhero.com/v1/incidents/INC-1042/acknowledge \
-H "Authorization: Bearer nh_live_abc123"
Resolve
curl -X PUT https://api.notifyhero.com/v1/incidents/INC-1042/resolve \
-H "Authorization: Bearer nh_live_abc123" \
-d '{"resolution_note": "Rolled back deploy v2.4.1"}'
Events (Ingest)
Send events through the Events API (same as webhook integrations):
curl -X POST https://events.notifyhero.com/v1/ingest/{integration_key} \
-H "Content-Type: application/json" \
-d '{
"event_type": "trigger",
"severity": "critical",
"title": "Database connection pool exhausted",
"source": "db-primary-01",
"dedup_key": "db-pool-primary-01"
}'
The Events API has separate, higher rate limits (10,000 events/minute on all plans).
Schedules
List Schedules
curl https://api.notifyhero.com/v1/schedules \
-H "Authorization: Bearer nh_live_abc123"
Who's On-Call Now
curl https://api.notifyhero.com/v1/schedules/sched_abc123/on-call \
-H "Authorization: Bearer nh_live_abc123"
Response:
{
"user": {
"id": "usr_xyz789",
"name": "Alice Chen",
"email": "alice@your-company.com"
},
"schedule": "Backend Primary",
"shift_start": "2026-03-01T09:00:00Z",
"shift_end": "2026-03-08T09:00:00Z"
}
Services
List Services
curl https://api.notifyhero.com/v1/services \
-H "Authorization: Bearer nh_live_abc123"
Create Service
curl -X POST https://api.notifyhero.com/v1/services \
-H "Authorization: Bearer nh_live_abc123" \
-H "Content-Type: application/json" \
-d '{
"name": "checkout-service",
"description": "Handles payment processing",
"escalation_policy_id": "ep_abc123"
}'
Teams
# List teams
curl https://api.notifyhero.com/v1/teams \
-H "Authorization: Bearer nh_live_abc123"
# Get team members
curl https://api.notifyhero.com/v1/teams/team_abc123/members \
-H "Authorization: Bearer nh_live_abc123"
Pagination
List endpoints return paginated results:
{
"data": [...],
"pagination": {
"total": 142,
"limit": 25,
"offset": 0,
"has_more": true
}
}
Use limit and offset query parameters to paginate.
Errors
Standard HTTP status codes with descriptive error bodies:
{
"error": {
"code": "not_found",
"message": "Incident INC-9999 not found",
"status": 404
}
}
| Code | Meaning | |------|---------| | 400 | Bad request — check your parameters | | 401 | Unauthorized — invalid or missing API key | | 403 | Forbidden — insufficient permissions | | 404 | Not found | | 429 | Rate limited | | 500 | Server error — retry with backoff |
SDKs
Official SDKs:
# Node.js
npm install @notifyhero/node
# Python
pip install notifyhero
# Go
go get github.com/notifyhero/notifyhero-go
# Ruby
gem install notifyhero
// Node.js example
import { NotifyHero } from '@notifyhero/node';
const nh = new NotifyHero({ apiKey: 'nh_live_abc123' });
const incidents = await nh.incidents.list({ status: 'triggered' });
await nh.incidents.acknowledge('INC-1042');
Webhooks (Outbound)
Subscribe to events from NotifyHero:
curl -X POST https://api.notifyhero.com/v1/webhooks \
-H "Authorization: Bearer nh_live_abc123" \
-d '{
"url": "https://your-company.com/webhooks/notifyhero",
"events": ["incident.triggered", "incident.resolved"],
"secret": "your-webhook-secret"
}'
All outbound webhooks include an X-NotifyHero-Signature header for verification.