---
title: "Update a note"
method: PATCH
path: "/api/v1/people/notes/{noteId}"
tags: ["People"]
---

# Update a note

`PATCH /api/v1/people/notes/{noteId}`

## Request

- Base URL: `https://api.recruitwithatlas.com`
- URL: `https://api.recruitwithatlas.com/api/v1/people/notes/{noteId}`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/recruitwithatlas/apis/atlas-api/docs/api/v1/people/notes/:noteId/patch.ts> (a function with typed inputs; its response is checked against the schema)

Use this endpoint to change the text of an existing note, instead of adding a new note every time.

**What you need to provide:**
- The note's ID in the URL path - returned as `id` by **Create a note on a person** and by the note list endpoints
- `note` (required) - the new text. It replaces the existing text. HTML tags are stripped, the same as when a note is created. An empty string, or text that is only HTML tags, is rejected with a 422.

Only the text can be changed. The note keeps its person, project, type and author, and sending any other field is rejected with a 422.

**What you get back:** the updated note, in the same shape as a row of **List notes across the agency** (without `deletedAt`). Its `updatedAt` moves forward when the text changed, so the edit flows through an `updatedAfter` sync cursor.

**Returns `404` when:**
- No note with this ID exists in your agency, or it has been deleted.

## Path parameters

- `noteId` string, uuid, required: Note ID

## Request body

- UpdateNotePayload: Replace a note's text
  - `note` string, required: The new note text. Replaces the existing text. HTML tags are stripped.

## Response `200`

Note updated

- object
  - `status` 'ok', required
  - `data` object, required
    - `id` string, uuid, required
    - `personId` string, uuid, required
    - `projectId` string, uuid, nullable, required: Project the note is scoped to, when it was added against the person’s candidacy on a specific project. Null for a person-level note.
    - `text` string, required
    - `type` 'manual' | 'phone_call' | 'integration', required
    - `phoneCallOutcome` 'no_answer' | 'interested' | 'not_interested' | 'replied' | 'null', nullable, required: Outcome when the note came from a logged phone call, otherwise null
    - `createdBy` object, nullable, required: Note author, or null if the author can no longer be resolved
      - `id` string, uuid, required
      - `name` string, required
      - `email` string, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required

## Other responses

- `401`: Unauthorized - missing or invalid API key
- `404`: Note not found
- `422`: Validation error - the request failed schema validation (`errors.fieldErrors`) or a business rule (`errors.formErrors`)
- `429`: Too many requests - the caller has exceeded the per-agency rate limit for the tier this endpoint counts against (default per minute: 1200 read / 400 write / 60 upload). Inspect the `RateLimit-*` headers — returned on every response, not only on 429s — and back off until the window resets. See the "Rate limits" section of the introduction for details.
- `500`: Internal server error

## Changes

- **2026-11-03** `158ee454751c`: 1 warning
  - added the new `undefined` enum value to the `data/phoneCallOutcome` response property for the response status `200`
- **2026-10-16** `2c0c6a89d8e7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/recruitwithatlas/apis/atlas-api/changes/api/v1/people/notes/:noteId/patch.md)

---

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