Download OpenAPI Specification
Download the OpenAPI/Swagger specification to explore the Rootly API endpoints or generate client libraries.
Official SDKs
Use the official Go and Python SDKs to integrate with the Rootly API.
OAuth 2.0 & OpenID Connect
Browser-based login, scoped third-party access, and user-independent client credentials tokens.
Chat API
The Chat API lets your application talk to Rootly AI, with optional incident or alert context. Its endpoints are underhttps://api.rootly.com/v1/ai/chat:
Send
message with either POST request. You can also send incident_id or alert_id to give the conversation context; these two fields are mutually exclusive. Pass session_id to continue an existing conversation. In the paths above, {session_id} and {id} both mean the same session UUID; the names follow each operation’s OpenAPI definition. The OpenAPI specification describes the complete request and response schemas.
Chat API availability is controlled separately for each team. Rootly must enable the API chat rollout and API chat setting for the selected team, and Rootly Agent in Slack must also be enabled under AI SRE → Atlas → Conversations → Slack, or under AI & Agents → Features → Slack where that navigation is still in use. The API chat setting is not a self-service toggle either way; contact your Rootly account team to verify or enable access. If the surface is disabled, the API returns 403 with “AI chat is not enabled for this team.”
Authenticate with a bearer API key or an OAuth token. OAuth calls need ai.chat:write for POST and DELETE, or ai.chat:read for GET; ai.chat:write also grants read access. The API checks the caller’s access to any incident or alert supplied as context.
How to generate an API Key?
To generate a new API key, navigate to: Organization dropdown > Organization Settings > API Keys > Generate New API Key. Rootly supports three scopes of API Keys:API key expiry and rotation
Every new API key must have an expiry date. It must be in the future and can be at most 5 years out, so plan how you will rotate a key before you issue it.name, description, and expires_at can be changed afterwards. The key’s kind, its role, and the token itself cannot — to issue a new token, rotate the key; to change its role or kind, revoke it and create a new one.
Rotation
Rotating a key issues a new token and returns it once. Store it immediately; it cannot be retrieved again. Two things to plan around:- Through the API, you can only rotate the key you authenticated with. Rotating a different key returns 403 Forbidden.
- The grace period is what avoids downtime. The previous token keeps working for
grace_period_minutesafter rotation — from 0 to 1,440 minutes (24 hours), defaulting to 30. Set it to0to invalidate the old token immediately. The response’sgrace_period_ends_atgives the exact moment the old token stops working.
expires_at sets one 90 days out.
The usual sequence: rotate, deploy the new token everywhere, let the grace period elapse, and the old token invalidates itself.
JSON:API Specification
Rootly is using the JSON:API (https://jsonapi.org) specification:- JSON:API is a specification for how a client should request that resources be fetched or modified, and how a server should respond to those requests.
- JSON:API is designed to minimize both the number of requests and the amount of data transmitted between clients and servers. This efficiency is achieved without compromising readability, flexibility, or discoverability.
- JSON:API requires use of the JSON:API media type (application/vnd.api+json) for exchanging data.
Authentication and Requests
All API requests use theAuthorization: Bearer header over HTTPS. Rootly supports two token types:
Both token types work with the same header — the API detects which one you sent automatically.
Rate limiting
Each API key has three separate per-minute budgets. By default, each one is 50 requests per minute:- When the per-key limit is exceeded, the API will return a 429 Too Many Requests HTTP status code with the response:
{"error": "Rate limit exceeded. Try again later."}- Rootly recommends configuring your Alert Sources to handle this response and retry to create your Alert in Rootly.
- X-RateLimit headers are included in every API response, providing real-time rate limit information:
- X-RateLimit-Limit - The maximum number of requests permitted and the length of the window, in seconds
- X-RateLimit-Remaining - The number of requests remaining in the current rate limit window
- X-RateLimit-Used - The number of requests already made in the current window
- X-RateLimit-Reset - The time at which the current rate limit window resets, in UTC epoch seconds
Per-IP limit
Requests are also limited to 10,000 every 5 minutes per IP address, and a request has to satisfy both this and the per-key limits above. Clients that share one IP address, such as a CI fleet or a NAT gateway, can reach it while every key is under its own limit.A 429 from the per-IP limit looks different from a per-key 429. It does not use the
X-RateLimit-* headers. Instead it carries a Retry-After header with the number of seconds to wait, and its body is {"error": "Too Many Requests. Retry Later."}.Pagination
Endpoints that return a collection of items are paginated./v1/alerts, /v1/incidents, and /v1/alert_events use cursor pagination; use it whenever you list these.
Cursor pagination
- Make the first request without
page[number]. Setpage[size]if you want something other than the default of 50. - Read
meta.next_cursorfrom the response and send it back aspage[after]to get the next page. - Stop when
meta.next_cursoris empty.
- If a request fails, wait and retry it with the same
page[after]value. Do not start over from the first page. - To keep a copy of your data up to date, fetch only what changed since your last run with
filter[updated_at][gte]instead of downloading everything again. This works on/v1/alertsand/v1/incidents. page[size]can be up to 1,000. On/v1/alert_eventsthe maximum is 50.
Page-number pagination
Other endpoints use page numbers:- page[number] defaults to 1.
- page[size] defaults to 50 items. The maximum is 1,000; a larger value is rejected with
400 Bad Request. Some endpoints have a lower maximum, listed in each endpoint’s entry in the API Reference.
GET /v1/oncalls is not paginated and returns every matching on-call in a single response. On a large roster, narrow it with its filters (filter[schedule_ids], filter[escalation_policy_ids], filter[user_ids], filter[service_ids], filter[group_ids]) and the since / until window.