82 KiB
Permission Nodes
This document lists all known permission nodes in the optima-api application, categorized by resource type.
Permission System Overview
The permission system uses a dot-notation format: resource.action[.modifier]
Special Tokens
The permission validator supports special tokens for flexible permission management:
- Asterisk (*): Matches the token and all following tokens (e.g.,
credential.*grants all credential permissions) - Question Mark (?): Matches only the specific token (single character wildcard)
- Inclusive List ([a,b,c]): Matches only the tokens in the list
- Exclusive List (<a,b,c>): Matches all tokens except those in the list
Global Permissions
*- Full access to all resources and actions (typically assigned to administrator role)
Permission Nodes by Resource
Company Permissions
| Permission Node | Description | Used In |
|---|---|---|
company.fetch |
Fetch a single company | src/api/companies/[id]/fetch.ts |
company.fetch.address |
View company address information (requires company.fetch as well) |
src/api/companies/[id]/fetch.ts |
company.fetch.contacts |
View all company contacts (requires company.fetch as well) |
src/api/companies/[id]/fetch.ts |
company.fetch.many |
Fetch multiple companies | src/api/companies/fetchAll.ts |
company.fetch.configurations |
Fetch company configurations (requires company.fetch as well) |
src/api/companies/[id]/configurations.ts |
company.fetch.sites |
Fetch company sites from ConnectWise (requires company.fetch as well) |
src/api/companies/[id]/sites.ts |
Credential Permissions
| Permission Node | Description | Used In |
|---|---|---|
credential.create |
Create a new credential | src/api/credentials/create.ts |
credential.fetch |
Fetch a single credential | src/api/credentials/fetch.ts |
credential.fetch.many |
Fetch multiple credentials | src/api/credentials/fetchByCompany.ts |
credential.update |
Update a credential | src/api/credentials/update.ts |
credential.delete |
Delete a credential | src/api/credentials/delete.ts |
credential.fields.fetch |
Fetch credential fields (requires credential.fetch as well) |
src/api/credentials/fetchFields.ts |
credential.fields.update |
Update credential fields (requires credential.update as well) |
src/api/credentials/updateFields.ts |
credential.secure_values.read |
Read secure values of a credential (requires credential.fetch as well) |
src/api/credentials/readSecureValues.ts, src/api/credentials/readSecureValue.ts |
credential.sub_credentials.fetch |
Fetch sub-credentials of a parent credential (requires credential.fetch as well) |
src/api/credentials/fetchSubCredentials.ts |
credential.sub_credentials.create |
Create a sub-credential on a parent credential (requires credential.fetch as well) |
src/api/credentials/addSubCredential.ts |
credential.sub_credentials.delete |
Remove a sub-credential from a parent credential (requires credential.fetch as well) |
src/api/credentials/removeSubCredential.ts |
Credential Type Permissions
| Permission Node | Description | Used In |
|---|---|---|
credential_type.create |
Create a new credential type | src/api/credential-types/create.ts |
credential_type.fetch |
Fetch a single credential type | src/api/credential-types/fetch.ts |
credential_type.fetch.many |
Fetch multiple credential types | src/api/credential-types/fetchAll.ts |
credential_type.update |
Update a credential type | src/api/credential-types/update.ts |
credential_type.delete |
Delete a credential type | src/api/credential-types/delete.ts |
Role Permissions
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
role.create |
Create a new role | src/api/roles/create.ts | |
role.read |
Fetch a single role or view role information | src/api/roles/fetch.ts | |
role.list |
Fetch all roles | src/api/roles/fetchAll.ts | role.read |
role.modify |
Update role properties or manage role permissions | src/api/roles/update.ts, src/api/roles/addPermissions.ts, src/api/roles/removePermissions.ts | |
role.delete |
Delete a role | src/api/roles/delete.ts | |
user.read |
View users assigned to a role | src/api/roles/getUsers.ts | role.read |
User Permissions
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
user.read |
Read user information | src/api/user/@me/fetch.ts | |
user.write |
Update user information | src/api/user/@me/update.ts | |
user.read.other |
Read other users' information | src/api/user/fetch.ts, src/api/user/fetchRoles.ts, src/api/user/checkPermission.ts | |
user.list.other |
List all users | src/api/user/fetchAll.ts | user.read.other |
user.write.other |
Update other users' information | src/api/user/update.ts | |
user.roles.other |
Modify roles assigned to other users | src/api/user/update.ts | user.write.other |
user.permissions.other |
Modify direct permissions assigned to other users | src/api/user/update.ts | user.write.other |
user.delete.other |
Delete other users | src/api/user/delete.ts |
Permission Routes
Permissions required for accessing the permission node definitions API.
| Permission Node | Description | Used In |
|---|---|---|
role.read |
Fetch all permission nodes organized by category | src/api/permissions/fetchAll.ts |
role.read |
Fetch a flat list of all permission nodes | src/api/permissions/fetchNodes.ts |
role.read |
Fetch permission nodes by category | src/api/permissions/fetchByCategory.ts |
UI Navigation Permissions
Permissions for controlling navigation visibility on the frontend.
| Permission Node | Description | Usage Pattern |
|---|---|---|
ui.navigation.*.view |
View specific navigation sections (e.g., ui.navigation.admin.view) |
Control which navigation menu items are displayed |
Admin UI Permissions
Admin-specific UI permissions that control visibility and data loading for admin sub-tabs.
| Permission Node | Description | Usage Pattern |
|---|---|---|
admin.users.view |
Show the Users tab and load user data | Show/hide users tab, allow user list fetch |
admin.roles.view |
Show the Roles tab and load role data | Show/hide roles tab, allow role list fetch |
admin.credential-types.view |
Show the Credential Types tab and load type data | Show/hide types tab, allow type list fetch |
Notes on UI Permissions
- Client-side validation is not secure: Always enforce permissions on the API level. UI permissions only control visibility and user experience.
- Combine with API permissions: A user with an admin UI permission should also have the corresponding API permission (e.g.,
role.list) to actually load data. - Use wildcards for flexibility: Grant
ui.navigation.*.viewto allow all navigation sections.
Procurement Permissions
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
procurement.catalog.fetch |
Fetch a single catalog item | src/api/procurement/[id]/fetch.ts | |
procurement.catalog.fetch.many |
Fetch multiple catalog items, count, categories/ecosystems, or filter values | src/api/procurement/fetchAll.ts, src/api/procurement/count.ts, src/api/procurement/categories.ts, src/api/procurement/filters.ts | |
procurement.catalog.inventory.refresh |
Refresh on-hand inventory for a catalog item from ConnectWise | src/api/procurement/[id]/refreshInventory.ts | procurement.catalog.fetch |
procurement.catalog.link |
Link or unlink catalog items to each other | src/api/procurement/[id]/link.ts, src/api/procurement/[id]/unlink.ts | procurement.catalog.fetch |
ConnectWise Routes
GET /v1/cw/members requires only authentication (any logged-in user) and does not require a specific permission node.
POST /v1/cw/callback/:secret/:resource is intentionally unauthenticated for inbound ConnectWise callbacks and does not require a permission node.
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
| None | Fetch CW members (auth only) | src/api/cw/fetchMembers.ts | N/A |
| None | Inbound callback route; secured operationally (network controls / source trust) | src/api/cw/callback.ts | N/A |
Sales Permissions
Permissions for accessing and managing sales opportunities. Opportunities are synced from ConnectWise and stored locally; sub-resources (products, notes, contacts) are fetched live from CW.
WebSocket note: The /secure socket event chain opp:live_quote_preview and opp:live_quote_preview:<id>:data is gated by sales.opportunity.fetch.
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
sales.opportunity.fetch |
Fetch a single opportunity and its CW sub-resources (products, notes, contacts) | src/api/sales/opportunities/[id]/fetch.ts, src/api/sales/opportunities/[id]/products/fetchAll.ts, src/api/sales/opportunities/[id]/notes/fetchAll.ts, src/api/sales/opportunities/[id]/notes/fetch.ts, src/api/sales/opportunities/[id]/contacts/fetchAll.ts, src/api/sockets/events/liveQuotePreview.ts | |
sales.opportunity.fetch.many |
Fetch multiple opportunities (paginated/searchable), count, or opportunity types | src/api/sales/opportunities/fetchAll.ts, src/api/sales/opportunities/count.ts, src/api/sales/opportunities/fetchTypes.ts | |
sales.opportunity.fetch.@me |
View the personal sales dashboard showing opportunities assigned to the current user | UI-only (client-side gate) | |
sales.opportunity.fetch.all |
View all opportunities across all users (All Opportunities tab and View All button in the sales dashboard) | UI-only (client-side gate) | sales.opportunity.fetch.many |
sales.opportunity.metrics.all |
Allow scope=all on sales opportunity metrics endpoint to read cached metrics for all active members |
src/api/sales/opportunities/metrics.ts | sales.opportunity.fetch.many |
sales.opportunity.metrics.identifier.override |
Allow identifier=<cwIdentifier> override on sales opportunity metrics endpoint for querying another member |
src/api/sales/opportunities/metrics.ts | sales.opportunity.fetch.many |
sales.opportunity.refresh |
Refresh a single opportunity's local data from ConnectWise | src/api/sales/opportunities/[id]/refresh.ts | sales.opportunity.fetch |
sales.opportunity.update |
Update an opportunity's fields (rating, sales rep, company, contact, site, description, etc.) in ConnectWise | src/api/sales/opportunities/[id]/update.ts | sales.opportunity.fetch |
sales.opportunity.create |
Create a new opportunity in ConnectWise | src/api/sales/opportunities/create.ts | |
sales.opportunity.delete |
Delete an opportunity from ConnectWise and the local database | src/api/sales/opportunities/[id]/delete.ts | sales.opportunity.fetch |
sales.opportunity.note.create |
Create a new note on an opportunity | src/api/sales/opportunities/[id]/notes/create.ts | sales.opportunity.fetch |
sales.opportunity.note.update |
Update an existing note on an opportunity | src/api/sales/opportunities/[id]/notes/update.ts | sales.opportunity.fetch |
sales.opportunity.note.delete |
Delete a note from an opportunity | src/api/sales/opportunities/[id]/notes/delete.ts | sales.opportunity.fetch |
sales.opportunity.product.update |
Update products (forecast items) on an opportunity, including resequencing | src/api/sales/opportunities/[id]/products/resequence.ts, src/api/sales/opportunities/[id]/products/update.ts, src/api/sales/opportunities/[id]/products/cancel.ts | sales.opportunity.fetch |
sales.opportunity.product.delete |
Delete a product (forecast item) from an opportunity | src/api/sales/opportunities/[id]/products/delete.ts | sales.opportunity.fetch |
sales.opportunity.product.add |
Add a new product (forecast item) to an opportunity. Individual fields gated by sales.opportunity.product.field.<field> permissions. |
src/api/sales/opportunities/[id]/products/add.ts | sales.opportunity.fetch |
sales.opportunity.product.add.specialOrder |
Add one or more "SPECIAL ORDER" products via the dedicated special-order route. | src/api/sales/opportunities/[id]/products/addSpecialOrder.ts | sales.opportunity.fetch |
sales.opportunity.product.add.labor |
Add labor products via the dedicated labor route with Field/Tech catalog selection and labor pricing inputs. | src/api/sales/opportunities/[id]/products/addLabor.ts, src/api/sales/opportunities/[id]/products/laborOptions.ts | sales.opportunity.fetch |
sales.opportunity.quote.fetch |
Fetch all committed quotes for an opportunity. | src/api/sales/opportunities/[id]/quotes/fetchAll.ts | sales.opportunity.fetch |
sales.opportunity.quote.commit |
Generate and store a finalized quote PDF for an opportunity with regeneration metadata and creator attribution. | src/api/sales/opportunities/[id]/quotes/commit.ts | sales.opportunity.fetch |
sales.opportunity.quote.preview |
Generate a preview-stamped quote PDF for an opportunity without storing it. | src/api/sales/opportunities/[id]/quotes/preview.ts | sales.opportunity.fetch |
sales.opportunity.quote.download |
Download a committed quote PDF. Each download is recorded with timestamp and user info. | src/api/sales/opportunities/[id]/quotes/download.ts | sales.opportunity.fetch |
sales.opportunity.quote.fetch_downloads |
Fetch download/print history for all quotes on an opportunity. Admin-level permission. | src/api/sales/opportunities/[id]/quotes/fetchDownloads.ts | sales.opportunity.fetch |
sales.opportunity.view_margin |
View margin and markup data on opportunity products. Controls visibility of margin %, markup %, and related progress bars in the UI. | UI-only (client-side gate) | sales.opportunity.fetch |
sales.opportunity.view_cost |
View cost data on opportunity products. Controls visibility of unit cost, total cost, and recurring cost in the UI. | UI-only (client-side gate) | sales.opportunity.fetch |
sales.opportunity.view_profit |
View profit data on opportunity products. Controls visibility of profit values in the UI. | UI-only (client-side gate) | sales.opportunity.fetch |
sales.opportunity.workflow |
Execute opportunity workflow actions (status transitions, review decisions, quote sending, etc.). Base gate for the workflow dispatch endpoint. | dispatch.ts | sales.opportunity.fetch |
sales.opportunity.finalize |
Finalize an opportunity as Won or Lost. Without this permission, win/lose actions route to PendingWon/PendingLost instead. | src/workflows/wf.opportunity.ts, dispatch.ts | sales.opportunity.workflow |
sales.opportunity.cancel |
Cancel an opportunity. Required to transition any eligible opportunity to the Canceled status. | src/workflows/wf.opportunity.ts, dispatch.ts | sales.opportunity.workflow |
sales.opportunity.review |
Submit an opportunity for internal review. Required to transition an opportunity into the InternalReview status. | src/workflows/wf.opportunity.ts | sales.opportunity.workflow |
sales.opportunity.send |
Send a quote to the customer. Required to transition an opportunity to QuoteSent (and compound transitions like immediate won/lost/confirmed). | src/workflows/wf.opportunity.ts | sales.opportunity.workflow |
sales.opportunity.reopen |
Re-open a cancelled opportunity. Required to transition an opportunity from Canceled back to Active. | src/workflows/wf.opportunity.ts | sales.opportunity.workflow |
sales.opportunity.win |
Mark an opportunity as won (or pending won). Gates the win button in the UI. Required for finalize(won), sendQuote(won), and transitionToPending(won). | src/workflows/wf.opportunity.ts | sales.opportunity.workflow |
sales.opportunity.lose |
Mark an opportunity as lost (or pending lost). Gates the lose button in the UI. Required for finalize(lost), sendQuote(lost), and transitionToPending(lost). | src/workflows/wf.opportunity.ts | sales.opportunity.workflow |
sales.isRepresentative |
Designates the user as a sales representative; used for reporting and filtering purposes. | (not yet used in routes) |
Field-level permissions for sales.opportunity.product.add
Each submitted field is gated by a sales.opportunity.product.field.<field> permission node. Only fields the user has permission for are forwarded to ConnectWise.
| Field Permission Node | Description |
|---|---|
sales.opportunity.product.field.catalogItem |
Set the catalog item reference |
sales.opportunity.product.field.forecastDescription |
Set the forecast description |
sales.opportunity.product.field.productDescription |
Set the product description |
sales.opportunity.product.field.quantity |
Set the quantity |
sales.opportunity.product.field.status |
Set the status reference |
sales.opportunity.product.field.productClass |
Set the product class (e.g. Product, Service, Agreement) |
sales.opportunity.product.field.forecastType |
Set the forecast type |
sales.opportunity.product.field.revenue |
Set the revenue amount |
sales.opportunity.product.field.cost |
Set the cost amount |
sales.opportunity.product.field.includeFlag |
Set the include flag |
sales.opportunity.product.field.linkFlag |
Set the link flag |
sales.opportunity.product.field.recurringFlag |
Set the recurring flag |
sales.opportunity.product.field.taxableFlag |
Set the taxable flag |
sales.opportunity.product.field.recurringRevenue |
Set the recurring revenue amount |
sales.opportunity.product.field.recurringCost |
Set the recurring cost amount |
sales.opportunity.product.field.cycles |
Set the number of recurring cycles |
sales.opportunity.product.field.sequenceNumber |
Set the sequence number (display order) |
UniFi Permissions
Permissions for accessing and managing UniFi network infrastructure. The unifi.access permission is a gate permission required for all UniFi routes.
| Permission Node | Description | Used In | Dependencies |
|---|---|---|---|
unifi.access |
Gate permission for the entire UniFi API — required for all | src/api/unifi/sites/fetchAll.ts, src/api/unifi/sites/sync.ts, src/api/unifi/site/fetch.ts, src/api/unifi/site/overview.ts, src/api/unifi/site/devices.ts, src/api/unifi/site/wifi/fetchAll.ts, src/api/unifi/site/wifi/update.ts, src/api/unifi/site/networks.ts, src/api/unifi/site/link.ts, src/api/unifi/site/unlink.ts, src/api/companies/[id]/unifiSites.ts, src/api/unifi/sites/create.ts | |
unifi.sites.create |
Create a new site on the UniFi controller | src/api/unifi/sites/create.ts | unifi.access |
unifi.sites.fetch |
Fetch a single UniFi site | src/api/unifi/site/fetch.ts | unifi.access |
unifi.sites.fetch.many |
Fetch all UniFi sites | src/api/unifi/sites/fetchAll.ts | unifi.access |
unifi.sites.sync |
Sync sites from the UniFi controller into the database | src/api/unifi/sites/sync.ts | unifi.access |
unifi.sites.link |
Link or unlink a UniFi site to/from a company | src/api/unifi/site/link.ts, src/api/unifi/site/unlink.ts | unifi.access |
unifi.site.overview |
View live site overview from the UniFi controller | src/api/unifi/site/overview.ts | unifi.access |
unifi.site.devices |
View live device list from the UniFi controller | src/api/unifi/site/devices.ts | unifi.access |
unifi.site.wifi |
View WiFi networks (WLANs) from the UniFi controller | src/api/unifi/site/wifi/fetchAll.ts | unifi.access |
unifi.site.wifi.read |
Field-level gate for WiFi response data (see note below) | src/api/unifi/site/wifi/fetchAll.ts | unifi.access, unifi.site.wifi |
unifi.site.wifi.read.<field> |
Read a specific field from WiFi response (e.g. unifi.site.wifi.read.passphrase) |
src/api/unifi/site/wifi/fetchAll.ts | unifi.access, unifi.site.wifi, unifi.site.wifi.read |
unifi.site.wifi.update |
Update a WiFi network on the UniFi controller | src/api/unifi/site/wifi/update.ts | unifi.access, unifi.site.wifi |
Field-Level Permission Gating (unifi.site.wifi.read)
The WiFi fetch route uses processObjectValuePerms to filter each WLAN object on a per-field basis. For every key on the WlanConf response object, the system checks unifi.site.wifi.read.<key>. Only fields the user has permission for are included in the response. Use unifi.site.wifi.read.* to grant access to all fields.
Available field-level nodes:
unifi.site.wifi.read.id, unifi.site.wifi.read.name, unifi.site.wifi.read.siteId, unifi.site.wifi.read.enabled, unifi.site.wifi.read.security, unifi.site.wifi.read.wpaMode, unifi.site.wifi.read.wpaEnc, unifi.site.wifi.read.wpa3Support, unifi.site.wifi.read.wpa3Transition, unifi.site.wifi.read.wpa3FastRoaming, unifi.site.wifi.read.wpa3Enhanced192, unifi.site.wifi.read.passphrase, unifi.site.wifi.read.passphraseAutogenerated, unifi.site.wifi.read.hideSSID, unifi.site.wifi.read.isGuest, unifi.site.wifi.read.band, unifi.site.wifi.read.bands, unifi.site.wifi.read.networkconfId, unifi.site.wifi.read.usergroupId, unifi.site.wifi.read.apGroupIds, unifi.site.wifi.read.apGroupMode, unifi.site.wifi.read.pmfMode, unifi.site.wifi.read.groupRekey, unifi.site.wifi.read.dtimMode, unifi.site.wifi.read.dtimNg, unifi.site.wifi.read.dtimNa, unifi.site.wifi.read.dtim6e, unifi.site.wifi.read.l2Isolation, unifi.site.wifi.read.fastRoamingEnabled, unifi.site.wifi.read.bssTransition, unifi.site.wifi.read.uapsdEnabled, unifi.site.wifi.read.iappEnabled, unifi.site.wifi.read.proxyArp, unifi.site.wifi.read.mcastenhanceEnabled, unifi.site.wifi.read.macFilterEnabled, unifi.site.wifi.read.macFilterPolicy, unifi.site.wifi.read.macFilterList, unifi.site.wifi.read.radiusDasEnabled, unifi.site.wifi.read.radiusMacAuthEnabled, unifi.site.wifi.read.radiusMacaclFormat, unifi.site.wifi.read.minrateSettingPreference, unifi.site.wifi.read.minrateNgEnabled, unifi.site.wifi.read.minrateNgDataRateKbps, unifi.site.wifi.read.minrateNgAdvertisingRates, unifi.site.wifi.read.minrateNaEnabled, unifi.site.wifi.read.minrateNaDataRateKbps, unifi.site.wifi.read.minrateNaAdvertisingRates, unifi.site.wifi.read.settingPreference, unifi.site.wifi.read.no2ghzOui, unifi.site.wifi.read.privatePreSharedKeysEnabled, unifi.site.wifi.read.privatePreSharedKeys, unifi.site.wifi.read.saeGroups, unifi.site.wifi.read.saePsk, unifi.site.wifi.read.schedule, unifi.site.wifi.read.scheduleWithDuration, unifi.site.wifi.read.bcFilterList, unifi.site.wifi.read.externalId
| unifi.site.networks | View network configurations from the UniFi controller | src/api/unifi/site/networks.ts | unifi.access |
| unifi.site.wlan-groups | View WLAN groups (AP broadcasting groups) from the UniFi controller for a site | src/api/unifi/site/wlanGroups.ts, src/api/unifi/site/wlanGroupsCreate.ts | unifi.access |
| unifi.site.wlan-groups.create | Create a new WLAN group (AP broadcasting group) on the UniFi controller | src/api/unifi/site/wlanGroupsCreate.ts | unifi.access, unifi.site.wlan-groups |
| unifi.site.access-points | View access points (UAPs only) from the UniFi controller for a site | src/api/unifi/site/accessPoints.ts | unifi.access |
| unifi.site.ap-groups | View AP groups — shows which APs are grouped together for SSID broadcasting | src/api/unifi/site/apGroups.ts | unifi.access |
| unifi.site.wifi-limits | View WiFi SSID limits per AP per radio band | src/api/unifi/site/wifiLimits.ts | unifi.access |
| unifi.site.speed-profiles | View speed limit profiles (user groups) from the UniFi controller | src/api/unifi/site/speedProfilesFetchAll.ts, src/api/unifi/site/speedProfilesCreate.ts | unifi.access |
| unifi.site.speed-profiles.create | Create a new speed limit profile (user group) on the UniFi controller | src/api/unifi/site/speedProfilesCreate.ts | unifi.access, unifi.site.speed-profiles |
| unifi.site.wifi.ppsk | View private pre-shared keys (PPSKs) for a specific WiFi network | src/api/unifi/site/wifi/ppskFetchAll.ts, src/api/unifi/site/wifi/ppskCreate.ts | unifi.access, unifi.site.wifi |
| unifi.site.wifi.ppsk.create | Create a private pre-shared key on a specific WiFi network | src/api/unifi/site/wifi/ppskCreate.ts | unifi.access, unifi.site.wifi, unifi.site.wifi.ppsk |
Object Type Permissions (Field-Level Gating)
All fetch and fetchAll routes gate response object keys using processObjectValuePerms. For each object type, only fields whose corresponding <scope>.<field> permission the user holds are included in the response. Grant <scope>.* to allow all fields on that object type.
Company (obj.company)
| Field Permission | Description |
|---|---|
obj.company.id |
View company ID |
obj.company.name |
View company name |
obj.company.cw_Identifier |
View ConnectWise identifier |
obj.company.cw_CompanyId |
View ConnectWise company ID |
obj.company.cw_Data |
View ConnectWise data (address, contacts) |
obj.company.createdAt |
View creation timestamp |
obj.company.updatedAt |
View last-updated timestamp |
Used in: src/api/companies/[id]/fetch.ts, src/api/companies/fetchAll.ts
Credential (obj.credential)
| Field Permission | Description |
|---|---|
obj.credential.id |
View credential ID |
obj.credential.name |
View credential name |
obj.credential.notes |
View credential notes |
obj.credential.typeId |
View credential type ID |
obj.credential.companyId |
View linked company ID |
obj.credential.subCredentialOfId |
View parent credential ID |
obj.credential.fields |
View credential field values |
obj.credential.type |
View credential type object |
obj.credential.company |
View linked company object |
obj.credential.subCredentials |
View sub-credentials array |
obj.credential.secureFieldIds |
View secure field identifiers |
obj.credential.createdAt |
View creation timestamp |
obj.credential.updatedAt |
View last-updated timestamp |
Used in: src/api/credentials/fetch.ts, src/api/credentials/fetchByCompany.ts, src/api/credentials/fetchSubCredentials.ts, src/api/credential-types/fetchCredentials.ts
Credential Type (obj.credentialType)
| Field Permission | Description |
|---|---|
obj.credentialType.id |
View credential type ID |
obj.credentialType.name |
View credential type name |
obj.credentialType.permissionScope |
View permission scope |
obj.credentialType.icon |
View icon |
obj.credentialType.fields |
View field definitions |
obj.credentialType.credentialCount |
View count of credentials using this type |
obj.credentialType.createdAt |
View creation timestamp |
obj.credentialType.updatedAt |
View last-updated timestamp |
Used in: src/api/credential-types/fetch.ts, src/api/credential-types/fetchAll.ts
User (obj.user)
| Field Permission | Description |
|---|---|
obj.user.id |
View user ID |
obj.user.name |
View user display name |
obj.user.roles |
View assigned role monikers |
obj.user.permissions |
View aggregated permission nodes |
obj.user.login |
View login identifier |
obj.user.email |
View email address |
obj.user.image |
View profile image URL |
obj.user.createdAt |
View creation timestamp |
obj.user.updatedAt |
View last-updated timestamp |
Used in: src/api/user/@me/fetch.ts, src/api/user/fetch.ts, src/api/user/fetchAll.ts, src/api/roles/getUsers.ts
Role (obj.role)
| Field Permission | Description |
|---|---|
obj.role.id |
View role ID |
obj.role.title |
View role title |
obj.role.moniker |
View role moniker |
obj.role.permissions |
View role permission nodes |
obj.role.users |
View users assigned to this role |
obj.role.createdAt |
View creation timestamp |
obj.role.updatedAt |
View last-updated timestamp |
Used in: src/api/roles/fetch.ts, src/api/roles/fetchAll.ts, src/api/user/fetchRoles.ts
Catalog Item (obj.catalogItem)
| Field Permission | Description |
|---|---|
obj.catalogItem.id |
View catalog item ID |
obj.catalogItem.cwCatalogId |
View ConnectWise catalog ID |
obj.catalogItem.identifier |
View item identifier |
obj.catalogItem.name |
View item name |
obj.catalogItem.description |
View description |
obj.catalogItem.customerDescription |
View customer-facing description |
obj.catalogItem.internalNotes |
View internal notes |
obj.catalogItem.manufacturer |
View manufacturer name |
obj.catalogItem.manufactureCwId |
View manufacturer ConnectWise ID |
obj.catalogItem.partNumber |
View part number |
obj.catalogItem.vendorName |
View vendor name |
obj.catalogItem.vendorSku |
View vendor SKU |
obj.catalogItem.vendorCwId |
View vendor ConnectWise ID |
obj.catalogItem.price |
View price |
obj.catalogItem.cost |
View cost |
obj.catalogItem.inactive |
View inactive flag |
obj.catalogItem.salesTaxable |
View sales-taxable flag |
obj.catalogItem.onHand |
View on-hand inventory count |
obj.catalogItem.cwLastUpdated |
View CW last-updated timestamp |
obj.catalogItem.linkedItems |
View linked catalog items |
obj.catalogItem.createdAt |
View creation timestamp |
obj.catalogItem.updatedAt |
View last-updated timestamp |
Used in: src/api/procurement/fetchAll.ts, src/api/procurement/[id]/fetch.ts, src/api/procurement/[id]/fetchLinked.ts
Opportunity (obj.opportunity)
| Field Permission | Description |
|---|---|
obj.opportunity.id |
View opportunity ID |
obj.opportunity.cwOpportunityId |
View ConnectWise opportunity ID |
obj.opportunity.name |
View opportunity name |
obj.opportunity.notes |
View notes |
obj.opportunity.type |
View opportunity type |
obj.opportunity.stage |
View stage |
obj.opportunity.status |
View status |
obj.opportunity.priority |
View priority |
obj.opportunity.rating |
View rating |
obj.opportunity.source |
View source |
obj.opportunity.campaign |
View campaign |
obj.opportunity.primarySalesRep |
View primary sales rep |
obj.opportunity.secondarySalesRep |
View secondary sales rep |
obj.opportunity.company |
View company |
obj.opportunity.contact |
View contact |
obj.opportunity.site |
View site |
obj.opportunity.customerPO |
View customer PO |
obj.opportunity.totalSalesTax |
View total sales tax |
obj.opportunity.probability |
View probability percentage |
obj.opportunity.location |
View location |
obj.opportunity.department |
View department |
obj.opportunity.expectedCloseDate |
View expected close date |
obj.opportunity.pipelineChangeDate |
View pipeline change date |
obj.opportunity.dateBecameLead |
View date became lead |
obj.opportunity.closedDate |
View closed date |
obj.opportunity.closedFlag |
View closed flag |
obj.opportunity.closedBy |
View closed-by member |
obj.opportunity.companyId |
View linked company ID |
obj.opportunity.cwLastUpdated |
View CW last-updated timestamp |
obj.opportunity.createdAt |
View creation timestamp |
obj.opportunity.updatedAt |
View last-updated timestamp |
Used in: src/api/sales/fetchAll.ts, src/api/sales/[id]/fetch.ts
UniFi Site (obj.unifiSite)
| Field Permission | Description |
|---|---|
obj.unifiSite.id |
View site internal ID |
obj.unifiSite.name |
View site name |
obj.unifiSite.siteId |
View UniFi controller site ID |
obj.unifiSite.companyId |
View linked company ID |
obj.unifiSite.company |
View linked company object |
obj.unifiSite.createdAt |
View creation timestamp |
obj.unifiSite.updatedAt |
View last-updated timestamp |
Used in: src/api/unifi/sites/fetchAll.ts, src/api/unifi/site/fetch.ts, src/api/companies/[id]/unifiSites.ts
WiFi Network (unifi.site.wifi.read)
See UniFi Permissions > Field-Level Permission Gating above for the full list of unifi.site.wifi.read.<field> nodes.
Permission Issuers
Permissions can be issued by different sources:
roles- Permissions granted through role assignmentuser- Permissions granted directly to a userapi_key- Permissions associated with an API key
Permission Validation
The authorization middleware (src/api/middleware/authorization.ts) enforces permissions by:
- Extracting the authorization header (Bearer token or API Key)
- Validating the session/token
- Checking if the user has all required permissions for the route
- Throwing an
InsufficentPermissionerror (403) if any required permission is missing
Usage Example
// Require single permission
authMiddleware({ permissions: ["credential.fetch"] })
// Require multiple permissions (all must be satisfied)
authMiddleware({
permissions: ["credential.fetch", "credential.secure_values.read"]
})
// Administrator role with wildcard permission
{
moniker: "administrator",
permissions: ["*"] // Grants all permissions
}
Notes
- Multiple permissions in a single route require all permissions to be satisfied (AND logic)
- The
*wildcard permission grants access to everything in the application - Permissions are signed using JWT with a private key for integrity
- Permission validation supports pattern matching for flexible permission management