Reference

API reference

A REST API over your notes, drafts, literature notes and media. JSON in, JSON out, one token.

The REST API gives you full read and write access to the same data your account has inside the app. Every endpoint lives under https://thinkernotes.com/api/v1, accepts and returns JSON, and is scoped to the account that owns the token, so there's no way for a token to see or change another user's data.

Authentication

Send your API token as a bearer header on every request. See Getting started to create one.

Header
Authorization: Bearer tn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Notes

The core content type: a single atomic idea, with text and tags. It's called Insight inside the app, and note everywhere in the API.

MethodPathDescription
GET/notesList notes, most recent first. Add ?query= to search text and tags, ?limit= to cap results (default 10, max 50).
GET/notes/:idFetch one note's full text, tags and linked note ids.
POST/notesCreate a note.
PATCH/notes/:idUpdate a note's text or tags.
DELETE/notes/:idDelete a note.

Create and update take a note object:

FieldTypeRequiredDescription
textstringYesThe note's content, at least 10 characters.
tagsarray of stringsNoReplaces the note's tags.
curl https://thinkernotes.com/api/v1/notes \
  -H "Authorization: Bearer tn_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "note": { "text": "The obstacle is the way", "tags": ["stoicism"] } }'

A note, as returned by GET /notes/:id, POST /notes or PATCH /notes/:id:

Note
{
  "id": 42,
  "text": "The obstacle is the way",
  "tags": ["stoicism"],
  "created_at": "2026-08-02T10:14:00Z",
  "linked_note_ids": []
}

GET /notes returns the same shape without linked_note_ids, as an array, with text truncated into an excerpt field.

Drafts

Quick, unstructured inbox notes, the raw material before it becomes a note.

MethodPathDescription
GET/draftsList drafts, most recent first. ?query= and ?limit= supported.
GET/drafts/:idFetch one draft's full text.
POST/draftsCreate a draft. Body: { "draft": { "text": "..." } }.
PATCH/drafts/:idUpdate a draft's text.
DELETE/drafts/:idDelete a draft.

Literature notes

Notes taken against a piece of media, like a book, an article or a podcast.

MethodPathDescription
GET/literature_notesList literature notes, most recent first. ?query= and ?limit= supported.
GET/literature_notes/:idFetch one literature note's full text.
POST/literature_notesCreate a literature note. Body: { "literature_note": { "text": "...", "media_id": 1 } }. The media_id has to belong to you.
PATCH/literature_notes/:idUpdate the text or re-attach to a different media item.
DELETE/literature_notes/:idDelete a literature note.

Media

A source you're taking literature notes on, like a book, an article or a podcast.

MethodPathDescription
GET/mediaList media, most recent first. ?query= matches title and author, ?limit= caps results.
GET/media/:idFetch one media item.
POST/mediaCreate a media item.
PATCH/media/:idUpdate a media item.
DELETE/media/:idDelete a media item.

Create and update take a media object:

FieldTypeRequiredDescription
titlestringYesMust be unique within your account.
authorstringNo
kindstringNoOne of book, podcast, article, other. Defaults to book.
statusstringNoOne of not_started, in_progress, finished.
urlstringNo

Errors

StatusCause
401 UnauthorizedMissing or invalid bearer token
404 Not FoundThe record doesn't exist, or belongs to another account
422 Unprocessable EntityValidation failed, the response body has an errors array
204 No ContentA DELETE succeeded

Want read-only, assistant-facing access instead of full read and write? Take a look at the MCP server. Same data, just no write tools.