> For the complete documentation index, see [llms.txt](https://docs.monolithforensics.com/monolith/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.monolithforensics.com/monolith/monolith-api/notes-api/append-note.md).

# Append Note

Add HTML to the end of an existing note without replacing its current content. This is the safest way for automations (log shippers, tool integrations, scheduled jobs) to add entries to a running note — there is no read-modify-write race with other writers. Each append records a new entry in the note's version history.

```http
PATCH /v1/notes/{uuid}/append
Content-Type: application/json
```

## Path parameters

| Parameter | Description                    |
| --------- | ------------------------------ |
| `uuid`    | UUID of the note to append to. |

## Request body

| Field       | Type          | Required | Description                                                                                    |
| ----------- | ------------- | -------- | ---------------------------------------------------------------------------------------------- |
| `note_data` | string (HTML) | **yes**  | HTML fragment appended to the end of the note body. Normalized through the rich-text renderer. |

### Example request

```json
{
  "note_data": "<p><strong>14:32 UTC</strong> — Imaging completed. SHA-256 verified.</p>"
}
```

## Response — `200 OK`

Returns the full updated note, including the combined body (same shape as [get-notes.md](broken://pages/12ad796747edec1897569c385a42baf8c9738cd4)):

```json
{
  "data": {
    "case_note_id": 119,
    "uuid": "0f8fad5b-d9cb-469f-a165-70867728950e",
    "note_tag": "Imaging Log",
    "note_data": "<p>Imaging started at 13:05 UTC.</p><p><strong>14:32 UTC</strong> — Imaging completed. SHA-256 verified.</p>",
    "path": "/Imaging Log",
    "parent_id": null,
    "is_folder": false,
    "created_on": "2026-08-03T13:05:00.000Z",
    "updated_on": "2026-08-03T14:32:11.000Z",
    "attachments": [],
    "linked_case": { "case_id": 42, "uuid": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" },
    "linked_object": null,
    "created_by": { "user_id": 12, "email": "api-user@example.com", "first_name": "API", "last_name": "User", "full_name": "API User", "title": "Integration" },
    "updated_by": { "user_id": 12, "email": "api-user@example.com", "first_name": "API", "last_name": "User", "full_name": "API User", "title": "Integration" }
  }
}
```

## Examples

### Append a timestamped log entry

```python
from datetime import datetime, timezone

stamp = datetime.now(timezone.utc).strftime("%H:%M UTC")
response = session.patch(
    f"{BASE_URL}/notes/0f8fad5b-d9cb-469f-a165-70867728950e/append",
    json={"note_data": f"<p><strong>{stamp}</strong> — Verification hash matched.</p>"},
)
response.raise_for_status()
```

### Stream tool output into a case note

```python
def append_tool_output(session, note_uuid, tool_name, lines):
    """Append a block of tool output to a note as preformatted text."""
    import html
    body = "".join(f"{html.escape(line)}\n" for line in lines)
    session.patch(f"{BASE_URL}/notes/{note_uuid}/append", json={
        "note_data": f"<h3>{tool_name}</h3><pre>{body}</pre>",
    }).raise_for_status()

append_tool_output(session, note_uuid, "ewfverify", [
    "Verify started",
    "MD5 hash calculated over data: 9e107d9d372bb6826bd81d3542a419d6",
    "ewfverify: SUCCESS",
])
```

## Errors

| Status | Body                                                   | Cause                         |
| ------ | ------------------------------------------------------ | ----------------------------- |
| `400`  | `{"message": "Invalid request body", "errors": [...]}` | Missing or empty `note_data`. |
| `404`  | `{"message": "Note not found"}`                        | No note with that UUID.       |
| `401`  | `Unauthorized`                                         | Missing or invalid API key.   |
