Readwise API

Readwise API as documented publicly: 14 operations. Contract generated from the documentation by API Evangelist (2026-10-28); not the provider's own document.

Operations 14

POST /api/v2/highlights POST /api/v2/highlights #
GET /api/v2/highlights/ Returns a list of highlights with pagination metadata, supporting filtering and querying options. #
GET /api/v2/review GET /api/v2/review #
POST /api/v2/review/complete POST /api/v2/review/complete #
PATCH /api/v3/bulk_update PATCH /api/v3/bulk_update #
PATCH /api/v3/bulk_update/ Update multiple documents in a single request. #
DELETE /api/v3/delete/0000ffff2222eeee3333dddd4444 DELETE /api/v3/delete/0000ffff2222eeee3333dddd4444 #
GET /api/v3/list GET /api/v3/list #
GET /api/v3/list/ Fetch your documents. #
POST /api/v3/save POST /api/v3/save #
POST /api/v3/save/ Save new documents to Reader and create highlights. #
GET /api/v3/tags GET /api/v3/tags #
GET /api/v3/tags/ Retrieve all tags available. #
PATCH /api/v3/update/0000ffff2222eeee3333dddd4444 PATCH /api/v3/update/0000ffff2222eeee3333dddd4444 #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/readwise:readwise-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

readwise-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Readwise API
  version: '2026-10-28'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-10-28: 14 operation(s) read from 2 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; Readwise has published no machine-readable contract that the
    pipeline could find. Engine: anthropic.'
  x-evidence-tiers:
    code-example: 9
    documentation: 5
    pages-with-code: 2
    pages-read: 2
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-10-28'
  x-generator: generate-contract-from-docs.py
  x-engine: anthropic
  x-sources:
  - https://readwise.io/reader_api
  - https://readwise.io/api_deets
