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
- Retrieve a user's job title for generating an org chart or directory application.
- Get a phone number during an emergency contact or escalation workflow.
- Pull full profile data into a CRM system when a user connects their Slack account.
- Verify a user's title or department as part of an access control or approval workflow.
- Read custom workspace profile fields (e.g. employee ID, cost center) for integration with internal systems.
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
| Field | Required | Description |
|---|---|---|
botToken | Required | Slack Bot Token starting with xoxb-. Requires the users.profile:read OAuth scope. |
Operation Fields
| Field | Required | Description |
|---|---|---|
userId | Required | The Slack user ID to retrieve the profile for (e.g. U01ABCDEFGH). |
includeLabels | Optional | Boolean. 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 Code | Cause | Resolution |
|---|---|---|
user_not_found | No user with the given ID exists in the workspace. | Verify the user ID using user/get or the workspace member list. |
missing_scope | Token lacks the users.profile:read scope. | Add users.profile:read under OAuth & Permissions and reinstall the app. |
invalid_auth | Token is invalid or revoked. | Regenerate the bot token and update the credential store. |
Output
Success Port
| Field | Type | Description |
|---|---|---|
userId | string | Slack user ID (echoed from input). |
realName | string | User's full real name. |
displayName | string | User's display name as shown in Slack. |
email | string | Workspace email address. |
phone | string | Phone number from the user's profile. Empty if not set. |
title | string | Job title from the user's profile. Empty if not set. |
statusText | string | Current status text (e.g. "On vacation"). |
statusEmoji | string | Emoji associated with current status (e.g. :palm_tree:). |
status | string | "success" on successful retrieval. |
errorCode | string | Empty on success. Slack API error code on failure. |
payload | object | Full 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
| Expression | Result |
|---|---|
{{ $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 Area | Recommendation |
|---|---|
| Separate Scope | users.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 Classification | Phone numbers, email addresses, and titles are PII. Store only in encrypted systems and exclude from workflow execution logs. |
| Custom Fields | Custom 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 Handling | Phone and title fields are often empty. Always check for empty string before using these values in conditional logic or external writes. |
| Caching | Profile 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