Reference

API Permissions Reference

6 min read

> **What you'll learn:** How Shield permissions work with the REST API and how to configure roles for API access.


Overview

The TallCMS API uses a dual authorization system:

LayerPurposeConfigured In
Token AbilitiesScopes what the token can doToken creation request
Shield PermissionsScopes what the user can doAdmin panel (Shield)

Both layers must authorize a request for it to succeed.


Permission Mapping

Pages

API EndpointToken AbilityShield Permission
GET /pagespages:readViewAny:CmsPage
GET /pages/{id}pages:readView:CmsPage
GET /pages/{id}/revisionspages:readViewRevisions:CmsPage
POST /pagespages:writeCreate:CmsPage
PUT /pages/{id}pages:writeUpdate:CmsPage
POST /pages/{id}/publishpages:writeUpdate:CmsPage
POST /pages/{id}/unpublishpages:writeUpdate:CmsPage
POST /pages/{id}/submit-for-reviewpages:writeSubmitForReview:CmsPage
POST /pages/{id}/approvepages:writeApprove:CmsPage
POST /pages/{id}/rejectpages:writeApprove:CmsPage
POST /pages/{id}/restorepages:writeRestore:CmsPage
POST /pages/{id}/revisions/{rev}/restorepages:writeRestoreRevision:CmsPage
DELETE /pages/{id}pages:deleteDelete:CmsPage
DELETE /pages/{id}/forcepages:deleteForceDelete:CmsPage

Posts

API EndpointToken AbilityShield Permission
GET /postsposts:readViewAny:CmsPost
GET /posts/{id}posts:readView:CmsPost
GET /posts/{id}/revisionsposts:readViewRevisions:CmsPost
POST /postsposts:writeCreate:CmsPost
PUT /posts/{id}posts:writeUpdate:CmsPost
POST /posts/{id}/publishposts:writeUpdate:CmsPost
POST /posts/{id}/unpublishposts:writeUpdate:CmsPost
POST /posts/{id}/submit-for-reviewposts:writeSubmitForReview:CmsPost
POST /posts/{id}/approveposts:writeApprove:CmsPost
POST /posts/{id}/rejectposts:writeApprove:CmsPost
POST /posts/{id}/restoreposts:writeRestore:CmsPost
POST /posts/{id}/revisions/{rev}/restoreposts:writeRestoreRevision:CmsPost
DELETE /posts/{id}posts:deleteDelete:CmsPost
DELETE /posts/{id}/forceposts:deleteForceDelete:CmsPost

Categories

API EndpointToken AbilityShield Permission
GET /categoriescategories:readViewAny:CmsCategory
GET /categories/{id}categories:readView:CmsCategory
GET /categories/{id}/postscategories:readView:CmsCategory
POST /categoriescategories:writeCreate:CmsCategory
PUT /categories/{id}categories:writeUpdate:CmsCategory
DELETE /categories/{id}categories:deleteDelete:CmsCategory

Media

API EndpointToken AbilityShield Permission
GET /mediamedia:readViewAny:TallcmsMedia
GET /media/{id}media:readView:TallcmsMedia
GET /media/collectionsmedia:readViewAny:TallcmsMedia
GET /media/collections/{id}media:readViewAny:TallcmsMedia
POST /mediamedia:writeCreate:TallcmsMedia
POST /media/collectionsmedia:writeCreate:TallcmsMedia
PUT /media/{id}media:writeUpdate:TallcmsMedia
PUT /media/collections/{id}media:writeCreate:TallcmsMedia
DELETE /media/{id}media:deleteDelete:TallcmsMedia
DELETE /media/collections/{id}media:deleteCreate:TallcmsMedia

Webhooks

API EndpointToken AbilityShield Permission
GET /webhookswebhooks:manageViewAny:Webhook
GET /webhooks/{id}webhooks:manageView:Webhook
POST /webhookswebhooks:manageCreate:Webhook
PUT /webhooks/{id}webhooks:manageUpdate:Webhook
DELETE /webhooks/{id}webhooks:manageDelete:Webhook
POST /webhooks/{id}/testwebhooks:manageUpdate:Webhook