paths:
  /api/v2/highlights:
    post:
      operationId: post_api_v2_highlights
      tags:
      - Api
      summary: POST /api/v2/highlights
      x-source: https://readwise.io/api_deets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV2HighlightsRequest'
      responses:
        '201':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV2HighlightsResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl --request POST --url https://readwise.io/api/v2/highlights/  -H 'Authorization: Token XXX' -H 'Content-Type: application/json'\
          \  --data '{\"highlights\":[{\"text\": \"Call me Ishmael\",\"title\": \"Moby Dick\",\"author\": \"Herman Melville\"}]}'\n Highlight\
          \ EXPORT \n If you want to pull all of the highlights from a user's account into your service (eg notetaking apps, backups, etc) this\
          \ endpoint is all you ne"
  /api/v2/highlights/:
    get:
      operationId: get_api_v2_highlights
      tags:
      - Api
      summary: Returns a list of highlights with pagination metadata, supporting filtering and querying options.
      x-source: https://readwise.io/api_deets
      parameters:
      - name: page_size
        in: query
        required: false
        schema:
          type: integer
        description: Specify number of results per page (default is 100, max is 1000)
      - name: page
        in: query
        required: false
        schema:
          type: integer
        description: Specify the pagination counter
      - name: book_id
        in: query
        required: false
        schema:
          type: integer
        description: Return highlights of a specified book
      - name: updated__lt
        in: query
        required: false
        schema:
          type: string
        description: Filter by last updated datetime (less than)
      - name: updated__gt
        in: query
        required: false
        schema:
          type: string
        description: Filter by last updated datetime (greater than)
      - name: highlighted_at__lt
        in: query
        required: false
        schema:
          type: string
        description: Filter by the time when highlight was taken (NOTE that some highlights may not have value set)
      - name: highlighted_at__gt
        in: query
        required: false
        schema:
          type: string
        description: Filter by the time when highlight was taken (NOTE that some highlights may not have value set)
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV2HighlightsResponse'
      x-evidence:
        kind: documentation
  /api/v2/review:
    get:
      operationId: get_api_v2_review
      tags:
      - Api
      summary: GET /api/v2/review
      x-source: https://readwise.io/api_deets
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV2ReviewResponse'
      x-evidence:
        kind: code-example
        language: javascript
        snippet: "fetch('https://readwise.io/api/v2/review/', {\n method: 'GET',\n headers: {\n Authorization: `Token ${token}`,\n },\n })"
  /api/v2/review/complete:
    post:
      operationId: post_api_v2_review_complete
      tags:
      - Api
      summary: POST /api/v2/review/complete
      x-source: https://readwise.io/api_deets
      responses:
        '201':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV2ReviewCompleteResponse'
      x-evidence:
        kind: code-example
        language: javascript
        snippet: "fetch('https://readwise.io/api/v2/review/complete/', {\n method: 'POST',\n headers: {\n Authorization: `Token ${token}`,\n },\n\
          \ })"
  /api/v3/bulk_update:
    patch:
      operationId: patch_api_v3_bulk_update
      tags:
      - Api
      summary: PATCH /api/v3/bulk_update
      x-source: https://readwise.io/reader_api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchApiV3BulkUpdateRequest'
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PatchApiV3BulkUpdateResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/bulk_update/ -H \"Authorization: Token XXX\" -X PATCH -d '{\"updates\": [{\"id\": \"abc123\"\
          , \"location\": \"archive\"}, {\"id\": \"def456\", \"seen\": true}]}' -H \"Content-Type: application/json\"\n Document DELETE \n Request\
          \ : DELETE to https://readwise.io/api/v3/delete/<document_id>/ \n Deleting a document also deletes its highlights and their notes, and\
          \ deleting a highlight also "
  /api/v3/bulk_update/:
    patch:
      operationId: patch_api_v3_bulk_update
      tags:
      - Api
      summary: Update multiple documents in a single request.
      x-source: https://readwise.io/reader_api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchApiV3BulkUpdateRequest2'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PatchApiV3BulkUpdateResponse2'
      x-evidence:
        kind: documentation
  /api/v3/delete/0000ffff2222eeee3333dddd4444:
    delete:
      operationId: delete_api_v3_delete_0000ffff2222eeee3333dddd4444
      tags:
      - Api
      summary: DELETE /api/v3/delete/0000ffff2222eeee3333dddd4444
      x-source: https://readwise.io/reader_api
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteApiV3Delete0000Ffff2222Eeee3333Dddd4444Response'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/delete/0000ffff2222eeee3333dddd4444 -H \"Authorization: Token XXX\" -X DELETE\n Tag LIST\
          \ \n Request : GET to https://readwise.io/api/v3/tags/ \n Parameters: \n Usual query params: \n Key \n Type \n Description \n Required\
          \ \n pageCursor \n string \n A string returned by a previous request to this endpoint. Use it to get the next page of tags if there\
          \ are too many for one reque"
  /api/v3/list:
    get:
      operationId: get_api_v3_list
      tags:
      - Api
      summary: GET /api/v3/list
      x-source: https://readwise.io/reader_api
      parameters:
      - name: location
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Success (shape read from the example response on the page)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV3ListResponse'
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/list/?location=later -H \"Authorization: Token XXX\" -H \"Content-Type: application/json\"\
          \n Document UPDATE \n Use this API to update specific fields from the list below. Fields omitted from the request will remain unchanged.\
          \ \n On a highlight only notes and tags are accepted; any other key returns a 400 . Notes cannot be updated directly: update notes on\
          \ their highlig"
  /api/v3/list/:
    get:
      operationId: get_api_v3_list
      tags:
      - Api
      summary: Fetch your documents.
      x-source: https://readwise.io/reader_api
      parameters:
      - name: id
        in: query
        required: false
        schema:
          type: string
        description: The document's unique id. Using this parameter it will return just one document, if found.
      - name: updatedAfter
        in: query
        required: false
        schema:
          type: string
        description: Fetch only documents updated after this date (formatted as ISO 8601 date).
      - name: location
        in: query
        required: false
        schema:
          type: string
        description: 'The document''s location, could be one of: new, later, shortlist, archive, feed.'
      - name: category
        in: query
        required: false
        schema:
          type: string
        description: 'The document''s category, could be one of: article, email, rss, highlight, note, pdf, epub, tweet, video.'
      - name: tag
        in: query
        required: false
        schema:
          type: string
        description: The document's tag key. Pass up to 5 tag parameters to find documents having all the tags listed.
      - name: limit
        in: query
        required: false
        schema:
          type: integer
        description: The maximum number of documents to return, between 1 and 100. Default is 100.
      - name: pageCursor
        in: query
        required: false
        schema:
          type: string
        description: A string returned by a previous request to this endpoint. Use it to get the next page of documents.
      - name: withHtmlContent
        in: query
        required: false
        schema:
          type: boolean
        description: Include the html_content field in each document's data.
      - name: withRawSourceUrl
        in: query
        required: false
        schema:
          type: boolean
        description: Include the raw_source_url field in each document's data.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV3ListResponse2'
      x-evidence:
        kind: documentation
  /api/v3/save:
    post:
      operationId: post_api_v3_save
      tags:
      - Api
      summary: POST /api/v3/save
      x-source: https://readwise.io/reader_api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV3SaveRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/save/ -H \"Authorization: Token XXX\" -X POST -d '{\"url\": \"https://example.com/article/\"\
          , \"language\": \"de\"}' -H \"Content-Type: application/json\"\n Python, creating a highlight on an existing document \nimport requests\n\
          requests.post(\n url=\"https://readwise.io/api/v3/save/\",\n headers={\"Authorization\": \"Token XXX\"},\n json={\n \"parent_id\": \"\
          0000ffff2222eeee3333dddd4444\",\n"
  /api/v3/save/:
    post:
      operationId: post_api_v3_save
      tags:
      - Api
      summary: Save new documents to Reader and create highlights.
      x-source: https://readwise.io/reader_api
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV3SaveRequest2'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV3SaveResponse'
      x-evidence:
        kind: documentation
  /api/v3/tags:
    get:
      operationId: get_api_v3_tags
      tags:
      - Api
      summary: GET /api/v3/tags
      x-source: https://readwise.io/reader_api
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/tags/ -H \"Authorization: Token XXX\"\n Rate Limiting \n Requests are rate-limited per access\
          \ token. Each endpoint's specific rate limit is\n documented in its section above. When you exceed the limit, a 429 Too Many Requests\
          \ \n response is returned — check the Retry-After header for the number\n of seconds to wait.\n Webhooks \n Receive real-time notifications\
          \ about your"
  /api/v3/tags/:
    get:
      operationId: get_api_v3_tags
      tags:
      - Api
      summary: Retrieve all tags available.
      x-source: https://readwise.io/reader_api
      parameters:
      - name: pageCursor
        in: query
        required: false
        schema:
          type: string
        description: A string returned by a previous request to this endpoint. Use it to get the next page of tags.
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV3TagsResponse'
      x-evidence:
        kind: documentation
  /api/v3/update/0000ffff2222eeee3333dddd4444:
    patch:
      operationId: patch_api_v3_update_0000ffff2222eeee3333dddd4444
      tags:
      - Api
      summary: PATCH /api/v3/update/0000ffff2222eeee3333dddd4444
      x-source: https://readwise.io/reader_api
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchApiV3Update0000Ffff2222Eeee3333Dddd4444Request'
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -v https://readwise.io/api/v3/update/0000ffff2222eeee3333dddd4444 -H \"Authorization: Token XXX\" -X PATCH -d '{\"title\"\
          : \"Updated title\"}' -H \"Content-Type: application/json\"\n Document BULK UPDATE \n Use this API to update multiple documents in a\
          \ single request. Each item in the updates array can specify different fields to update. Fields omitted from an item will remain unchanged\
          \ for that docum"
