--- title: "Roles and permissions in Platform API" slug: "roles-and-permissions-in-platform-api" updated: 2026-10-27T07:03:57Z published: 2026-10-27T07:03:57Z canonical: "docs.supermetrics.com/roles-and-permissions-in-platform-api" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.supermetrics.com/llms.txt > Use this file to discover all available pages before exploring further. # Roles and permissions in Platform API The Data Transfers endpoints (`dts-api.supermetrics.com`) in the Platform API check the team role of the user your API key is assigned to. This works the same way as permissions in the Supermetrics Hub: if a user can't do something in the Hub, their API key can't do it through the API either. Your API key also needs the right scope for each endpoint. Both checks must pass. Which API does this apply to? Role checks apply only to the Data Transfers endpoints in the Platform API: transfers, transfer runs, destinations, data source connections, and backfills. The Data API (`api.supermetrics.com`), including data queries and data source logins, is not affected. ### How roles map to Platform API access | Role | Access to Data Transfers endpoints in Platform API | | --- | --- | | Owner, Admin, Editor | Full access. View, create, update, delete, pause, and validate. | | Viewer | Can view transfers, transfer runs, destinations and backfills, and create data source connections. Can't create, change, or delete transfers, destinations, or backfills. | | Finance | No access. | API keys that aren't assigned to a user aren't affected by role checks. For what each role can do in the Hub, see [About Supermetrics teams and user roles](https://docs.supermetrics.com/docs/about-supermetrics-teams-and-user-roles). ### Errors | Status | Error | When it happens | | --- | --- | --- | | `403` | `ACCESS_DENIED` | The user your API key is assigned to doesn't have the role needed for this endpoint. | | `403` | `TEAM_ACCESS_FORBIDDEN` | The user your API key is assigned to isn't a member of the team in the request. | To fix an `ACCESS_DENIED` error, you can either: - Create a new API key assigned to an Owner, Admin or Editor. In the Hub, click your avatar and select **API keys**. - Ask a team Owner or Admin to change the assigned user's role. For automated integrations, consider using a [service account](https://docs.supermetrics.com/apidocs/how-to-create-and-manage-service-accounts-for-your-team) so that access doesn't depend on an individual user's role. ### Platform API endpoint access by role | Endpoint | Owner / Admin / Editor | Viewer | Finance | | --- | --- | --- | --- | | **Transfers** | | | | | `GET /v1/teams/{team_id}/transfers` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/transfers/{transfer_id}` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/transfers/available-sources` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/transfers/available-options` | ✅ | ✅ | ❌ | | `POST /v1/teams/{team_id}/transfers` | ✅ | ❌ | ❌ | | `POST /v1/teams/{team_id}/transfers/batch` | ✅ | ❌ | ❌ | | `PUT /v1/teams/{team_id}/transfers/{transfer_id}` | ✅ | ❌ | ❌ | | `DELETE /v1/teams/{team_id}/transfers/{transfer_id}` | ✅ | ❌ | ❌ | | `POST /v1/teams/{team_id}/transfers/{transfer_id}/clone` | ✅ | ❌ | ❌ | | `PUT /v1/teams/{team_id}/transfers/{transfer_id}/state` (pause/unpause) | ✅ | ❌ | ❌ | | `POST /v1/teams/{team_id}/transfers/validations` | ✅ | ❌ | ❌ | | `POST /v1/teams/{team_id}/transfers/{transfer_id}/validations` | ✅ | ❌ | ❌ | | **Transfer runs** | | | | | `GET /v1/teams/{team_id}/transfers/{transfer_id}/runs` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/transfer_runs/{transfer_run_id}` | ✅ | ✅ | ❌ | | **Destinations** | | | | | `GET /v1/teams/{team_id}/destinations` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/destinations/{destination_id}` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/destinations/{destination_id}/usage` | ✅ | ✅ | ❌ | | `POST /v1/teams/{team_id}/destinations` | ✅ | ❌ | ❌ | | `PUT /v1/teams/{team_id}/destinations/{destination_id}` | ✅ | ❌ | ❌ | | `DELETE /v1/teams/{team_id}/destinations/{destination_id}` | ✅ | ❌ | ❌ | | `PATCH /v1/teams/{team_id}/destinations/batch` | ✅ | ❌ | ❌ | | `POST /v1/teams/{team_id}/destinations/test-connection` | ✅ | ❌ | ❌ | | **Data source connections** | | | | | `POST /v1/teams/{team_id}/data-source-connections` | ✅ | ✅ | ❌ | | **Backfills** | | | | | `GET /v1/teams/{team_id}/backfills` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/backfills/{backfill_id}` | ✅ | ✅ | ❌ | | `GET /v1/teams/{team_id}/transfers/{transfer_id}/backfills/latest` | ✅ | ✅ | ❌ | | `POST /v1/teams/{team_id}/transfers/{transfer_id}/backfills` | ✅ | ❌ | ❌ | | `PATCH /v1/teams/{team_id}/backfills/{backfill_id}` | ✅ | ❌ | ❌ |