What is a Unified API?
A unified API provides a single, standardized interface to interact with multiple third-party providers. Instead of learning each provider’s unique API format, authentication scheme, and data model, you write code once, and StackOne handles the differences. What StackOne normalizes:- Data models – Consistent field names and structures across providers (e.g.,
filesin Google Drive, SharePoint, and Dropbox all return the same schema;usersin Google Workspace, Okta, and 1Password all return the same schema) - Authentication – OAuth, API keys, and tokens are managed per-provider; you just pass an
x-account-idheader - Pagination – Cursor-based pagination works the same regardless of whether the provider uses offsets, pages, or cursors
- Error formats – Standardized error responses with provider-specific details when available
Entity Model
The IAM API is built around six core entities.IamCredentials is not included in the diagram above. It is a snapshot of the current connection’s auth state, not a stored identity object. It carries a user reference when the credential corresponds to a known principal (such as an OAuth user or named service account).
Permission and scope model
IamPermission has a type (the action) and a scopes array. Each scope entry has a resource_type (e.g. file, channel, user) and an optional resource_id. When resource_id is absent, the permission applies to all resources of that type.
Roles carry the same scoping via IamRoleScope on the role itself, allowing a role to be valid only within a specific organizational context.
Endpoints
Permission types
IamPermission.type is one of the values below. The OAS admits the full set; providers expose only the permission types that map to their model.
User filters
GET /unified/iam/users accepts the following keys on the filter query object. Filter support varies per connector; passing a filter key the connector does not support returns a 400.
Resource types
GET /unified/iam/resource_types returns the resource type identifiers a connected provider supports for resource-scoped queries. The response shape is { data: string[] }; values are connector-defined, not a fixed enum.
Use these values as the
resource_type query parameter on GET /unified/iam/resource_users.
The type field on an embedded IamResource is declared as oneOf: [string, IamResourceTypeEnum] in the OAS. Falcon connectors emit a plain string from the connector-defined set returned by this endpoint (e.g. "file", "channel", "group"). Legacy V2 connectors emit the { value, source_value } envelope where value is from the fixed IamResourceTypeEnum set. Parse both shapes when consuming the field.
Listing users by resource
GET /unified/iam/resource_users returns users with access to a specific resource, including their resource-scoped roles. Same response shape as IamUser.
Required query parameters:
resource_type— one of the values returned byGET /unified/iam/resource_typesfor the connected provider.resource_id— the raw provider remote_id of the resource. Not a StackOne-encoded id from a list endpoint. Pass the provider’s native id (e.g. a Drive file id, Slack channel id, group remote_id).
fields, and expand apply as on the other list endpoints.
StackOne SDKs & OpenAPI Specification
Use our official SDKs for faster integration. Build with language-native libraries. Full list here.