---
title: "Update your profile and account preferences"
method: PUT
path: "/users/{id}"
tags: ["Users"]
---

# Update your profile and account preferences

`PUT /users/{id}`

## Request

- Base URL: `https://api.purplegrain.com/api/v1`
- URL: `https://api.purplegrain.com/api/v1/users/{id}`
- Auth: HTTP bearer

Update the signed-in person's own profile, identified by `id` from
`fetchCurrentUser`. Requires that person's permitted write access;
another person's profile cannot be edited through this operation.

Send only the fields the person wants changed: `name`, `about`,
`handle`, `mobile`, `contact_info`, `account_mode`,
`default_record_mode`, or the `place` relationship. Profile and
contact changes may affect what other people see. Confirm the
requested changes before writing. Returns the updated user.

This does not change the login email, password, avatar, or SMS
notification preferences, and changing a mobile here does not verify
it. Password and phone verification flows stay on PurpleGrain's own
pages; use `updateUserAvatar` for the profile picture and
`updateSmsPreferences` for SMS notification preferences.

## Path parameters

- `id` string, required

## Query parameters

- `include` string

## Request body

- UserUpdateModelAttributes: Flat attributes-adapter request body (Content-Type application/json). Attribute fields and relationships live directly under `data` (no nested `attributes` / `relationships` envelopes). Each relationship is a resource identifier object ({ id, type }). Equivalent JSON:API (nested) shape: `UserUpdateModel` sent as application/vnd.api+json.
  - `data` object, required
    - `name` string, nullable
    - `about` string, nullable
    - `handle` string
    - `account_mode` 'grower' | 'contractor', nullable
    - `default_record_mode` 'ai' | 'general': Which record type the composer opens on: `ai` (PurpleGrain AI, the default) or `general`. Only present for the current user. A null value is ignored on update.
    - `mobile` string, nullable
    - `contact_info` object
      - `mobile` string, nullable
      - `phone` string, nullable
      - `facebook` string, nullable
      - `url` string, nullable
      - `email` boolean, nullable
    - `place` object, nullable
      - `id` string, nullable
      - `type` 'city' | 'address', nullable

## Response `200`

Update. When the `include` query parameter is used, the response may contain an `included` array (JSON:API) or inlined related resources (application/json).

- UsersShowResponseAttributes
  - `data` UserModelAttributes: User in attributes-adapter shape (Accept application/json); fields at top level.
    - `id` string
    - `type` string
    - `email` string, email
    - `name` string, nullable
    - `about` string, nullable
    - `account_mode` 'grower' | 'contractor', nullable: Grower vs Contractor mode; only present for the current user.
    - `default_record_mode` 'ai' | 'general': Which record type the composer opens on: `ai` (PurpleGrain AI, the default) or `general`. Only present for the current user. A null value is ignored on update.
    - `free_trial_used` boolean, nullable: Whether the free trial has been used. Only populated when viewing your own profile; null otherwise.
    - `mobile` string, nullable: Canonical login mobile (E.164); only present for the current user.
    - `mobile_verified` boolean, nullable: Whether the mobile has been verified by SMS one-time code; only present for the current user.
    - `sms_opted_out` boolean, nullable: Whether SMS to this account is silenced (by replying STOP, or from the account screen); only present for the current user.
    - `handle` string
    - `url` string
    - `avatar_url` string, nullable
    - `avatar_thumb_url` string, nullable
    - `updated_at` string, date-time
    - `created_at` string, date-time
    - `contact_info` object
      - `mobile` string, nullable
      - `phone` string, nullable
      - `facebook` string, nullable
      - `url` string, nullable
      - `email` boolean, nullable
    - `city` object: Inlined when include=city
    - `place` object: Inlined when include=place
    - `services` unknown[], nullable: Inlined when include=services
      - unknown
    - `location` object: Inlined when include=location

---

[API](https://skmtc.dev/purplegrain/apis/purple-grain-api.md) · [All operations](https://skmtc.dev/purplegrain/apis/purple-grain-api/llms.txt) · [OpenAPI document](https://skmtc.dev/purplegrain/apis/purple-grain-api/revisions/4bedbc1c784c?raw)
