Portal Community

user/getProfile

Retrieve the full profile of a Slack user, including job title, phone number, status, and any custom profile fields defined in the workspace. Returns richer data than user/get.

When to Use

Note: user/getProfile uses the users.profile:read scope, which is separate from users:read. It returns a richer profile object than user/get, including phone, title, and custom fields. Use includeLabels: true to receive human-readable field labels alongside custom field IDs.

Configuration

Connection

FieldRequiredDescription
botTokenRequiredSlack Bot Token starting with xoxb-. Requires the users.profile:read OAuth scope.

Operation Fields

FieldRequiredDescription
userIdRequiredThe Slack user ID to retrieve the profile for (e.g. U01ABCDEFGH).
includeLabelsOptionalBoolean. Default false. When true, the response includes human-readable labels for custom profile fields alongside their API IDs.

Sample Configuration

{
  "operation": "user/getProfile",
  "connection": {
    "botToken": "{{ $credentials.slackBot.token }}"
  },
  "userId": "{{ $input.targetUserId }}",
  "includeLabels": false
}

Validation Errors

Error CodeCauseResolution
user_not_foundNo user with the given ID exists in the workspace.Verify the user ID using user/get or the workspace member list.
missing_scopeToken lacks the users.profile:read scope.Add users.profile:read under OAuth & Permissions and reinstall the app.
invalid_authToken is invalid or revoked.Regenerate the bot token and update the credential store.

Output

Success Port

FieldTypeDescription
userIdstringSlack user ID (echoed from input).
realNamestringUser's full real name.
displayNamestringUser's display name as shown in Slack.
emailstringWorkspace email address.
phonestringPhone number from the user's profile. Empty if not set.
titlestringJob title from the user's profile. Empty if not set.
statusTextstringCurrent status text (e.g. "On vacation").
statusEmojistringEmoji associated with current status (e.g. :palm_tree:).
statusstring"success" on successful retrieval.
errorCodestringEmpty on success. Slack API error code on failure.
payloadobjectFull raw profile object including custom field values and labels.

Error Port

Activated when the user is not found or the token lacks the users.profile:read scope.

Sample Output

{
  "userId": "U01ALICE123",
  "realName": "Alice Johnson",
  "displayName": "Alice",
  "email": "alice.johnson@acme.com",
  "phone": "+1-555-0100",
  "title": "Senior Engineer",
  "statusText": "On vacation",
  "statusEmoji": ":palm_tree:",
  "status": "success",
  "errorCode": "",
  "payload": {
    "ok": true,
    "profile": {
      "real_name": "Alice Johnson",
      "display_name": "Alice",
      "email": "alice.johnson@acme.com",
      "phone": "+1-555-0100",
      "title": "Senior Engineer",
      "status_text": "On vacation",
      "status_emoji": ":palm_tree:",
      "fields": {
        "Xf01CUSTOM1": { "value": "EMP-4892", "alt": "" }
      }
    }
  }
}

Expression Reference

ExpressionResult
{{ $output.getProfile.title }}Job title for org chart, directory, or access control workflows.
{{ $output.getProfile.phone }}Phone number for emergency contact or escalation routing.
{{ $output.getProfile.email }}Email address for CRM or identity system sync.
{{ $output.getProfile.statusText }}Current status text — use to detect OOO or meeting states.
{{ $output.getProfile.payload.profile.fields }}Raw custom profile field values for workspace-specific integrations.

Node Policies & GuardRails

Policy AreaRecommendation
Separate Scopeusers.profile:read is a distinct scope from users:read. Both may be required if you also need basic user info. Request only what your workflow uses.
PII ClassificationPhone numbers, email addresses, and titles are PII. Store only in encrypted systems and exclude from workflow execution logs.
Custom FieldsCustom profile field IDs (e.g. Xf01CUSTOM1) are workspace-specific. Use includeLabels: true to get human-readable names, but store the field IDs for programmatic access to ensure consistency across workspace changes.
Empty Field HandlingPhone and title fields are often empty. Always check for empty string before using these values in conditional logic or external writes.
CachingProfile data changes infrequently. Cache results for 15–30 minutes in high-throughput workflows to reduce API calls.

Examples

Populate Org Chart Entry

For each team member, retrieve their title and manager info to build an organizational chart record.

{
  "operation": "user/getProfile",
  "userId": "{{ $loop.item.userId }}",
  "includeLabels": false
}
// Map: { name: realName, title: title, email: email }

Emergency Contact Lookup

During an incident, retrieve the on-call engineer's phone number for SMS escalation.

{
  "operation": "user/getProfile",
  "userId": "{{ $input.oncallUserId }}"
}
// Use $output.getProfile.phone in SMS node

Sync Slack Profile to CRM on Account Connection

When a user connects their Slack account via OAuth, pull their full profile and create/update a CRM contact.

{
  "operation": "user/getProfile",
  "userId": "{{ $trigger.oauth.slackUserId }}",
  "includeLabels": true
}
// Write realName, email, phone, title to CRM contact