---
title: "Update current user"
method: PATCH
path: "/api/users/current"
tags: ["users"]
---

# Update current user

`PATCH /api/users/current`

## Request

- Base URL: `https://beta.getsales.io/id/v1`
- URL: `https://beta.getsales.io/id/v1/api/users/current`
- Auth: HTTP bearer and API key in header `Team-SID`

Edit the signed-in account: first_name, last_name, avatar_url, phone, timezone, country and a shallow config patch (keys merge, the rest stays). Email, the default team and erasure keep their own /auth flows; sids are read-only. At least one field. An API key has no profile (403 not_a_user_actor). The avatar FILE goes through the app upload, not here: pass a URL, or null to remove it.

Contract:
- MCP tool `update_current_user`, registry package `mcp.id/users`, mount `id.identity`.
- Operation `update`, response envelope `update`.
- Flags: none.

## Request body

- UpdateCurrentUserRequest: Request body of `update_current_user`.
  - `first_name` string: Given name, 1..120 chars.
  - `last_name` string, nullable: Family name, up to 120 chars; null clears it.
  - `avatar_url` string, uri, nullable: An absolute URL of the picture, up to 2048 chars; null removes the avatar.
  - `phone` string, nullable: Up to 40 chars; null clears it.
  - `timezone` string, nullable: IANA zone, e.g. Europe/Riga; null clears it.
  - `country` string, nullable: ISO 3166-1 alpha-2; null clears it.
  - `config` object: A shallow patch of the preferences: the keys sent are merged over the stored ones.
    - `latest_team_sid` string, nullable: Which workspace to open on load (ts_tm_...); NOT default_team_sid.
    - `setup_completed` boolean: The post-signup wizard is finished (or its last step was skipped).
    - `setup_step` 'verify' | 'questions' | 'workspace' | 'linkedin' | 'call', nullable: Resume point inside the wizard; null = not started.
    - `onboarding_completed` boolean: The in-app Get started checklist is done.
    - `onboarding_steps` string[]: The checklist steps already completed.
    - `locale` string, nullable: The UI locale the account picked (en, de, ...); null = the browser decides.

## Response `200`

`update` success envelope.

- UpdateCurrentUserResponse
  - `success` true, required
  - `operation` 'update', required
  - `item` object, required
    - `sid` string, required: User sid (us_mb_...).
    - `default_team_sid` string, nullable, required: The workspace the account signs into by default (ts_tm_...); null until a membership exists.
    - `email` string, required: The sign-in address, lowercased.
    - `email_status` 'unverified' | 'verified', required: unverified until the address confirmed its code.
    - `auth_provider` 'password' | 'google', required: How the account was CREATED: password = the email door (a mailed code since 2026-10-23, no password is held), google = Google sign-in.
    - `first_name` string, required: Given name.
    - `last_name` string, nullable, required: Family name; null when not given.
    - `avatar_url` string, nullable, required: The avatar on the assets store (up to 2048 chars); null = initials.
    - `phone` string, nullable, required: Phone number as typed; null when not given.
    - `timezone` string, nullable, required: IANA zone of the person (Europe/Riga); the first workspace takes it as its day.
    - `country` string, nullable, required: ISO 3166-1 alpha-2.
    - `config` object, nullable, required: Preferences and onboarding state (UserConfigValue); null when never written.
      - `latest_team_sid` string, nullable: Which workspace to open on load (ts_tm_...); NOT default_team_sid.
      - `setup_completed` boolean: The post-signup wizard is finished (or its last step was skipped).
      - `setup_step` 'verify' | 'questions' | 'workspace' | 'linkedin' | 'call', nullable: Resume point inside the wizard; null = not started.
      - `setup_call_step` boolean, nullable: Read-only: whether the wizard offers the intro call step; null = not scored yet. Dropped if sent on update.
      - `onboarding_completed` boolean: The in-app Get started checklist is done.
      - `onboarding_steps` string[]: The checklist steps already completed.
      - `locale` string, nullable: The UI locale the account picked (en, de, ...); null = the browser decides.
    - `utm` object, nullable, required: The UTM tags of the sign-up, as captured; null when there were none.
    - `created_at` string, required: ISO 8601 UTC.
    - `updated_at` string, required: ISO 8601 UTC.
    - `erasure_requested_at` string, nullable, required: When the account asked to be erased (GDPR Art. 17); null = not requested. The 72h window runs from here.
    - `erased_at` string, nullable, required: When the erasure ran; null while the account is live.
    - `deleted_at` string, nullable, required: ISO 8601 UTC; null = live.
  - `updated_fields` string[], required
  - `previous_values` object, required
  - `kept_fields` string[]: The fields this write did not change because the person's own value stands on them (stamped person); read the item for what landed.
  - `meta` object, required
    - `trace_id` string, required: UUID v7; same 128-bit value as the X-Trace-Id header.
    - `span_id` string, required: 16 hex chars, root span of this request.
    - `timestamp` string, required: ISO 8601 UTC (Y-m-dTH:i:sZ), response time.
    - `duration_ms` integer, required: Server-side wall clock.
    - `team_sid` string, nullable: The team this call ran in (the token team, or the team_sid override). Null when unauthenticated; absent from pre-2026-08-20 backends.
    - `actor_type` string, nullable: user | agent | api_key | system. Null when unauthenticated; absent from pre-2026-08-20 backends.

## Other responses

- `4XX`: MCP error envelope. `error.code` is one of validation_failed, nothing_to_update, not_found, relation_not_found, invalid_transition, limit_exceeded, payment_required, duplicate_rejected, conflict, delete_blocked, unauthorized, forbidden, rate_limited, not_implemented.
- `5XX`: MCP error envelope with `error.code` internal_error or service_unavailable.

---

[API](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-id.md) - [All operations](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-id/llms.txt) - [OpenAPI document](https://skmtc.dev/getsales/apis/getsales-public-contract-gs-service-id/revisions/95e48541fe85?raw)
