Preview: the Teams API is enabled per organization. To turn it on, contact
help@resolve.ai. Until it is on, every endpoint returns 403 with the code api_disabled.What you can manage
Resolve also changes channels and alert filters itself, for example when someone accepts a suggestion in Resolve. Expect those changes when you read a team.
Base URL
app.resolve.ai. All paths below are relative to this URL. Requests and responses use JSON.
Authentication
Send an API token created by an organization admin in theAuthorization header:
- The token decides the organization. A request never names an organization, and a team of another organization returns
404. - A missing, invalid, or expired token, or one whose creator is deactivated, returns
401. - A token whose creator is not an organization admin returns
403. If the creator loses the admin role or leaves, create a new token and update your pipeline.
The team document
Endpoints
List teams
limit defaults to 100, with a maximum of 500. Pass nextCursor back as ?cursor= for the next page; it is null on the last page.
Create a team
201 Created with the whole team document, its ETag, and Location: /api/v1/teams/<id>.
- If a team with that name exists, the response is
409with the codename_conflictand the existing team’s id, so a retried create never makes a duplicate. - Without
membership, the token’s creator joins the new team as an admin. Withmembership, the declared roster is the whole team, so declare the admins you want.
Update part of a team
Send only the sections you want to change. A section you leave out stays as it is; a section you send replaces that section completely.ETag.
Add ?dryRun=true to see the change without saving it. A dry run returns dryRun: true and the changes per section, and the ETag stays the same. A dry run does not run every check, so a taken name or an unknown channel can still preview as a success.
If the team has pending changes in Resolve that are waiting for review and your update touches the same parts, the update succeeds and replaces those pending parts. The response lists them in supersededProposals.
Delete a team
204 No Content.
Find a directory group
provider (SCIM, PAGERDUTY, IRM, ROOTLY, DATADOG, INCIDENT_IO), name, providerId, or integrationInstanceId. Use the returned id as groupId.
Membership
A team’s people come from two sources, and you can use both at once.- Group bindings (
groupBindings): a directory group and the role its people get. Groups come from SCIM, PagerDuty, Grafana IRM, Rootly, Datadog, or incident.io. Resolve keeps the team in step when people join or leave the group. Bind at most one group per role, all from the same provider. - Additional members (
additionalMembers): people you add by email. Each email must match a user in your organization; provision users through SCIM first. - Roles are
MEMBERorADMIN. If a person is in a bound group and is also an additional member, the higher role applies. If they leave the group, the additional-member entry stays. - Directory-managed admins: bind a second group with the role
ADMIN. That group then becomes the source of admins, and the team’s additional admins are removed. - Replacing membership: sending
membershipreplaces it. Leavingmembershipout keeps it as it is. Empty lists remove all bindings or additional members.
Updates and concurrency
- Every read returns the team’s version in the
ETagheader.PATCHandDELETEmust send it back unchanged inIf-Match. Treat theETagas opaque. - If the team changed since you read it, the write fails with
412and the codestale_version. Read the team again and retry. - A missing
If-Matchreturns428with the codeprecondition_required. - The version changes on every change to the team, from any source: the API, the Resolve UI, Slack, or an accepted suggestion. People joining or leaving a bound group do not change it.
Errors
Every error has the same body:Limits
Compatibility
- Send
schemaVersionwith every write. Resolve changes only the fields your version knows, so an older client keeps working when new fields are added. - Responses can contain fields your client does not know; ignore them. Requests with unknown fields are refused.
- Treat enum values, such as roles and channel purposes, as open strings. New values can appear.
- Breaking changes ship only under a new path (
/api/v2), with notice before/api/v1changes.
What’s next
- Team and group mapping: how directory groups map to teams in the Resolve UI.
- Directory Sync (SCIM): provision the users that additional members refer to.
- Resolve REST API: query investigations from scripts.

