Paths
Every v1 path starts with/v1, and collection names are kebab-case:
Custom methods
An action that v0 exposed as a sub-path, or as aDELETE, is a :verb suffix on the resource in
v1:
Some HTTP clients and proxies percent-encode a colon in a path. Make sure yours send a literal
:.
Pagination
v0 paged three different ways. v1 pages one way, on every list:
v1 returns no totals. Pagination describes how to tell when you have
reached the last page.
Errors
Every v1 error has the same body, with the error nested undererror:
The
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and Retry-After headers
are the same on both versions. v0 and v1 requests count toward one limit for your organization, as
Rate limits describes.
Branch on error.code instead of on detail or the status alone, as
Errors describes.
Not found and forbidden
v0 returned403 for a user or group ID that it couldn’t find. v1 returns 404, as it does for
any ID it can’t find, and keeps 403 for a call that you lack permission to make.
Identifiers
v1 identifies most resources by a UUID in theirid field, as
Identifiers describes. A
requestable-permission ID that you stored from v0
doesn’t work on v1.
Timestamps
v1 returns every timestamp in UTC, as ISO 8601 with aZ suffix, such as 2026-01-15T18:30:00Z.
v0 timestamps carried no offset.
Status codes
Every v1 endpoint that creates something returns201. Some of their v0 predecessors returned
200, including POST /apps and POST /access_policies.
An app sync, an account upload, an app review sync, and the delete of an app connected through an
integration finish in the background. The endpoints that start them
return 202 with an operation, which you poll with
GET /v1/operations/{operation_id}. Polling the
operation replaces v0’s job endpoints. For each operation type, see
Long-running operations.
Enum values
v1 enum values are lowercase kebab-case labels, such aspending, in-review, or
request-validation. They’re the same in responses, filters, path parameters, and request bodies.
v0 returned uppercase values, such as APPROVED. A v0 value sent to v1 returns 400, and the
error lists the accepted labels.
A few fields don’t use labels: activity log event_type and outcome, identity event
changed_field, the state in an account upload’s result, error type, a subject filter’s
operator and datatype, the group of each scope filter you send to
Sync App Review, and a subject’s removal
error.code.
Each migration guide maps the v0 values for its resource. Users and roles and
User offboardings map the values for resources that have no guide.
Smaller changes
Inline webhooks
GET /v1/inline-webhooks returns a page, {"inline_webhooks": [...], "next_page_token": ...}.
v0 returned a bare array.
v1 renames the type field from hook_type to type, and changes its values:
The Inline Webhook object covers the rest of the object.
Users and roles
Wherever v1 returns a user, itsstatus is staged, active, suspended, or inactive. v0
returned STAGED, ACTIVE, and so on. A user’s custom attribute type is text, user, or
single-select, where v0 returned TEXT, USER, or SINGLE_SELECT.
v0 returned each role in roles and role_added as a name. v1 returns each one as a role object
with id, label, is_custom, and resource_type, as Roles
describes.
v0’s role_name path parameter on Add User Role and Remove User Role is role_id in v1, and it
takes the role’s id. A built-in role’s id is its v0 name in kebab case:
The path takes the
id exactly as written. A v0 role name, such as APP_ADMIN, returns 400
with code set to role.id_required. A custom role’s id is a UUID, which List User Roles
returns. The path doesn’t take a custom role’s name.
User offboardings
An offboarding’sstatus is a label on
Get User Offboarding and every other
call that returns an offboarding:
/info and /art
GET /info and GET /art become GET /v1/info and
GET /v1/art, with the same response bodies.
The v0 pair doesn’t require a token. The v1 pair requires one, so GET /v1/info is a quick check
that both your token and your v1 access work.