> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Unified Actions

> Normalized endpoints for documents, identity, and permissions across every connector.

The Unified Actions expose the same normalized schema across every connector in a category. Instead of learning each provider's API format, authentication scheme, and data model, you write your integration once and StackOne handles the differences:

* **Data models**: consistent field names and structures across providers
* **Pagination**: cursor-based pagination works the same whether the provider uses offsets, pages, or cursors
* **Error formats**: standardized error responses, with provider-specific details when available

<Tip>
  **Building AI agents?** Use the [Call Actions](/embed/call-actions/overview) protocols instead: MCP, the Agent SDK, A2A, or RPC. Same data, optimized for LLM tool calling.
</Tip>

<CardGroup cols={3}>
  <Card title="Documents" icon="file-lines" href="/documents/introduction">
    Files, folders, and drives. Search, upload, and download across storage providers.
  </Card>

  <Card title="IAM" icon="id-card" href="/iam/introduction">
    Users, groups, roles, and policies across identity providers.
  </Card>

  <Card title="Permissions Check" icon="user-check" href="/permissions-check/introduction">
    Verify what a user can access before your agent acts.
  </Card>
</CardGroup>

## Pagination

Every endpoint that returns multiple records pages with a cursor, whether the provider itself uses offsets, page numbers, or cursors.

<ParamField query="page_size" type="integer" default="25">
  Records per page. Keep the same value for every request in a sequence, since changing it partway through invalidates the cursor.
</ParamField>

<ParamField query="next" type="string">
  Cursor for the following page. Leave it off the first request, then pass the value the previous response returned.
</ParamField>

```bash theme={null}
curl --request GET \
  --url 'https://api.stackone.com/unified/documents/files?page_size=50' \
  --header 'accept: application/json' \
  --header 'x-account-id: {account_id}' \
  -u "$STACKONE_API_KEY:"
```

The cursor comes back alongside the records:

```json theme={null}
{
  "next": "eyJyIjphAsHHere",
  "data": [ ... ]
}
```

Pass that value as `next` to fetch the following page. A `null` cursor means you have reached the end of the data set.

A page can arrive with fewer records than the `page_size` you asked for, or with none at all, and still carry a cursor. That happens when StackOne has to filter or restructure provider requests to reach data the provider's own API won't return in one pass, and it returns the short page rather than holding the request open. Keep paginating until `next` is `null`.

## Resources

<CardGroup cols={2}>
  <Card title="Embed Overview" icon="map" href="/embed/getting-started">
    The path to embedding StackOne in your product, from setup to production.
  </Card>

  <Card title="API SDKs" icon="cube" href="/platform-api/api-sdks">
    Official client SDKs for the StackOne API in TypeScript, Ruby, PHP, Java, and C#.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.