Portal Community

When to Use

Configuration

Authentication

FieldRequiredDescription
AuthenticationMethodRequired"ApiToken" or "OAuth2".
ApiTokenRequiredNotion Internal Integration Token starting with secret_.
ClientIdOAuth2OAuth2 client ID.
ClientSecretOAuth2OAuth2 client secret.
AccessTokenOAuth2OAuth2 access token.

Operation Fields

FieldRequiredDescription
UserRequiredNotion user UUID. Typically obtained from a people property value on a page: properties.Assignee.people[0].id.

Sample Configuration

{
  "resource": "user",
  "operation": "get",
  "AuthenticationMethod": "ApiToken",
  "ApiToken": "{{ $credentials.notionApiToken }}",
  "User": "{{ $json.assigneeUserId }}"
}

Validation Errors

Error CodeCause
NOTION_VALIDATION_FAILEDUser field is empty or not a valid UUID.
NOTION_NOT_FOUNDNo user exists with the given UUID in the workspace.
NOTION_UNAUTHORIZEDAPI token is invalid or does not have user read access.
NOTION_RATE_LIMITEDRate limit exceeded.

Output

Success Port

FieldTypeDescription
idstringUser UUID.
namestringDisplay name of the user.
emailstringEmail address. Only returned for type: "person" users with an active account. May be null for guest users.
avatarUrlstringURL to the user's profile image. May be null if no avatar is set.
typestring"person" for human users; "bot" for integration accounts.

Error Port

On failure the error port receives errorCode, message, and httpStatus. Handle NOTION_NOT_FOUND when user IDs come from page properties that may reference deactivated accounts.

Sample Output

{
  "id": "a1b2c3d4-1111-2222-3333-e5f678901234",
  "name": "Sarah Chen",
  "email": "sarah.chen@acmecorp.com",
  "avatarUrl": "https://s3.us-west-2.amazonaws.com/secure.notion-static.com/avatars/abc123.jpg",
  "type": "person"
}

Expression Reference

ExpressionTypeUse
{{ $output.getUser.email }}stringRoute notifications — use as EmailSmtp recipient
{{ $output.getUser.name }}stringInclude display name in message body
{{ $output.getUser.type }}stringFilter: only notify if type === "person"
{{ $output.getUser.avatarUrl }}stringDisplay avatar in a rich UI notification
{{ $output.getUser.id }}stringUse as assignee filter in database/query people filter

Node Policies & GuardRails

PolicyDetail
Check type before routingAlways verify type === "person" before using the email field for notifications. Bot users do not have email addresses, and attempting to email a bot ID results in a null value.
Email may be null for guestsNotion guests (users invited to specific pages without full workspace access) may not expose an email address via the API. Use null-coalescing in expressions: {{ $output.getUser.email ?? "noemail@placeholder.com" }}.
User IDs from page propertiesObtain user IDs from a page's people property: properties.Assignee.people[0].id. Use an IfCondition to check people.length > 0 before passing the ID to user/get.
Credentials in Credentials ManagerAlways use {{ $credentials.notionApiToken }} — never hard-code the token.
Cache user lookups in long workflowsIf the same user ID appears multiple times across a loop, cache the resolved name/email in a workflow variable after the first lookup to avoid redundant API calls.

Workflow Examples

Example 1 — Email Notification to Page Assignee

When a task is assigned (trigger fires), fetch the assignee's email and send them a notification.

// Step 1: trigger/pageAdded or trigger/pageUpdated
// Step 2: page/get { "Page": "{{ $trigger.pageId }}", "Simplify": false }
// Step 3: IfCondition — people array not empty
// Step 4: user/get
{
  "User": "{{ $output.getPage.properties.Assignee.people[0].id }}"
}
// Step 5: EmailSmtp
{
  "To": "{{ $output.getUser.email }}",
  "Subject": "Task Assigned: {{ $output.getPage.properties.Name.title[0].plain_text }}",
  "Body": "You have been assigned a new task. View it here: {{ $output.getPage.url }}"
}

Example 2 — Bot Filter Before Notification

Query tasks and notify only human assignees, skipping bot accounts.

// Step 1: database/query (filter by assignee people)
// Step 2: Loop over results
// Step 3 per item: user/get with assignee user ID
// Step 4: IfCondition — type === "person"
// True: send Slack or email notification
// False: skip (bot account)

Example 3 — Enrich Report with Assignee Name

Build a weekly task report that maps user IDs to human-readable names.

// Step 1: database/query (all open tasks)
// Step 2: Loop over results
// Step 3 per item: user/get for assignee
// Step 4: Build report row: title + assignee name + due date
// Step 5: Assemble all rows into report body
// Step 6: EmailSmtp weekly digest to manager