---
title: "Create or replace the caller's member profile, resume included (US residents only)"
method: PUT
path: "/api/me/profile"
---

# Create or replace the caller's member profile, resume included (US residents only)

`PUT /api/me/profile`

## Request

- Base URL: `https://www.toma.com`
- URL: `https://www.toma.com/api/me/profile`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `better-auth.session_token`

Same as the update_my_profile MCP tool. Omit resume or linkedinUrl to keep them. A new name or headline also shows on the caller's open tasks. Applications already sent keep the resume they were sent with.

## Request body

- object
  - `name` string, required: The human's name, shown on their member page, their tasks, and their applications.
  - `headline` string, required: What they do, in one line, for example 'Founder, Northstar' or 'Data engineer for small teams'.
  - `about` string, required
  - `city` string, required
  - `state` 'AL' | 'AK' | 'AZ' | 'AR' | 'CA' | 'CO' | 'CT' | 'DE' | 'DC' | 'FL' | 'GA' | 'HI' | 'ID' | 'IL' | 'IN' | 'IA' | 'KS' | 'KY' | 'LA' | 'ME' | 'MD' | 'MA' | 'MI' | 'MN' | 'MS' | 'MO' | 'MT' | 'NE' | 'NV' | 'NH' | 'NJ' | 'NM' | 'NY' | 'NC' | 'ND' | 'OH' | 'OK' | 'OR' | 'PA' | 'RI' | 'SC' | 'SD' | 'TN' | 'TX' | 'UT' | 'VT' | 'VA' | 'WA' | 'WV' | 'WI' | 'WY', required: US state or DC where they live.
  - `skills` string[], required
  - `website` string
  - `linkedinUrl` string, nullable: The human's own LinkedIn profile (linkedin.com/in/...). Omit to keep the linked one; null or empty unlinks it.
  - `resume` string: The member's experience and education in Markdown, at most 20,000 characters: "## Experience" (one "### Task Title · Company" per role, a dates line, and "-" bullets), then "## Education". Leave out the name, headline, location, summary, and skills (they are profile fields, added when the resume is shown), and email addresses and phone numbers (posters and the members they hire get each other's contact details only after hiring). Omit to keep the saved one; empty clears it. Creating tasks and applying both need it.
  - `usWorkAuthorized` true, required: Must be true: the human confirms they live in the United States and are authorized to work there.

## Response `200`

The saved profile.

- Me
  - `id` string, required: The account id. Public page: /members/{id}.
  - `email` string, required
  - `name` string, required
  - `photoUrl` string, nullable, required
  - `linkedinUrl` string, nullable, required: The LinkedIn profile linked to this account.
  - `profile` MemberProfile, required: A member's profile fields; empty strings (and a null state) for what they haven't filled in.
    - `headline` string
    - `about` string
    - `skills` string[]
    - `city` string
    - `state` string, nullable: Two-letter US state code or DC.
    - `stateName` string, nullable
    - `website` string, nullable
    - `resume` string: The member's experience and education in Markdown, at most 20,000 characters: "## Experience" (one "### Task Title · Company" per role, a dates line, and "-" bullets), then "## Education". Leave out the name, headline, location, summary, and skills (they are profile fields, added when the resume is shown), and email addresses and phone numbers (posters and the members they hire get each other's contact details only after hiring). Empty until written or imported; creating tasks and applying both need it.
    - `usWorkAuthorized` boolean: They confirmed they live in the United States and are authorized to work there.
    - `updatedAt` string, date-time
  - `missing` string[], required: What they still have to add before they can create tasks or apply; empty when complete.
  - `identityVerificationEnabled` boolean, required: Whether sign-up requires identity verification and US work authorization. Disabled by default.
  - `discordCommunityUrl` string, uri, required: The Toma Discord community invite, available only in authenticated member responses.
  - `signUp` object, nullable, required: When identityVerificationEnabled is true, a new member signs up on /welcome by confirming or skipping LinkedIn, verifying identity, and confirming US work authorization. Until they finish, every other member route answers 403 "Finish signing up first." With verification disabled, admitted members finish automatically without a LinkedIn step. Null once finished. Invite-only admission still applies.
    - `step` 'linkedin' | 'identity' | 'work', required: The sign-up step to do next.
    - `identity` 'none' | 'started' | 'review' | 'verified' | 'failed' | 'expired' | 'duplicate', required: The identity check (government ID and selfie); duplicate when the ID already verified another account.
    - `verifiedName` string, nullable, required: The name on the verified ID.

## Other responses

- `400`: Invalid profile, a state outside the US, or no US work authorization.
- `401`: No valid session or API key.
- `403`: Unverified email.
- `413`: The request body exceeds 2097152 bytes.

---

[API](https://skmtc.dev/toma/apis/toma-api.md) - [All operations](https://skmtc.dev/toma/apis/toma-api/llms.txt) - [OpenAPI document](https://skmtc.dev/toma/apis/toma-api/revisions/b4e56e1db5a2?raw)
