HTTP reference

Admin API

Admin routes live in routes/admin.php. All require auth + verified. Resource actions use permission:{PermissionEnum}; the file manager uses can.manage.files, which maps route name / HTTP method / bulk action to a file permission.

Client

These are same-origin session endpoints for the Inertia SPA (and occasional JSON fetches), not a public API. See Routing overview.

Users

MethodPathRoute namePermission
GET/usersusers.indexcan-show-users
POST/usersusers.storecan-create-users
PUT/users/{user}users.updatecan-edit-users
DELETE/users/{user}users.destroycan-delete-users
POST/users/{user}/restoreusers.restorecan-restore-users
DELETE/users/{user}/forceusers.force-deletecan-force-delete-users
POST/users/bulk-actionsusers.bulk-actionsEnforced in controller per action (not a single route middleware)

Controller: App\Http\Controllers\Admin\UserController.

Groups

MethodPathRoute namePermission
GET/groupsgroups.indexcan-show-groups
POST/groupsgroups.storecan-create-groups
PUT/groups/{group}groups.updatecan-edit-groups
DELETE/groups/{group}groups.destroycan-delete-groups
POST/groups/{group}/restoregroups.restorecan-restore-groups
DELETE/groups/{group}/forcegroups.force-deletecan-force-delete-groups
POST/groups/bulk-actionsgroups.bulk-actionsEnforced in FormRequest per action (delete / restore / force_delete)

Controller: UserGroupController. Soft-delete lifecycle matches users (trashed filter on index, restore, force-delete, bulk). Groups inherit role permissions and role-tied collection/file ACL — see Users & groups.

Roles

MethodPathRoute namePermission
GET/settings/rolesroles.indexcan-show-roles
GET/settings/roles/createroles.createcan-create-roles
POST/settings/rolesroles.storecan-create-roles
GET/settings/roles/{role}/editroles.editcan-edit-roles
PUT/settings/roles/{role}roles.updatecan-edit-roles
DELETE/settings/roles/{role}roles.destroycan-delete-roles
POST/settings/roles/bulk-actionsroles.bulk-actionsEnforced in controller per action

Controller: RoleController. Create/edit are Inertia form pages; index/store/update/destroy also serve the SPA. Role forms also sync Collection access for the Public CMS API.

API keys

MethodPathRoute namePermission
GET/settings/api-keysapi-keys.indexcan-show-api-keys
POST/settings/api-keysapi-keys.storecan-manage-api-keys
DELETE/settings/api-keys/{apiKey}api-keys.destroycan-manage-api-keys

Controller: ApiKeyController. Secrets (ek_…) are shown once after create. Keys authenticate /api/v1 — see Public CMS API.

Permissions (+ sync)

MethodPathRoute namePermission
GET/settings/permissionspermissions.indexcan-show-permissions
POST/settings/permissionspermissions.storecan-create-permissions
PUT/settings/permissions/{permission}permissions.updatecan-edit-permissions
DELETE/settings/permissions/{permission}permissions.destroycan-delete-permissions
POST/settings/permissions/syncpermissions.synccan-edit-permissions

POST /settings/permissions/sync runs php artisan permissions:sync (optional prune from the request body / controller). Prefer enum-driven sync over ad-hoc DB permission rows — see Effective permissions and Extending Externa.

Activity logs

MethodPathRoute namePermission
GET/activity-logsactivity-logs.indexcan-show-activity-logs

Controller: ActivityLogController (Spatie activity log UI).

Jobs monitor

Defined in routes/admin.php under /settings/jobs:

MethodPathRoute namePermission
GET/settings/jobsjobs.indexcan-show-jobs
POST/settings/jobs/{uuid}/retryjobs.retrycan-manage-jobs
DELETE/settings/jobs/{uuid}jobs.destroycan-manage-jobs

Product notes: Operations — Jobs monitor.

Project + branding HTTP live in routes/settings.php (not admin.php) and require can-manage-project-settings:

