API reference
Roles & checks
Roles, permissions, user/group assignments, effective permissions, and the single-call /check (with explain).
The full authorization model is in Authorization; this is the
endpoint reference. Authenticate with Authorization: ApiKey qk_… (or a Bearer JWT on
user routes).
Permissions & roles
GET
/v1/permissionsList platform permissionsPOST
/v1/tenants/{tenantID}/rolesCreate a roleGET
/v1/tenants/{tenantID}/rolesList rolesPOST
/v1/roles/{roleID}/permissions/{permID}Grant a permission to a roleDELETE
/v1/roles/{roleID}/permissions/{permID}Revoke a permission from a roleAssignments
PUT
/v1/users/{userID}/tenants/{tenantID}/roles/{roleID}Assign a role to a userDELETE
/v1/users/{userID}/tenants/{tenantID}/roles/{roleID}Unassign a role from a userPUT
/v1/tenants/{tenantID}/groups/{groupID}/roles/{roleID}Grant a role to a groupGET
/v1/users/{userID}/tenants/{tenantID}/permissionsEffective permissionsCheck
A single call answers "may this principal do X?". Add ?explain=true for the
grant-path trace.
GET
/v1/checkAuthorize an actionBash
curl "https://api.qeetid.com/v1/check?user_id=$U&tenant_id=$T&permission=billing:write" \
-H "Authorization: ApiKey $QEETID_API_KEY"
# → { "allowed": true }Bash
curl "https://api.qeetid.com/v1/check?user_id=$U&tenant_id=$T&permission=billing:write&explain=true" \
-H "Authorization: ApiKey $QEETID_API_KEY"
# → { "allowed": true, "paths": [ { "granted_by": "role:…", "via": "group:…" } ] }See Authorization → Explainable authz for the full response shape.