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: 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