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.


Base URL

<https://api-prod.vibraniumlabs.ai/api/v1>

Authentication

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.


Conventions

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.

Endpoints

Incidents

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"]}.

Alerts

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"]}.

Window conditions