Roles and permissions in Platform API

Prev Next

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.

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 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} ✅ ❌ ❌