Your account
Profile, preferences, notices, devices and tokens.
Privacy and analytics
We use necessary technical cookies and, only with your consent, analytics and marketing pixels to improve the website and measure campaigns.
Profile, preferences, notices, devices and tokens.
Sets the signed-in person's own time zone on every device. Null goes back to each device's own. no_person when the account has no person record yet.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.time_zone.set |
| MCP tool | profile_time_zone_set |
| Scope | profile.write |
| Minimum role | Viewer |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
timeZone: string | null // IANA zone (`Europe/Madrid`), or null to fall back.
}Output
{
timeZone: string | null
}Changes the signed-in person's display name, avatar URL, phone or interface language. A national phone number is stored in E.164 read with the person's country (Spain when unknown). Legal name and @username go through profile.identity.update.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.update |
| MCP tool | profile_update |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
fullName?: string // ≤ 200
avatarUrl?: string // ≤ 2048
phone?: string | null
locale?: "es" | "en" | "fr" | "de" | "it" | "ru" | "ko" | "ja" | "zh" | "pt" | "hi"
}Output
{
ok: true
}Sets the profile picture to an image already uploaded to the person's own avatar folder (the upload itself is the screen's binary step). Any other URL is refused with invalid_input.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.avatar.set |
| MCP tool | profile_avatar_set |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
avatarUrl: string // uri · ≤ 2048
}Output
{
ok: true
}Removes the signed-in person's profile picture and deletes its stored files. Their initials show instead.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.avatar.remove |
| MCP tool | profile_avatar_remove |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{}Output
{
ok: true
}Saves legal first and last name, display name and @username in one write (update_my_identity). The database owns the limits; refusals come back as invalid_input/conflict with the reason in detail (username_taken, username_cooldown, legal_name_limit…). Returns the saved identity.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.identity.update |
| MCP tool | profile_identity_update |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
firstName: string // ≤ 80
lastName: string // ≤ 80
displayName: string // ≤ 60
username: string // ≤ 31
}Output
{
identity: Record<string, unknown>
}Records that the signed-in person is active now (last seen), and for Nömad staff their live presence. Creates the person record from the profile when it does not exist yet. Sent by the apps every few minutes.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.presence.touch |
| MCP tool | profile_presence_touch |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | Screens, Apps |
| Status | Available |
Input
{
path?: string // ≤ 400
}Output
{
touched: boolean
}Sends a test push to the person's own devices, or to one of them by id. Answers per device what happened; refuses with ok: false when it is too soon after the last test, there is no device or no transport is configured.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.push_devices.test |
| MCP tool | profile_push_devices_test |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
deviceId?: string | null
}Output
{
ok: true
outcomes: Record<string, unknown>[]
}
| {
ok: false
error: "too_soon" | "no_device" | "transport_not_configured" | "failed"
}Stops pushes to one of the person's own browsers or phones until it subscribes again. removed is false when no active device of theirs had that id.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.push_devices.remove |
| MCP tool | profile_push_devices_remove |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
deviceId: string // uuid
}Output
{
removed: boolean
}Marks the person's own notices read (which also marks them seen) or unread again.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.set_read |
| MCP tool | profile_notifications_set_read |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
ids: string[] // ≤ 200 items · Notification ids of the person (up to 200); ids of other people are ignored.
read: boolean
}Output
{
ok: true
}«Done»: moves the person's own notices out of the inbox (they stay under Archive), or brings them back. Archiving also marks them read.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.set_archived |
| MCP tool | profile_notifications_set_archived |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
ids: string[] // ≤ 200 items · Notification ids of the person (up to 200); ids of other people are ignored.
archived: boolean
}Output
{
ok: true
}Keeps the person's own notices under Saved for later, or takes them out of Saved.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.set_saved |
| MCP tool | profile_notifications_set_saved |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
ids: string[] // ≤ 200 items · Notification ids of the person (up to 200); ids of other people are ignored.
saved: boolean
}Output
{
ok: true
}Hides the person's own notices until a future moment, when they come back unread at the top. until: null wakes them now. A moment in the past is refused.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.snooze |
| MCP tool | profile_notifications_snooze |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
ids: string[] // ≤ 200 items · Notification ids of the person (up to 200); ids of other people are ignored.
until: string | null
}Output
{
ok: true
}Marks every unread notice of the person's inbox read: within one brand (plus account-level notices) or one category when given.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.read_all |
| MCP tool | profile_notifications_read_all |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
brandId?: string | null
category?: string | null
}Output
{
ok: true
}Opening the bell: every notice counts as seen so the badge clears; unread ones stay unread.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.mark_seen |
| MCP tool | profile_notifications_mark_seen |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{}Output
{
ok: true
}«Mute this thread»: no push or email for notices of that thread key; they still land in the inbox. muted: false turns them back on.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notifications.mute_thread |
| MCP tool | profile_notifications_mute_thread |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
threadKey: string // ≤ 200
muted: boolean
}Output
{
ok: true
}Turns one notification type or category on or off for a channel (in_app, push, email or all), everywhere or in one workspace; enabled: null goes back to the default. Required notices cannot be turned off (forbidden, detail locked). The «Nömad news» category is the person's marketing consent and every change is recorded in the consent ledger.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notification_preferences.set |
| MCP tool | profile_notification_preferences_set |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
workspaceId?: string | null
targetType: "category" | "type"
targetKey: string // ≤ 120
channel: "all" | "in_app" | "push" | "email"
enabled: boolean | null
}Output
{
ok: true
}Removes the person's own preference overrides so the catalogue defaults apply again, everywhere or in one workspace.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notification_preferences.reset |
| MCP tool | profile_notification_preferences_reset |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | Yes |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
workspaceId?: string | null
}Output
{
ok: true
}Changes the person's delivery settings: time zone, quiet hours (HH:MM and weekdays 0–6), daily or weekly digest with its hour and weekday, and the push, email and sound switches. Only the fields sent change.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notification_delivery.update |
| MCP tool | profile_notification_delivery_update |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
timeZone?: string // ≤ 80
quietHoursEnabled?: boolean
quietStart?: string // ≤ 5
quietEnd?: string // ≤ 5
quietDays?: integer[] // ≤ 7 items
digestFrequency?: "off" | "daily" | "weekly"
digestHour?: integer // -9007199254740991–9007199254740991
digestWeekday?: integer // -9007199254740991–9007199254740991
pushEnabled?: boolean
emailEnabled?: boolean
soundEnabled?: boolean
}Output
{
ok: true
}«Do not disturb»: pushes and emails wait until until (at most a week ahead); the inbox keeps receiving. until: null resumes now and releases what the pause held.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.notification_pause.set |
| MCP tool | profile_notification_pause_set |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | API, Screens, Apps |
| Status | Available |
Input
{
until: string | null
}Output
{
pausedUntil: string | null
}Accepts or rejects, once, a write an outside agent asked to make for the person («Aprobaciones»). Accepting runs it as the person through the full gate again. Only the person decides: agents never call it.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.agent_approvals.decide |
| MCP tool | profile_agent_approvals_decide |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | Screens, Apps |
| Status | Available |
Input
{
id: string // uuid
accept: boolean
}Output
{
status: "approved" | "rejected"
}Issues a personal API token (nmu_) with a name, expiry, scopes and optionally a subset of the person's brands; it never reaches further than their live role. Needs a sign-in from the last minutes on the screen. The token is returned once.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.tokens.create |
| MCP tool | profile_tokens_create |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | Screens |
| Status | Available |
Input
{
name: string // ≤ 80
expiresAt?: string | null // ISO date; empty takes the default lifetime.
scopes: string[] // ≤ 200 items
brandIds?: string[] // ≤ 200 items · default []
}Output
{
token: string
credential: {
id: string // uuid
kind: string
name: string
prefix: string
scopes: string[]
brandIds: string[] | null
createdAt: string
expiresAt: string
lastUsedAt: string | null
revokedAt: string | null
revokedSource: string | null
legacy: boolean
serviceAccountId: string | null
}
}Issues a replacement for one of the person's personal tokens; the old one keeps working for the grace hours given. Needs a recent sign-in on the screen. The new token is returned once.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.tokens.rotate |
| MCP tool | profile_tokens_rotate |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | Screens |
| Status | Available |
Input
{
id: string // uuid
graceHours: integer // 0–720
}Output
{
token: string
credential: {
id: string // uuid
kind: string
name: string
prefix: string
scopes: string[]
brandIds: string[] | null
createdAt: string
expiresAt: string
lastUsedAt: string | null
revokedAt: string | null
revokedSource: string | null
legacy: boolean
serviceAccountId: string | null
}
}Ends one of the person's personal tokens now; anything using it stops working.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.tokens.revoke |
| MCP tool | profile_tokens_revoke |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | Yes |
| Doors | Screens, Apps |
| Status | Available |
Input
{
id: string // uuid
}Output
{
ok: true
}The person's own answer to the brand shell's «Do you want to receive news?» card: yes grants marketing consent, no withdraws it. The ledger stores the exact question, the button pressed and the request evidence. Only the person, from the app.
| Field | Value |
|---|---|
| Kind | Write |
| HTTP method | POST /api/v1/profile.marketing_consent.answer |
| MCP tool | profile_marketing_consent_answer |
| Scope | profile.write |
| Minimum role | self |
| Human confirmation | No |
| Doors | Screens, Apps |
| Status | Available |
Input
{
accepted: boolean
}Output
{
ok: true
}Updated on January 1, 1970