New frontmatter'd docs with real shapes (sqlc models pinned directly):
- bookmarks: get/create/update/delete (sync-aware rows: dedup_key,
last_modified_*, tombstones; delete is 204)
- review: upsert (empty string DELETES the review) / get (200 with
{review:null} when absent) / delete
- get single note + highlight (full sqlc row shapes)
- annotation history: restore (POST, kind via query or body) and purge
(DELETE, kind via required query; permanent)
Gate hardening forced by this batch:
- required-field walk now guards non-struct Request types (RawMessage pins)
- update_media_bookmark needed a full example block (no cross-reference
shortcuts — the gate checks every doc standalone)
1.2 KiB
1.2 KiB
method, path, auth, area
| method | path | auth | area |
|---|---|---|---|
| GET | /api/media-items/:id/notes/:noteId | jwt | media-items |
Get Media Note
Returns one note by id.
Example response
{
"id": "330e8400-e29b-41d4-a716-446655440000",
"media_item_id": "550e8400-e29b-41d4-a716-446655440000",
"user_id": "92413c3a-e1b8-4fff-b3f9-95c74478d19a",
"content": "Key theme here.",
"position": "kobo:3.1",
"created_at": "2026-10-24T13:57:01Z",
"updated_at": "2026-10-24T13:57:01Z",
"percentage_location": 42.0,
"character_start": null,
"character_end": null,
"epubcfi_location": null,
"chapter_reference": 3,
"paragraph_reference": null,
"device_sync_data": null,
"dedup_key": "kobo:3.1",
"last_modified_at": "2026-10-24T13:57:01Z",
"last_modified_source": "web",
"deleted": false,
"deleted_at": null
}
device_sync_data is []byte → base64 string when set.
Errors
| Status | Body | When |
|---|---|---|
| 400 | {"error": "invalid note id"} |
malformed id |
| 404 | {"error": "note not found"} |
no such note |
| 500 | {"error": "..."} |
unexpected server error |