Synq Docs
Reference

Permissions

What a member or an API key may do in an org, which built-in roles hold each permission, and which routes need it.

Every management API route checks one permission against the credential that calls it: an org member's role, or an API key's own permissions. A route that refuses answers 403 with the code insufficient_permissions, and missing_permission names the permission.

The built-in roles: the owner holds every permission; an admin holds all but deleting the org and handing it over; a member holds org.read and every .view permission but org.apiKeys.view. An org can also make its own roles from any set of these permissions.

PermissionOwnerAdminMemberRoutes that need it
org.readYesYesYesGET /v1/orgs/{org}
org.editYesYesNoPATCH /v1/orgs/{org}
org.deleteYesNoNoDELETE /v1/orgs/{org}
org.members.viewYesYesYesGET /v1/orgs/{org}/roles
GET /v1/orgs/{org}/members
GET /v1/orgs/{org}/invites
org.members.editYesYesNoPOST /v1/orgs/{org}/roles
PATCH /v1/orgs/{org}/roles/{role}
DELETE /v1/orgs/{org}/roles/{role}
PATCH /v1/orgs/{org}/members/{user}
DELETE /v1/orgs/{org}/members/{user}
POST /v1/orgs/{org}/invites
DELETE /v1/orgs/{org}/invites/{invite}
org.ownership.transferYesNoNoPOST /v1/orgs/{org}/transfer-ownership
org.brands.viewYesYesYesGET /v1/orgs/{org}/brands
GET /v1/orgs/{org}/brands/{brand}
GET /v1/orgs/{org}/brands/{brand}/theme
POST /v1/orgs/{org}/brands/{brand}/theme/preview
POST /v1/orgs/{org}/brands/{brand}/sign-in-preview
GET /v1/orgs/{org}/brands/{brand}/files/{file}
GET /v1/orgs/{org}/brands/{brand}/email
GET /v1/orgs/{org}/brands/{brand}/custom-domain
GET /v1/orgs/{org}/brands/{brand}/sign-in-providers
org.brands.editYesYesNoPOST /v1/orgs/{org}/brands
PATCH /v1/orgs/{org}/brands/{brand}
DELETE /v1/orgs/{org}/brands/{brand}
DELETE /v1/orgs/{org}/brands/{brand}/logo
PATCH /v1/orgs/{org}/brands/{brand}/theme
DELETE /v1/orgs/{org}/brands/{brand}/theme/background
POST /v1/orgs/{org}/brands/{brand}/files
POST /v1/orgs/{org}/brands/{brand}/files/{file}/finalize
PATCH /v1/orgs/{org}/brands/{brand}/email
POST /v1/orgs/{org}/brands/{brand}/email/reply-to/confirmation
POST /v1/orgs/{org}/brands/{brand}/email/test
POST /v1/orgs/{org}/brands/{brand}/custom-domain
DELETE /v1/orgs/{org}/brands/{brand}/custom-domain
POST /v1/orgs/{org}/brands/{brand}/custom-domain/verify
PATCH /v1/orgs/{org}/brands/{brand}/sign-in-providers/{provider}
org.apps.viewYesYesYesGET /v1/orgs/{org}/brands/{brand}/apps
GET /v1/orgs/{org}/brands/{brand}/apps/{app}
GET /v1/orgs/{org}/change-requests/{request}
GET /v1/orgs/{org}/brands/{brand}/apps/{app}/apis
org.apps.editYesYesNoPOST /v1/orgs/{org}/brands/{brand}/apps
PATCH /v1/orgs/{org}/brands/{brand}/apps/{app}
DELETE /v1/orgs/{org}/brands/{brand}/apps/{app}
POST /v1/orgs/{org}/brands/{brand}/apps/{app}/rotate-secret
POST /v1/orgs/{org}/change-requests
POST /v1/orgs/{org}/change-requests/{request}/approve
POST /v1/orgs/{org}/change-requests/{request}/decline
PUT /v1/orgs/{org}/brands/{brand}/apps/{app}/apis/{api}
DELETE /v1/orgs/{org}/brands/{brand}/apps/{app}/apis/{api}
org.apis.viewYesYesYesGET /v1/orgs/{org}/brands/{brand}/apis
GET /v1/orgs/{org}/brands/{brand}/apis/{api}
org.apis.editYesYesNoPOST /v1/orgs/{org}/brands/{brand}/apis
PATCH /v1/orgs/{org}/brands/{brand}/apis/{api}
DELETE /v1/orgs/{org}/brands/{brand}/apis/{api}
org.connections.viewYesYesYesGET /v1/orgs/{org}/sign-in-providers
org.connections.editYesYesNoPUT /v1/orgs/{org}/sign-in-providers/{provider}/app
DELETE /v1/orgs/{org}/sign-in-providers/{provider}/app
PUT /v1/orgs/{org}/brands/{brand}/sign-in-providers/{provider}/app
DELETE /v1/orgs/{org}/brands/{brand}/sign-in-providers/{provider}/app
org.webhooks.viewYesYesYesGET /v1/orgs/{org}/webhooks
GET /v1/orgs/{org}/webhooks/{webhook}
GET /v1/orgs/{org}/webhooks/{webhook}/deliveries
org.webhooks.editYesYesNoPOST /v1/orgs/{org}/webhooks
PATCH /v1/orgs/{org}/webhooks/{webhook}
DELETE /v1/orgs/{org}/webhooks/{webhook}
POST /v1/orgs/{org}/webhooks/{webhook}/rotate-secret
POST /v1/orgs/{org}/webhooks/{webhook}/test
org.tokenGates.viewYesYesYesGET /v1/orgs/{org}/token-gates
GET /v1/orgs/{org}/token-gates/{gate}
POST /v1/orgs/{org}/token-gates/check
org.tokenGates.editYesYesNoPOST /v1/orgs/{org}/token-gates
PATCH /v1/orgs/{org}/token-gates/{gate}
DELETE /v1/orgs/{org}/token-gates/{gate}
org.emailDomains.viewYesYesYesGET /v1/orgs/{org}/email-domains
GET /v1/orgs/{org}/email-domains/{domain}
org.emailDomains.editYesYesNoPOST /v1/orgs/{org}/email-domains
DELETE /v1/orgs/{org}/email-domains/{domain}
POST /v1/orgs/{org}/email-domains/{domain}/check
org.billing.viewYesYesYesGET /v1/orgs/{org}/billing/invoices
GET /v1/orgs/{org}/billing/usage
org.billing.editYesYesNoPOST /v1/orgs/{org}/billing/checkout
POST /v1/orgs/{org}/billing/plan
POST /v1/orgs/{org}/billing/portal
org.users.viewYesYesYesGET /v1/orgs/{org}/brands/{brand}/users
GET /v1/orgs/{org}/brands/{brand}/users/{user}
GET /v1/orgs/{org}/brands/{brand}/users/{user}/passkeys
GET /v1/orgs/{org}/brands/{brand}/users/{user}/consents
GET /v1/orgs/{org}/brands/{brand}/users/{user}/api-keys
org.users.editYesYesNoPOST /v1/orgs/{org}/brands/{brand}/users
PATCH /v1/orgs/{org}/brands/{brand}/users/{user}
POST /v1/orgs/{org}/brands/{brand}/users/{user}/revoke-sessions
DELETE /v1/orgs/{org}/brands/{brand}/users/{user}/passkeys/{passkey}
POST /v1/orgs/{org}/brands/{brand}/users/{user}/deletion
DELETE /v1/orgs/{org}/brands/{brand}/users/{user}/deletion
DELETE /v1/orgs/{org}/brands/{brand}/users/{user}/consents/{consent}
DELETE /v1/orgs/{org}/brands/{brand}/users/{user}/api-keys/{key}
org.apiKeys.viewYesYesNoGET /v1/orgs/{org}/api-keys
GET /v1/orgs/{org}/api-keys/{key}
org.apiKeys.editYesYesNoPOST /v1/orgs/{org}/api-keys
DELETE /v1/orgs/{org}/api-keys/{key}
org.auditLog.viewYesYesYesGET /v1/orgs/{org}/audit-log