> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Readwise

The Readwise connector lets your AI agent act in each user's Readwise account. Each user connects their own Readwise API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 27 tools.

**Authentication:** API Key
**Categories:** Productivity
**Tools:** 27: 11 read, 12 write, 4 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=READWISE)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Readwise connection

   In **AgentKit > Connections**, create a Readwise connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'readwise'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Readwise:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'readwise_check_auth',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "readwise"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Readwise:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="readwise_check_auth",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Readwise credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'readwise_check_auth',
  toolInput: {},
  connector: 'readwise',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="readwise_check_auth",
    tool_input={},
    connection_name="readwise",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `readwise_check_auth`

Check Authentication · Read-only

Verify that the connected Readwise access token is valid.
Returns an empty response with HTTP 204 when the token is valid and an auth error otherwise.
Use it to diagnose authentication failures before calling other tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `readwise_export_highlights`

Export Highlights · Read-only

Export the user's books, articles and podcasts with all of their highlights nested inside.
Returns count, nextPageCursor and results; each result has user_book_id, title, author, category, source, tags and a highlights array with text, note, location, color and tags.
Use it to pull everything in one pass or only what changed since updatedAfter. Use list_highlights for a flat, filterable list of highlights and list_books for sources without highlights.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ids` (`string`, optional): Comma-separated list of user_book_ids; returns all highlights for only these books. Example: 123,456.
- `includeDeleted` (`boolean`, optional): Set true to include deleted highlights so you can sync deletions. Omit to exclude them.
- `pageCursor` (`string`, optional): The nextPageCursor value from a previous response, used to fetch the next page. Omit on the first request.
- `updatedAfter` (`string`, optional): Only return highlights updated after this ISO 8601 datetime (UTC). Use the time of your last sync for incremental pulls. Example: 2024-01-01T00:00:00Z.

Example input: `{}`

### `readwise_get_book`

Get Book · Read-only

Retrieve one book, article, tweet or podcast by id.
Returns id, title, author, category, source, num_highlights, last_highlight_at, updated, cover_image_url, highlights_url, source_url, asin, tags and document_note.
Use it when you already have a book id. Use list_books to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.

Example input: `{"book_id":1776}`

### `readwise_get_daily_review`

Get Daily Review · Read-only

Fetch the highlights in the user's latest Readwise daily review.
Returns review_id, review_url, review_completed and a highlights array with text, title, author, note, location and id. Responds 404 with detail Review not found when no daily review exists.
Use it to surface today's resurfaced highlights. Use complete_daily_review to mark the review done.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `readwise_get_highlight`

Get Highlight · Read-only

Retrieve one highlight by id.
Returns id, text, note, location, location_type, highlighted_at, created_at, url, color, updated, book_id, external_id, tags, end_location and readwise_url.
Use it when you already have a highlight id. Use list_highlights to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.

Example input: `{"highlight_id":59758950}`

### `readwise_list_book_tags`

List Book Tags · Read-only

List the tags attached to one book, article or podcast.
Returns count, next, previous and results; each result has the tag id and name.
Use it to see a book's tags or to get a tag id for update or delete. Use list_highlight_tags for a highlight's tags.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Increase it to walk through paginated tags; the response's next field links to the following page. Example: 2.
- `page_size` (`integer`, optional): Number of tags to return per page. Defaults to 100 when omitted, maximum 1000. Example: 50.

Example input: `{"book_id":1776}`

### `readwise_list_books`

List Books · Read-only

List the user's sources (books, articles, tweets, podcasts and supplementals) with highlight counts.
Returns count, next, previous and results; each result has id, title, author, category, source, num_highlights, last_highlight_at, updated, cover_image_url, highlights_url, source_url, asin and tags.
Use it to browse sources or find a book id. Use list_highlights with book_id for the highlights themselves. This endpoint is limited to 20 requests per minute.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category` (`string`, optional): Return only sources in this category. One of books, articles, tweets, supplementals or podcasts. One of: `books`, `articles`, `tweets`, `supplementals`, `podcasts`.
- `last_highlight_at__gt` (`string`, optional): Only sources whose last highlight was taken after this ISO 8601 datetime. Some sources have no value. Example: 2024-01-01T00:00:00Z.
- `last_highlight_at__lt` (`string`, optional): Only sources whose last highlight was taken before this ISO 8601 datetime. Some sources have no value. Example: 2024-06-01T00:00:00Z.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Increase it to walk through paginated books; the response's next field links to the following page. Example: 2.
- `page_size` (`integer`, optional): Number of books to return per page. Defaults to 100 when omitted, maximum 1000. Example: 50.
- `source` (`string`, optional): Return only sources imported from this origin. Example: kindle.
- `updated__gt` (`string`, optional): Only sources last updated after this ISO 8601 datetime. Example: 2024-01-01T00:00:00Z.
- `updated__lt` (`string`, optional): Only sources last updated before this ISO 8601 datetime. Example: 2024-06-01T00:00:00Z.

