---
title: "Replace bounded shared project notes without losing concurrent edits"
method: PUT
path: "/v1/projects/{project_id}/context/notes"
---

# Replace bounded shared project notes without losing concurrent edits

`PUT /v1/projects/{project_id}/context/notes`

## Request

- Base URL: `https://app.ohmyho.st`
- URL: `https://app.ohmyho.st/v1/projects/{project_id}/context/notes`
- Auth: HTTP bearer

Requires project write access. Read context first and pass notes.version as expected_version (zero for a new document). Maximum 250 lines and 16384 UTF-8 bytes; line endings normalize to LF. Empty Markdown clears notes. Never store secrets, logs or signed access URLs. Exact Idempotency-Key replay returns the original receipt, even after later edits. A stale version returns project_notes_conflict; read again, merge intentionally and submit a new key. Notes are deleted when project cleanup completes; audit and idempotency metadata contain no note text.

## Path parameters

- `project_id` string, required

## Headers

- `X-Request-Id` string
- `Idempotency-Key` string, required

## Request body

- object
  - `markdown` string, required
  - `expected_version` integer, required

## Response `200`

Saved or exactly replayed version receipt. Read context for current text.

- ProjectNotesReceipt
  - `version` integer, required
  - `updated_at` string, date-time, required

## Other responses

- `400`: The request failed.
- `401`: The request failed.
- `404`: The resource does not exist or is not visible to the authenticated principal.
- `409`: The request failed.
- `429`: The request failed.
- `503`: The request failed.

---

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