components:
  schemas:
    PostApiV2HighlightsRequest:
      type: object
      properties:
        highlights:
          type: array
          items:
            type: object
            properties:
              text:
                type: string
              title:
                type: string
              author:
                type: string
    PostApiV2HighlightsResponse:
      type: object
      properties:
        count:
          type: integer
        nextPageCursor:
          type:
          - string
          - 'null'
        results:
          type: array
          items:
            type: object
            properties:
              user_book_id:
                type: integer
              is_deleted:
                type: boolean
              title:
                type: string
              author:
                type: string
              readable_title:
                type: string
              source:
                type: string
              cover_image_url:
                type: string
              unique_url:
                type: string
              book_tags:
                type: array
                items: {}
              category:
                type: string
              document_note:
                type: string
              summary:
                type: string
              readwise_url:
                type: string
              source_url:
                type: string
              external_id:
                type: string
              asin:
                type:
                - string
                - 'null'
              highlights:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    is_deleted:
                      type: boolean
                    text:
                      type: string
                    location:
                      type: integer
                    location_type:
                      type: string
                    note:
                      type:
                      - string
                      - 'null'
                    color:
                      type: string
                    highlighted_at:
                      type: string
                      format: date-time
                    created_at:
                      type: string
                      format: date-time
                    updated_at:
                      type: string
                      format: date-time
                    external_id:
                      type: string
                    end_location:
                      type:
                      - string
                      - 'null'
                    url:
                      type:
                      - string
                      - 'null'
                    book_id:
                      type: integer
                    tags:
                      type: array
                      items: {}
                    is_favorite:
                      type: boolean
                    is_discard:
                      type: boolean
                    readwise_url:
                      type: string
    GetApiV2HighlightsResponse:
      type: object
      properties:
        count:
          type: integer
        next:
          type: string
        previous:
          type: string
        results:
          type: array
    GetApiV2ReviewResponse:
      type: object
      properties:
        review_id:
          type: integer
        review_completed:
          type: boolean
    PostApiV2ReviewCompleteResponse:
      type: object
      properties:
        count:
          type: integer
        next:
          type: string
        previous:
          type:
          - string
          - 'null'
        results:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
              text:
                type: string
              note:
                type: string
              location:
                type: integer
              location_type:
                type: string
              highlighted_at:
                type:
                - string
                - 'null'
              created_at:
                type: string
                format: date-time
              url:
                type:
                - string
                - 'null'
              color:
                type: string
              updated:
                type: string
                format: date-time
              book_id:
                type: integer
              external_id:
                type:
                - string
                - 'null'
              tags:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    name:
                      type: string
              end_location:
                type:
                - string
                - 'null'
              readwise_url:
                type: string
    PatchApiV3BulkUpdateRequest:
      type: object
      properties:
        updates:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              location:
                type: string
    PatchApiV3BulkUpdateResponse:
      type: object
      properties:
        count:
          type: integer
        nextPageCursor:
          type:
          - string
          - 'null'
        results:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              name:
                type: string
    PatchApiV3BulkUpdateRequest2:
      type: object
      properties:
        updates:
          type: array
          description: Array of update objects, each with an id and fields to update.
      required:
      - updates
    PatchApiV3BulkUpdateResponse2:
      type: object
      properties:
        results:
          type: array
          description: Array of update results, each indicating success or failure.
    DeleteApiV3Delete0000Ffff2222Eeee3333Dddd4444Response:
      type: object
      properties:
        count:
          type: integer
        nextPageCursor:
          type:
          - string
          - 'null'
        results:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              name:
                type: string
    GetApiV3ListResponse:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
    GetApiV3ListResponse2:
      type: object
      properties:
        count:
          type: integer
          description: Total number of documents.
        nextPageCursor:
          type: string
          description: Cursor for the next page of results.
        results:
          type: array
          description: List of documents.
    PostApiV3SaveRequest:
      type: object
      properties:
        url:
          type: string
        language:
          type: string
    PostApiV3SaveRequest2:
      type: object
      properties:
        url:
          type: string
          description: The document's unique URL. If you don't have one, you can provide a made up value such as https://yourapp.com#document1.
            Required unless parent_id is set.
        html:
          type: string
          description: The document's content, in valid html. If you don't provide this, we will try to scrape the URL you provided.
        should_clean_html:
          type: boolean
          description: Only valid when html is provided. Pass true to have us automatically clean the html and parse the metadata (title/author)
            of the document for you.
        title:
          type: string
          description: The document's title, it will overwrite the original title of the document.
        author:
          type: string
          description: The document's author, it will overwrite the original author.
        summary:
          type: string
          description: Summary of the document.
        language:
          type: string
          description: The document's language code, such as en, de, or en-US.
        published_date:
          type: string
          description: A datetime representing when the document was published in the ISO 8601 format.
        image_url:
          type: string
          description: An image URL to use as cover image.
        location:
          type: string
          description: 'One of: new, later, archive or feed. Default is new.'
        category:
          type: string
          description: 'One of: article, email, rss, highlight, pdf, epub, tweet or video.'
        saved_using:
          type: string
          description: This value represents the source of the document.
        tags:
          type: array
          description: A list of strings containing tags.
        notes:
          type: string
          description: A top-level note of the document, or the note attached to the highlight when parent_id is set.
        parent_id:
          type: string
          description: Highlights only. The id of the document to highlight.
        content:
          type: string
          description: Highlights only. The passage to highlight. Required when parent_id is set.
    PostApiV3SaveResponse:
      type: object
      properties:
        id:
          type: string
          description: The document ID.
        url:
          type: string
          description: The Readwise URL for the document.
    GetApiV3TagsResponse:
      type: object
      properties:
        count:
          type: integer
          description: Total number of tags.
        nextPageCursor:
          type: string
          description: Cursor for the next page of results.
        results:
          type: array
          description: List of tags.
    PatchApiV3Update0000Ffff2222Eeee3333Dddd4444Request:
      type: object
      properties:
        title:
          type: string
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: Authorization
security:
- apiKey: []
tags:
- name: Api