Example input: `{}`

### `readwise_list_highlight_tags`

List Highlight Tags · Read-only

List the tags attached to one highlight.
Returns count, next, previous and results; each result has the tag id and name.
Use it to see a highlight's tags or to get a tag id for update or delete. Use list_book_tags for a book's tags.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Increase it to walk through paginated tags; the response's next field links to the following page. Example: 2.
- `page_size` (`integer`, optional): Number of tags to return per page. Defaults to 100 when omitted, maximum 1000. Example: 50.

Example input: `{"highlight_id":59758950}`

### `readwise_list_highlights`

List Highlights · Read-only

List the user's highlights as a flat, paginated list, optionally filtered by book or by time.
Returns count, next, previous and results; each result has id, text, note, location, location_type, highlighted_at, color, book_id, tags and readwise_url.
Use it to browse or filter highlights. Use export_highlights to get highlights grouped under their books, and get_highlight for one highlight by id. This endpoint is limited to 20 requests per minute.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, optional): Return only highlights of this book. Get book ids from list_books. Example: 1337.
- `highlighted_at__gt` (`string`, optional): Only highlights taken after this ISO 8601 datetime. Some highlights have no highlighted_at value. Example: 2020-02-01T21:35:53Z.
- `highlighted_at__lt` (`string`, optional): Only highlights taken before this ISO 8601 datetime. Some highlights have no highlighted_at value. Example: 2024-06-01T00:00:00Z.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Increase it to walk through paginated highlights; the response's next field links to the following page. Example: 2.
- `page_size` (`integer`, optional): Number of highlights to return per page. Defaults to 100 when omitted, maximum 1000. Example: 50.
- `updated__gt` (`string`, optional): Only highlights last updated after this ISO 8601 datetime. Example: 2024-01-01T00:00:00Z.
- `updated__lt` (`string`, optional): Only highlights last updated before this ISO 8601 datetime. Example: 2024-06-01T00:00:00Z.

Example input: `{}`

### `readwise_reader_list_documents`

List Reader Documents · Read-only

List documents in the user's Reader library, with filters for location, category, tag and update time.
Returns count, nextPageCursor and results; each result has id, url, source_url, title, author, category, location, tags, word_count, reading_progress, notes, summary and saved_at. Highlights and notes appear as documents with parent_id set.
Use it to browse or sync Reader, or to fetch one document by id. Use reader_list_tags to see tag keys. Limited to 20 requests per minute.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category` (`string`, optional): Document category. One of article, email, rss, highlight, note, pdf, epub, tweet, video. One of: `article`, `email`, `rss`, `highlight`, `note`, `pdf`, `epub`, `tweet`, `video`.
- `id` (`string`, optional): Return only the document with this id, if found. Example: 01gwfvp9pyaabcdgmx14f6ha0.
- `limit` (`integer`, optional): Maximum number of documents to return, between 1 and 100. Defaults to 100. Example: 25.
- `location` (`string`, optional): Return only documents in this location. One of new, later, shortlist, archive, feed. If the user has not enabled that location in Reader settings, their default location is used. One of: `new`, `later`, `shortlist`, `archive`, `feed`.
- `pageCursor` (`string`, optional): The nextPageCursor value from a previous response, used to fetch the next page. Omit on the first request.
- `tag` (`string`, optional): A tag key to filter by, as returned by reader_list_tags. Example: reading-list.
- `updatedAfter` (`string`, optional): Only documents updated after this ISO 8601 datetime (UTC). Example: 2024-01-01T00:00:00Z.
- `withHtmlContent` (`boolean`, optional): Set true to include the html_content field in each document. This can slow the request slightly.
- `withRawSourceUrl` (`boolean`, optional): Set true to include raw_source_url, a link to the raw source file that is valid for one hour. Empty for non-distributable documents.

Example input: `{}`

### `readwise_reader_list_tags`

List Reader Tags · Read-only

List all tags used on the user's Reader documents.
Returns count, nextPageCursor and results; each result has a tag key and display name.
Use it to find tag keys for the tag filter in reader_list_documents. Use list_book_tags or list_highlight_tags for Readwise library tags. Limited to 20 requests per minute.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pageCursor` (`string`, optional): The nextPageCursor value from a previous response, used to fetch the next page. Omit on the first request.

