> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mokaru.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Profile

> Update your career profile

## Overview

The Update Profile endpoint lets you modify your career profile. The scalar identity and contact fields (name, email, phone, address, links, and the profile scalars below) are shared and appear on every resume - editing them here propagates to all resumes. The collection arrays (`summaries`, `projects`, `certificates`, etc.) write your base (default) resume's content, which is the canonical content that new resumes are copied from.

**Common use cases:**

* **AI agent profile management** - keep your profile up to date as your career evolves.
* **Bulk updates** - update multiple fields at once after a job change.
* **LinkedIn sync** - pull data from LinkedIn and push it to your Mokaru profile.

<Note>
  **Scope required:** `profile:write` | **Rate limit:** 20 requests/min
</Note>

## Request

```bash theme={null}
PATCH /v1/profile
```

### Body Parameters

All fields are optional. Only include the fields you want to change. Pass `null` to clear a field.

<ParamField body="firstName" type="string">
  First name (max 100 characters)
</ParamField>

<ParamField body="lastName" type="string">
  Last name (max 100 characters)
</ParamField>

<ParamField body="email" type="string">
  Email address (max 254 characters)
</ParamField>

<ParamField body="phone" type="string">
  Phone number (max 50 characters, null to clear)
</ParamField>

<ParamField body="address" type="string">
  Address (max 200 characters, null to clear)
</ParamField>

<ParamField body="country" type="string">
  Country (max 100 characters, null to clear)
</ParamField>

<ParamField body="province" type="string">
  Province or state (max 100 characters, null to clear)
</ParamField>

<ParamField body="jobTitle" type="string">
  Current job title (max 200 characters, null to clear)
</ParamField>

<ParamField body="summary" type="string">
  Professional summary (max 2000 characters, null to clear)
</ParamField>

<ParamField body="sector" type="string">
  Industry sector (max 100 characters, null to clear)
</ParamField>

<ParamField body="nationality" type="string">
  Nationality (max 100 characters, null to clear)
</ParamField>

<ParamField body="pronouns" type="string">
  Pronouns (max 50 characters, null to clear)
</ParamField>

<ParamField body="linkedIn" type="string">
  LinkedIn username or URL (max 500 characters, null to clear)
</ParamField>

<ParamField body="website" type="string">
  Personal website URL (max 500 characters, null to clear)
</ParamField>

<ParamField body="portfolio" type="string">
  Portfolio URL (max 500 characters, null to clear)
</ParamField>

<ParamField body="github" type="string">
  GitHub URL (max 500 characters, null to clear)
</ParamField>

### Collection fields (replace-list semantics)

These accept full arrays. **Passing an array REPLACES the entire collection.** To add one item without losing existing entries, first call `GET /v1/profile`, append to the returned array, then send the full updated array back. Omit the field to leave the collection unchanged; pass `[]` to clear it. Hard cap of 100 items per collection (50 for `jobTitles`).

<ParamField body="summaries" type="array (max 100)">
  Professional summary versions: `{ title?: string, content: string }[]`
</ParamField>

<ParamField body="projects" type="array (max 100)">
  Projects: `{ name, description, organisation?, startDate?, endDate?, isCurrent?, url? }[]`
</ParamField>

<ParamField body="certificates" type="array (max 100)">
  Certificates: `{ name, issuer, description?, issueDate?, expiryDate?, credentialId?, verificationUrl? }[]`
</ParamField>

<ParamField body="awards" type="array (max 100)">
  Awards: `{ name, organisation?, description?, date? }[]`
</ParamField>

<ParamField body="publications" type="array (max 100)">
  Publications: `{ name, publisher?, date?, url?, description? }[]`
</ParamField>

<ParamField body="interests" type="array (max 100)">
  Interests: `{ name, description? }[]`
</ParamField>

<ParamField body="jobTitles" type="array (max 50)">
  Career-identity job titles: `{ title: string }[]`
</ParamField>

### Example

```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/profile" \
  -H "Authorization: Bearer mk_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Jane",
    "lastName": "Smith",
    "jobTitle": "Senior Software Engineer",
    "linkedIn": "jane-smith",
    "sector": "Technology"
  }'
```

## Response

<ResponseField name="success" type="boolean">Whether the profile was updated</ResponseField>

```json theme={null}
{
  "success": true
}
```

<Note>
  LinkedIn usernames are automatically converted to full URLs. For example, `"jane-smith"` becomes `"https://linkedin.com/in/jane-smith"`. Website and portfolio URLs have `https://` prepended if no protocol is specified.
</Note>
