Skip to main content
Create, read, update, and delete ResolveAI teams from your own scripts and pipelines. Each team is one JSON document: its name, description, communication channels, and membership.
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

Use the host you sign in to if it differs from 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 the Authorization header:
Create the token in Admin > API Tokens. The token acts with its creator’s current roles:
  • 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.
Security best practice: Never store credentials in plaintext in configuration files or source control. Keep the token in your CI secret store.

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

The response is 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 409 with the code name_conflict and 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. With membership, 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.
The response is the updated document with a new 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

The response is 204 No Content.

Find a directory group

Filter by 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 MEMBER or ADMIN. 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 membership replaces it. Leaving membership out 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 ETag header. PATCH and DELETE must send it back unchanged in If-Match. Treat the ETag as opaque.
  • If the team changed since you read it, the write fails with 412 and the code stale_version. Read the team again and retry.
  • A missing If-Match returns 428 with the code precondition_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 schemaVersion with 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/v1 changes.

What’s next