MethodPathName
GET/PUT/settings/projectproject.edit / project.update
POST/settings/project/webhook-testproject.webhook-test
GET/PUT/settings/appearanceappearance.edit / appearance.update

Full guide: Project settings.


Files (can.manage.files)

All routes below sit in:

Route::middleware(['auth', 'verified'])->group(...)
Route::middleware('can.manage.files')->group(...)

Prefix: /files, name prefix: files..

How permissions are chosen

EnsureCanManageFiles resolves a PermissionEnum then checks EffectivePermissionResolver:

Route name / casePermission
files.restorecan-restore-files
files.force-deletecan-force-delete-files
files.download, files.download-many, files.zips.downloadcan-download-files
files.favorite, files.unfavoritecan-favorite-files
files.copycan-copy-files
files.replacecan-replace-files
files.tagscan-tag-files
files.updatecan-update-file-metadata
files.bulkDepends on JSON action (see below)
Other GET/HEADcan-show-files
Other POSTcan-create-files
Other PUT/PATCHcan-edit-files
Other DELETEcan-delete-files

Bulk action → permission:

actionPermission
restorecan-restore-files
force_deletecan-force-delete-files
favorite, unfavoritecan-favorite-files
tag, untagcan-tag-files
copycan-copy-files
deletecan-delete-files
movecan-edit-files
(default)can-edit-files

List, browse, tags

MethodPathRoute nameTypical permission
GET/files/listfiles.listcan-show-files
GET/files/tagsfiles.tags.indexcan-show-files
GET/files/{folder?}files.indexcan-show-files (folder must be numeric)

files.index is the Inertia file-manager page. Static /files/* paths are registered before {folder} so names like list are not treated as folder IDs.

Upload and chunked upload

MethodPathRoute nameTypical permission
POST/files/uploadfiles.uploadcan-create-files
POST/files/foldersfiles.folders.storecan-create-files
POST/files/uploads/initfiles.uploads.initcan-create-files
POST/files/uploads/chunkfiles.uploads.chunkcan-create-files
POST/files/uploads/completefiles.uploads.completecan-create-files
GET/files/uploads/statusfiles.uploads.statuscan-show-files

Stale incomplete uploads are cleaned by files:cleanup-uploads (Files configuration).

Bulk, download, zip

MethodPathRoute namePermission notes
POST/files/bulkfiles.bulkPer action (table above)
POST/files/downloadfiles.download-manycan-download-files
GET/files/zips/{jobId}files.zips.downloadcan-download-files

Multi-file/folder zips are prepared asynchronously; expired archives are removed by files:cleanup-zips.

Single-file mutations

MethodPathRoute namePermission
PATCH/files/{file}files.updatecan-update-file-metadata
POST/files/{file}/replacefiles.replacecan-replace-files
POST/files/{file}/copyfiles.copycan-copy-files
POST/files/{file}/favoritefiles.favoritecan-favorite-files
DELETE/files/{file}/favoritefiles.unfavoritecan-favorite-files
PUT/files/{file}/tagsfiles.tagscan-tag-files
GET/files/{file}/downloadfiles.downloadcan-download-files
GET/files/{file}/thumbnailfiles.thumbnailcan-show-files
GET/files/{file}/where-usedfiles.where-usedcan-show-files
PATCH/files/{file}/movefiles.movecan-edit-files
PATCH/files/{file}/renamefiles.renamecan-edit-files
DELETE/files/{file}files.destroycan-delete-files
POST/files/{file}/restorefiles.restorecan-restore-files
DELETE/files/{file}/forcefiles.force-deletecan-force-delete-files
POST/files/{file}/attachfiles.attachcan-create-files (POST default)
POST/files/{file}/detachfiles.detachcan-create-files (POST default)

Controller: App\Http\Controllers\Admin\FileController. Storage/threshold config: Files configuration. Tree model: File tree model.

Previous
Routing overview