Example input: `{}`

### `readwise_complete_daily_review`

Complete Daily Review · Write

Mark the user's current Readwise daily review as complete.
Returns review_id and review_completed set to true.
Use it after the highlights from get_daily_review have been shown to the user.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs: none.

Example input: `{}`

### `readwise_create_book_tag`

Create Book Tag · Write

Add a tag to a book, article or podcast.
Returns the tag with its id and name.
Use it to tag a whole source. Use create_highlight_tag to tag a single highlight.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.
- `name` (`string`, required): Name of the tag. Maximum 512 characters. Example: philosophy.

Example input: `{"book_id":1776,"name":"<name>"}`

### `readwise_create_highlight_tag`

Create Highlight Tag · Write

Add a tag to a highlight.
Returns the tag with its id and name.
Use it to tag a single highlight. Use create_book_tag to tag a whole book.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.
- `name` (`string`, required): Name of the tag. Maximum 127 characters. Example: philosophy.

Example input: `{"highlight_id":59758950,"name":"<name>"}`

### `readwise_create_highlights`

Create Highlights · Write

Save one or more highlights, with their source book, article or podcast, to the user's Readwise library.
Returns the list of created or updated sources, each with its id, title, num_highlights and modified_highlights (the ids of the highlights this request created or updated).
Use it to add or upsert highlights from your own app. Readwise de-duplicates by title, author, text and source_url, and updates a highlight when the same highlight_url is sent with new text. Use update_highlight to edit a highlight by id.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `highlights` (`array`, required): Array of highlight objects to save, 1 or more, from the same or different sources. Each needs text; title, author, source_url, source_type, category, note, location, location_type, highlighted_at, highlight_url and image_url are optional. Example: [{"text": "Call me Ishmael", "title": "Moby Dick", "author": "Herman Melville", "category": "books"}].

Example input: `{"highlights":[{"text":"Call me Ishmael","title":"Moby Dick","author":"Herman Melville","category":"books"}]}`

### `readwise_reader_bulk_update_documents`

Bulk Update Reader Documents · Write

Update up to 50 Reader documents in one request, each with its own fields.
Returns a results array with an id and success flag per item, plus an error message on failures. The status is 200 when all succeed and 207 when some items fail.
Use it to archive, tag or move many documents at once. Use reader_update_document for a single document. Limited to 20 requests per minute.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `updates` (`array`, required): Array of up to 50 update objects. Each needs the document id and any of title, author, summary, language, published_date, image_url, seen, location, category, tags and notes; tags replace all existing tags. Example: [{"id": "abc123", "location": "archive", "seen": true}, {"id": "def456", "tags": ["reading-list"]}].

Example input: `{"updates":[]}`

### `readwise_reader_create_highlight`

Create Reader Highlight · Write