Required Permissions by Role

API Reader Role

Minimum permissions for read-only API access:

ViewAny:CmsPage
View:CmsPage
ViewAny:CmsPost
View:CmsPost
ViewAny:CmsCategory
View:CmsCategory
ViewAny:TallcmsMedia
View:TallcmsMedia

API Editor Role

Permissions for content management via API:

# Read permissions (from Reader)
ViewAny:CmsPage, View:CmsPage
ViewAny:CmsPost, View:CmsPost
ViewAny:CmsCategory, View:CmsCategory
ViewAny:TallcmsMedia, View:TallcmsMedia

# Write permissions
Create:CmsPage, Update:CmsPage
Create:CmsPost, Update:CmsPost
Create:CmsCategory, Update:CmsCategory
Create:TallcmsMedia, Update:TallcmsMedia

# Workflow permissions
ViewRevisions:CmsPage, ViewRevisions:CmsPost
SubmitForReview:CmsPage, SubmitForReview:CmsPost

API Publisher Role

Full content management including approval:

# All Editor permissions, plus:
Approve:CmsPage, Approve:CmsPost
Restore:CmsPage, Restore:CmsPost
RestoreRevision:CmsPage, RestoreRevision:CmsPost
Delete:CmsPage, Delete:CmsPost
Delete:CmsCategory
Delete:TallcmsMedia

API Admin Role

Full API access including force-delete and webhooks:

# All Publisher permissions, plus:
ForceDelete:CmsPage, ForceDelete:CmsPost
ViewAny:Webhook, View:Webhook
Create:Webhook, Update:Webhook, Delete:Webhook

Granting Permissions

Via Admin Panel

  1. Navigate to Admin > Shield > Roles
  2. Select or create a role
  3. Check the required permissions
  4. Click Save

Via Artisan

# Grant single permission
php artisan permission:grant-to-role editor "Approve:CmsPage"

# Grant multiple permissions
php artisan tinker
>>> $role = \Spatie\Permission\Models\Role::findByName('editor');
>>> $role->givePermissionTo(['Approve:CmsPage', 'Approve:CmsPost']);

Via Seeder

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$apiEditor = Role::findOrCreate('api_editor');

$apiEditor->givePermissionTo([
    'ViewAny:CmsPage', 'View:CmsPage', 'Create:CmsPage', 'Update:CmsPage',
    'ViewAny:CmsPost', 'View:CmsPost', 'Create:CmsPost', 'Update:CmsPost',
    'ViewRevisions:CmsPage', 'ViewRevisions:CmsPost',
    'SubmitForReview:CmsPage', 'SubmitForReview:CmsPost',
]);

Checking Permissions

In Code

// Check if user has permission
$user->can('Approve:CmsPage');

// Check via policy
$this->authorize('approve', $page);

// Get all user permissions
$user->getAllPermissions()->pluck('name');

Via Tinker

php artisan tinker
>>> $user = User::find(1);
>>> $user->can('ViewRevisions:CmsPage')
=> true
>>> $user->roles->pluck('name')
=> ["super_admin"]
>>> $user->getAllPermissions()->pluck('name')->filter(fn($p) => str_contains($p, 'CmsPage'))

Common Pitfalls

"This action is unauthorized" on workflow endpointsThe user is missing workflow permissions. Grant SubmitForReview:CmsPage, Approve:CmsPage, ViewRevisions:CmsPage as needed.

Token works for some endpoints but not othersCheck both token abilities AND Shield permissions. A pages:write token still needs Update:CmsPage permission.

New role can't access APIEnsure the role has at least ViewAny and View permissions for the resources it needs to access.

Super admin missing permissionsShield's super_admin role doesn't automatically have all permissions. You may need to grant new permissions explicitly after they're created.


Next Steps

Choose Theme