Xurrent Personal Access Required Token Permissions or Scopes

    This document details all API permissions required by the Exalate Xurrent connector, organized by feature and use case.


    Overview

    Xurrent uses a record type + operation permission model for API access. When creating a Personal Access Token or OAuth application, you must explicitly grant permissions for each record type your integration needs to access.

    Key Points:

    • Personal Access Tokens deny all access by default
    • You must add scopes for each record type needed
    • Operations include: ReadCreateUpdateDeleteAll
    • Some operations require specific user roles in addition to API scopes

    Permission Format

    Xurrent permissions follow the format:

    <record_type>:<operation>
    

    Available Operations:

    OperationDescription
    ReadQuery and retrieve data
    CreateCreate new records
    UpdateModify existing records
    DeleteDelete records
    AllAll operations (Read + Create + Update + Delete)

    Examples:

    • Request:Read - Can read requests
    • Request:Create - Can create requests
    • Person:Read - Can read people/users
    • Team:Read - Can read teams

    Minimum Required Permissions

    These are the absolute minimum permissions required for basic Exalate sync functionality:

    Record TypeOperationsPurpose
    RequestRead, Create, UpdateCore sync functionality

    With only these permissions, you can:

    • Create new requests from incoming sync
    • Update existing requests
    • Read request details for outgoing sync

    Limitations with minimum permissions:

    • Cannot sync comments (need Note permissions)
    • Cannot look up users by email (need Person permissions)
    • Cannot look up teams (need Team permissions)
    • Cannot use request templates (need Request Template permissions for custom fields type)
    • Cannot use custom fields with labels (need UI Extension permissions)

    Full Feature Permissions

    For full Exalate functionality, grant these permissions:

    Record TypeOperationsPurpose
    RequestRead, Create, UpdateCore request sync
    NoteRead, CreateComment sync
    PersonReadUser lookup (reporter, assignee)
    TeamReadTeam assignment (for member field)
    Request TemplateReadTemplate-based requests
    UI ExtensionReadCustom field labels/values
    Service InstanceReadService assignment

    Permission by Feature

    1. Request Sync (Required)

    Permissions Needed:

    Request: Read, Create, Update
    

    Script Usage:

    // These work with Request permissions only
    entity.summary = replica.summary
    entity.category = "incident"
    entity.status = replica.status
    

    2. Comment/Note Sync

    Permissions Needed:

    Note: Read, Create
    

    Script Usage:

    // Sync comments
    entity.comments = commentHelper.mergeComments(entity, replica)
    

    Without Note:Read permission (Outgoing Sync):

    • Comments will NOT be read from Xurrent
    • Warning logged: "Unauthorized (401) when fetching comments... API token may lack Note:Read permission"
    • Sync continues without comments (graceful degradation)
    • No error thrown

    Without Note:Create permission (Incoming Sync):

    • Sync FAILS with clear error message
    • Error: "Unauthorized (401) when creating comment... Ensure your API token has Note:Create permission"
    • This ensures users know exactly what permission is missing

    3. User/People Lookup

    Permissions Needed:

    Person: Read
    

    Script Usage:

    // Look up user by email
    def user = nodeHelper.getUserByEmail("john@example.com")
    
    entity.requestedFor = user
    
    // Look up user by ID
    def user = nodeHelper.getUserById("12345")
    

    Without Person permissions:

    • getUserByEmail() throws IssueTrackerException with 401 error
    • Reporter/Assignee enrichment fails

    4. Team Assignment

    Permissions Needed:

    Team: Read
    

    Script Usage:

    // Look up team by name
    def teamId = nodeHelper.getTeamIdByName("Support Team")
    entity.teamId = teamId
    

    Without Team permissions:

    • getTeamIdByName() throws IssueTrackerException with 401 error
    • Team member validation is skipped (graceful degradation)
    • Request creation may still work if team ID is known

    5. Request Templates

    Permissions Needed:

    Request Template: Read
    

    Script Usage:

    // Look up template by name
    def templateId = nodeHelper.getTemplateIdByName("IT Support Request")
    entity.templateId = templateId
    

    Without Request Template permissions:

    • getTemplateIdByName() throws IssueTrackerException with 401 error
    • Cannot dynamically look up templates
    • Can still use template ID directly if known

    6. Custom Fields (UI Extensions)

    Permissions Needed:

    Request Template: Read
    UI Extension: Read
    

    Script Usage:

    // Get custom field with validation
    def cf = nodeHelper.getCustomField(templateId, "My Field", "Value 1")
    entity.customFields["My Field"] = cf
    
    // Get field label
    def label = nodeHelper.getCustomFieldLabel(templateId, "custom_field_123")
    
    // Get value label (for dropdowns)
    def valueLabel = nodeHelper.getCustomFieldValueLabel(templateId, "company", "value_1")
    
    // Get all field definitions
    def definitions = nodeHelper.getCustomFieldDefinitions(templateId)
    

    Without UI Extension permissions:

    • getCustomField() throws error about missing definitions
    • getCustomFieldLabel() returns internal ID instead of label
    • getCustomFieldValueLabel() returns internal value instead of label
    • Custom fields still sync, but with internal IDs instead of labels

    7. Service Assignment

    Permissions Needed:

    Service Instance: Read
    

    Script Usage:

    // Look up service by name
    def serviceId = nodeHelper.getServiceIdByName("IT Service Desk")
    entity.serviceId = serviceId
    

    Without Service Instance permissions:

    • getServiceIdByName() throws IssueTrackerException with 401 error
    • Can still use service ID directly if known

    8. Tags/Labels

    Permissions Needed:

    Request: Read, Update
    

    Tags are managed through the Request API, no separate Tag permission needed.

    Script Usage:

    // Sync labels/tags
    entity.labels = replica.labels
    

    9. Attachments

    Permissions Needed:

    Request: Read, Update
    Note: Create (for attachments on comments)
    

    Attachments use the storage facility API which is accessible with Request permissions.

    Script Usage:

    // Sync attachments
    entity.attachments = replica.attachments
    




    Permission Errors

    401 Unauthorized Errors

    When a method lacks required permissions, you'll see errors like:

    IssueTrackerException: Unauthorized: If you want to use this feature (getUserByEmail),
    ensure your API token has proper permissions for the People endpoint.
    

    Solution: Add the required record type with Read permission to your Personal Access Token.

    Graceful Degradation

    Some features gracefully degrade instead of throwing errors:

    FeatureBehavior without Permission
    Note:Read (outgoing)Comments skipped - sync proceeds without comments
    Team member validationSkipped - request proceeds
    Custom field labelsReturns internal ID
    Custom field value labelsReturns internal value

    Strict Validation (Throws Exception)

    These features throw exceptions with clear 401 messages:

    FeatureError Message
    Note:Create (incoming)"Unauthorized (401) when creating comment... Ensure your API token has Note:Create permission"
    Person:Read"Unauthorized (401) when fetching person. Check API permissions for people endpoint."
    Team:Read (lookup)"Unauthorized: If you want to use this feature (getTeamIdByName), ensure your API token has proper permissions for the Teams endpoint."




    Additional Resources

    Next steps

    Have more questions? Ask the community