Last updated: 2026-10-05
The Vibe OnCall Public API gives programmatic access to your organization's incidents, alerts, maintenance windows, services, teams, members, on-call schedules, labels, and automation actions. It follows REST conventions, returns JSON, and requires an API key on every endpoint except the OpenAPI spec.
<https://api-prod.vibraniumlabs.ai/api/v1>
All endpoints except the OpenAPI spec require an API key in the Authorization header:
Authorization: Bearer vlk_your_api_key_here
See API Key Management for instructions on creating and managing API keys. Requests without a valid key receive a 401 Unauthorized response. A key's Access limits what it can do: a Read-only key, or a Custom key that lacks the needed action, receives 403 Forbidden on any request that makes a change. The response names the actions the key is missing. Every request is scoped to the organization that owns the key.
| Topic | Detail |
|---|---|
| Pagination | List endpoints take limit (max 100) and offset. List responses include total and hasMore. Default page sizes are listed per endpoint below. |
| Array filters | Pass multiple values comma-separated, e.g. ?statuses=open,acknowledged. |
| Timestamps | All timestamps are ISO 8601 instants, e.g. 2026-09-20T14:00:00Z. |
| Severity | SEV0 – SEV5 or SIGNAL. |
| Team identifiers | Team endpoints take the team shortId (e.g. VP-TEAM-ABC123) in the path. A service's or schedule's teamId is the numeric team id. GET /teams returns both. |
| User identifiers | userId is the user id returned by GET /members, which lists every member of the organization. GET /teams/{teamShortId}/members returns the same id for members of one team. |
| Rate limits | Requests are rate limited per API key. A throttled request receives 429 with a Retry-After header giving the number of seconds to wait before retrying. |
| Status codes | 200 / 201 / 204 success · 400 invalid request · 401 missing, invalid, expired, or revoked API key · 403 the key's Access doesn't allow the request · 404 not found in your organization · 409 conflict (for example, an external ID already in use, or a chat platform that is not connected) · 429 rate limited · 500 server error. |
Incident responses carry the service catalog entries attached to the incident — each service's id, name, kind, links, and the groups it belongs to. Every write below is recorded on the incident's timeline, attributed to the API key that made it.
| Method | Endpoint | Description |
|---|---|---|
GET |
/incidents |
List incidents (default limit 10). Filters: since, until, severities, statuses (open, acknowledged, blocked, observation, resolved), responderTeamIds, responderUserIds, channels (Slack or Microsoft Teams channel IDs), labelIds, serviceIds, lastActivityBefore, searchTerm, includeArchived (default true). |
GET |
/incidents/{id} |
Get one incident. Use include to expand optional fields: postmortems, conversations, meetingTranscripts, timeline. |
PATCH |
/incidents/{id} |
Update an incident's fields. Body: any combination of title, description (send null to clear it), severity, and status (open, acknowledged, blocked, observation, resolved) — at least one is required. Example: {"title": "Checkout API latency elevated", "status": "acknowledged"}. |
POST |
/incidents/batch |
Get up to 100 incidents by ID. Body: {"ids": [101, 102]}. |
PUT |
/incidents/{id}/services |
Replace the incident's services with the set you send — internal service catalog IDs, as strings. This does not add those services' responders to the incident. Body: {"serviceIds": ["123", "456"]}. |
POST |
/incidents/{id}/responders/add |
Add responders. Each item is {"type": "user", "userId": 345} or {"type": "team", "teamId": 12}, and a team item may also carry overrideEscalationPolicyId to page through a policy other than the team's default. Users must be active or pending. Body: {"responders": [{"type": "user", "userId": 345}]}. |
POST |
/incidents/{id}/responders/remove |
Remove responders. Same body as add. Removal also works for a user who has since been deprovisioned, so stale responders can be cleaned up. |
POST |
/incidents/{id}/labels/add |
Add labels by name. Labels that don't exist yet are created in the default label color. 1–5 labels per call, 30 characters max each, and 5 labels per incident in total. Body: {"labels": ["customer-impacting"]}. |
POST |
/incidents/{id}/labels/remove |
Remove labels by name. Body: {"labels": ["customer-impacting"]}. |
POST |
/incidents/{id}/comments |
Add a comment. It also appears on the incident timeline. Body: {"comment": "Rolled back the deploy"}. |
PATCH |
/incidents/{id}/comments/{commentId} |
Edit a comment. Returns the incident's comments. Body: {"comment": "..."}. |
DELETE |
/incidents/{id}/comments/{commentId} |
Delete a comment. Returns the incident's remaining comments. |
POST |
/incidents/{id}/custom-fields/add |
Add or replace custom fields. Body: {"customFields": {"region": "us-east-1"}}. |
POST |
/incidents/{id}/custom-fields/remove |
Remove custom fields by key. Keys that don't exist are ignored. Body: {"customFieldKeys": ["region"]}. |
| Method | Endpoint | Description |
|---|---|---|
GET |
/alerts |
List alerts (default limit 10). Filters: createdAfter, createdBefore, severities, statuses (open, acknowledged, closed, resolved), providers, teamIds, labelIds, searchTerm. |
GET |
/alerts/{id} |
Get one alert, including its timeline and linked incidents. |
PATCH |
/alerts/{id} |
Change an alert's severity. Body: {"severity": "SEV3"}. Severity is the only field this endpoint changes. |
POST |
/alerts/batch |
Get up to 100 alerts by ID. Body: {"ids": [201, 202]}. |
POST |
/alerts/{id}/notes |
Add a note. Returns the alert's notes. Body: {"note": "Disk usage back under 80%"}. |
PATCH |
/alerts/{id}/notes/{noteId} |
Edit a note. Body: {"note": "..."}. |
DELETE |
/alerts/{id}/notes/{noteId} |
Delete a note. |
POST |
/alerts/{id}/metadata/add |
Add or replace top-level metadata entries. Body: {"metadata": {"runbook": "https://..."}}. |
POST |
/alerts/{id}/metadata/remove |
Remove metadata entries by key. Keys that don't exist are ignored. Body: {"metadataKeys": ["runbook"]}. |
POST |
/alerts/{id}/labels/add |
Add labels by name. Labels that don't exist yet are created. 1–5 labels, 30 characters max each. Body: {"labels": ["database"]}. |
POST |
/alerts/{id}/labels/remove |
Remove labels by name. Body: {"labels": ["database"]}. |