Create a highlight, with an optional note and tags, on a document already saved in Reader.
Returns the new highlight's id and its Reader url. The request fails with 400 and creates nothing when content is not found in the document.
Use it to highlight text in a Reader document. Use create_highlights to add highlights to the Readwise library from an outside source.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content` (`string`, required): The passage to highlight, exactly as it reads in the parent document's content. Fetch the content with reader_list_documents and with_html_content set to true. Example: the passage, exactly as it appears in the document.
- `parent_id` (`string`, required): ID of the Reader document to highlight. Example: 01gwfvp9pyaabcdgmx14f6ha0.
- `notes` (`string`, optional): A note to attach to the highlight. Example: Great point about incentives.
- `tags` (`array`, optional): List of tag names to attach to the highlight. Example: ["reading-list", "ai"].

Example input: `{"content":"<content>","parent_id":"<parent_id>"}`

### `readwise_reader_save_document`

Save Document to Reader · Write

Save a URL, or your own HTML, to the user's Reader library as a new document.
Returns the document id and its Reader url; the status is 201 for a new document and 200 when it already exists.
Use it to add articles, PDFs or any web page to Reader. Use reader_create_highlight to highlight text in a document that is already saved. Limited to 50 requests per minute.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `url` (`string`, required): The document's unique URL. If you have none, use a made-up value such as https://yourapp.com#document1. Example: https://example.com/article/.
- `author` (`string`, optional): Author of the document; overrides the author found while parsing. Example: Paul Graham.
- `category` (`string`, optional): Document category. One of article, email, rss, pdf, epub, tweet, video. One of: `article`, `email`, `rss`, `pdf`, `epub`, `tweet`, `video`.
- `html` (`string`, optional): The document content as valid HTML. When omitted, Reader scrapes the URL to fetch the content. Example: <div><h1>Title</h1>Content
</div>.
- `image_url` (`string`, optional): URL of an image to use as the cover image. Example: https://example.com/cover.png.
- `language` (`string`, optional): Language code of the document, such as en, de or en-US. Reader auto-detects it when omitted and uses it for text-to-speech.
- `location` (`string`, optional): Initial location of the document. Defaults to new. One of new, later, archive, feed. If the user has not enabled that location in Reader settings, their default location is used. One of: `new`, `later`, `archive`, `feed`.
- `notes` (`string`, optional): A top-level note on the document. Example: Read before Friday's meeting.
- `published_date` (`string`, optional): When the document was published, as an ISO 8601 datetime (UTC by default). Example: 2020-07-14T20:11:24+00:00.
- `saved_using` (`string`, optional): Label for the source that saved the document, such as the name of your app. Example: my_app.
- `should_clean_html` (`boolean`, optional): Only valid when html is provided. Set true to have Reader clean the HTML and parse the title and author. Defaults to false.
- `summary` (`string`, optional): Short summary of the document. Example: An essay on finding work you love.
- `tags` (`array`, optional): List of tag names to attach to the document. Example: ["reading-list", "ai"].
- `title` (`string`, optional): Title of the document; overrides the title found while parsing. Example: How to Do What You Love.

Example input: `{"url":"<url>"}`

### `readwise_reader_update_document`

Update Reader Document · Write

Update fields on a Reader document, such as its title, location, tags, notes or seen state.
Returns the document id and its Reader url. Omitted fields stay unchanged; on a highlight only notes and tags are accepted.
Use it to edit or move one document, for example to archive it. Use reader_bulk_update_documents to change many at once. Limited to 50 requests per minute.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `document_id` (`string`, required): ID of the Reader document, as returned by reader_list_documents or reader_save_document. Example: 01gwfvp9pyaabcdgmx14f6ha0.
- `author` (`string`, optional): New author of the document. Example: Paul Graham.
- `category` (`string`, optional): Document category. One of article, email, rss, highlight, note, pdf, epub, tweet, video. One of: `article`, `email`, `rss`, `highlight`, `note`, `pdf`, `epub`, `tweet`, `video`.
- `image_url` (`string`, optional): URL of the cover image. Example: https://example.com/cover.png.
- `language` (`string`, optional): Language code of the document, such as en, de or en-US.
- `location` (`string`, optional): Move the document to this location. One of new, later, archive, feed. If the user has not enabled that location in Reader settings, their default location is used. One of: `new`, `later`, `archive`, `feed`.
- `notes` (`string`, optional): Text that replaces the document's current note, or a highlight's note. Send an empty string to clear it. Example: Follow up next week.
- `published_date` (`string`, optional): Publication datetime as ISO 8601 (UTC by default). Example: 2020-07-14T20:11:24+00:00.
- `seen` (`boolean`, optional): Set true to mark the document as seen, which fills first_opened_at and last_opened_at, or false to mark it unseen and clear them.
- `summary` (`string`, optional): New summary of the document. Example: An essay on finding work you love.
- `tags` (`array`, optional): List of tag names to set on the document, replacing its current tags. Example: ["reading-list", "ai"].
- `title` (`string`, optional): New title of the document. Example: Updated title.

Example input: `{"document_id":"<document_id>"}`

### `readwise_update_book`

Update Book · Write

Override the title, author or category of a book, article or podcast.
Returns the updated book with id, title, author, category, num_highlights and cover_image_url.
Use it to correct source metadata. Send only the fields to change. Cover image upload is not supported by this tool.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.
- `author_override` (`string`, optional): A new author shown in place of the original author. Example: Jacob Lund Fisker.
- `category` (`string`, optional): New category of the source. One of books, articles, tweets or podcasts. One of: `books`, `articles`, `tweets`, `podcasts`.
- `title_override` (`string`, optional): A new title shown in place of the original title. Example: Early Retirement Extreme: A Guide.

Example input: `{"book_id":1776}`

### `readwise_update_book_tag`

Update Book Tag · Write

Rename a tag on a book, article or podcast.
Returns the updated tag with its id and name.
Use it to change a tag's text; get the tag id from list_book_tags.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.
- `name` (`string`, required): Name of the tag. Maximum 512 characters. Example: philosophy.
- `tag_id` (`integer`, required): ID of the tag, as returned by the list tags tool for this highlight or book. Example: 11311390.

Example input: `{"book_id":1776,"name":"<name>","tag_id":11311390}`

### `readwise_update_highlight`

Update Highlight · Write

Update the text, note, location, url or color of an existing highlight.
Returns the updated highlight with id, text, note, location, color, book_id, tags and readwise_url.
Use it to edit a highlight by id. Send only the fields to change. Use create_highlights to add new highlights.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.
- `color` (`string`, optional): Color tag of the highlight. One of yellow, blue, pink, orange, green or purple. One of: `yellow`, `blue`, `pink`, `orange`, `green`, `purple`.
- `location` (`integer`, optional): New position of the highlight in the source, used to order highlights. Example: 57.
- `note` (`string`, optional): New annotation note for the highlight. Example: This makes me think of Marcus Aurelius.
- `text` (`string`, optional): New text of the highlight. Example: To be alone for any length of time is to shed an outer skin.
- `url` (`string`, optional): Unique URL of the specific highlight, such as one tweet or podcast snippet. Example: https://example.com/post#h1.

Example input: `{"highlight_id":59758950}`

### `readwise_update_highlight_tag`

Update Highlight Tag · Write

Rename a tag on a highlight.
Returns the updated tag with its id and name.
Use it to change a tag's text; get the tag id from list_highlight_tags.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.
- `name` (`string`, required): Name of the tag. Maximum 127 characters. Example: philosophy.
- `tag_id` (`integer`, required): ID of the tag, as returned by the list tags tool for this highlight or book. Example: 11311390.

Example input: `{"highlight_id":59758950,"name":"<name>","tag_id":11311390}`

### `readwise_delete_book_tag`

Delete Book Tag · Destructive

Remove a tag from a book, article or podcast.
Returns an empty response with HTTP 204 on success.
Use it to untag a source; get the tag id from list_book_tags.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `book_id` (`integer`, required): ID of the book, article or podcast, as returned by list_books. Example: 1776.
- `tag_id` (`integer`, required): ID of the tag, as returned by the list tags tool for this highlight or book. Example: 11311390.

Example input: `{"book_id":1776,"tag_id":11311390}`

### `readwise_delete_highlight`

Delete Highlight · Destructive

Permanently delete a highlight by id.
Returns an empty response with HTTP 204 on success.
Use it only when the user wants the highlight removed. Use update_highlight to change it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.

Example input: `{"highlight_id":59758950}`

### `readwise_delete_highlight_tag`

Delete Highlight Tag · Destructive

Remove a tag from a highlight.
Returns an empty response with HTTP 204 on success.
Use it to untag a highlight; get the tag id from list_highlight_tags.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `highlight_id` (`integer`, required): ID of the highlight, as returned by list_highlights or export_highlights. Example: 59758950.
- `tag_id` (`integer`, required): ID of the tag, as returned by the list tags tool for this highlight or book. Example: 11311390.

Example input: `{"highlight_id":59758950,"tag_id":11311390}`

### `readwise_reader_delete_document`

Delete Reader Document · Destructive

Permanently delete a Reader document, including its highlights and their notes.
Returns an empty response with HTTP 204 on success.
Use it only when the user wants the document gone; use reader_update_document with location archive to keep it. Deleting a highlight also deletes its note. Limited to 20 requests per minute.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `document_id` (`string`, required): ID of the Reader document, as returned by reader_list_documents or reader_save_document. Example: 01gwfvp9pyaabcdgmx14f6ha0.

Example input: `{"document_id":"<document_id>"}`

## Related

Other Productivity connectors ([all 144](/agentkit/connectors/?category=productivity)):

- [Slack](/agentkit/connectors/slack/): Scalekit connector, OAuth, 96 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
