---
title: "Update user profile"
method: PATCH
path: "/api/user-profile"
tags: ["user_profiles"]
---

# Update user profile

`PATCH /api/user-profile`

## Request

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

Write the signed-in person's card: any of full_name, headline, role_title, company_name, location, experience_line, topics, languages, ln_member_id, ln_id, ln_nickname (a profile link is parsed to the slug; null clears a field); avatar_url is the account's picture while it has none; source stamps each field (default person); read_at: when the profile was read. The first write creates the card; a full_name replaces an email-derived name. 422 unknown_field, ln_nickname_invalid.

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

## Request body

- UpdateUserProfileRequest: Request body of `update_user_profile`.
  - `full_name` string, nullable: Replaces the account's name too while that name is still the one derived from the sign-up email.
  - `headline` string, nullable: The LinkedIn headline.
  - `role_title` string, nullable: The current role.
  - `company_name` string, nullable: The current company.
  - `location` string, nullable: Where the person is.
  - `avatar_url` string, nullable: The photo as read_linkedin_person gives it (an https address): the account takes it as its picture while it has none; a picture already set stays, and null changes nothing. Not a field of the card.
  - `experience_line` string, nullable: One line you write from the positions when they say more than the headline ("11 years in B2B sales, before that Oracle"); null when they carry no dates and no earlier company.
  - `topics` string[], nullable: Two or three topics the person writes about.
  - `languages` string[], nullable: The languages the profile lists.
  - `ln_member_id` integer, nullable: The decoded member id.
  - `ln_id` string, nullable: The profile URN.
  - `ln_nickname` string, nullable: The profile slug or its linkedin.com/in/ link; parsed to the slug at the edge, a URL is never stored.
  - `source` 'linkedin_company' | 'linkedin_profile' | 'website' | 'person' | 'creator', nullable: Stamps each field written: linkedin_profile for what the read said, person for the person's own words, creator for an inference; default person.
  - `read_at` string, nullable: ISO 8601; when the LinkedIn profile was read. A stamp itself, so it gets no source.

## Response `200`

`update` success envelope.

- UpdateUserProfileResponse
  - `success` true, required
  - `operation` 'update', required
  - `item` object, required
    - `sid` string, required: User profile sid (id_up_...).
    - `user_sid` string, required: Whose card it is (ts_us_...).
    - `full_name` string, nullable, required
    - `headline` string, nullable, required: The LinkedIn headline.
    - `role_title` string, nullable, required: The current role.
    - `company_name` string, nullable, required: The current company.
    - `location` string, nullable, required
    - `experience_line` string, nullable, required: The experience in one line ("11 years in B2B sales").
    - `topics` string[], required: Two or three topics the person writes about.
    - `languages` string[], required
    - `ln_member_id` integer, nullable, required
    - `ln_id` string, nullable, required: The profile URN.
    - `ln_nickname` string, nullable, required: The public identifier (slug), never a URL.
    - `sources` object, required: One stamp per written field, keyed by the field's name.
    - `read_at` string, nullable, required: ISO 8601 UTC; when the LinkedIn profile was last read.
    - `created_at` string, nullable, required: ISO 8601 UTC.
    - `updated_at` string, nullable, required: ISO 8601 UTC.
  - `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)
