Public API
Read and write your Screvi highlights, saved articles, sources, and tags over a REST API. Authentication, endpoints, rate limits, and example requests.
Updated
On this page
Overview
Screvi has a REST API for your own highlights, saved articles, sources, and tags. Use it to pull highlights into a script, push highlights in from a tool Screvi does not support yet, save links from your own automations, or build a personal dashboard.
The API needs an active subscription or trial. Full reference docs with request and response schemas live at api.screvi.com/api/docs, and the OpenAPI spec is at api.screvi.com/api/docs.json. Coding agents can load the skill file instead.
If you want an AI assistant to work with your highlights instead of writing code, use the MCP server.
Authentication
- In the web app, go to Settings > API and create a key. Give it a name, and tick write access only if the tool needs to change your library.
- Send the key with every request in the
X-API-Keyheader.Authorization: Bearer <key>also works.
GET https://api.screvi.com/api/v1/highlights?per_page=50
X-API-Key: sk_live_your_key_here
Keys carry a read scope, and optionally write for creating or editing data. A key is shown once when created. Treat it like a password, and revoke it from the same settings page if it leaks.
Rate Limits
Each key gets 100 requests per minute. Responses include rate-limit headers so you can back off before hitting the cap. Requests over the limit return 429 with code: "rate_limited".
Endpoints
All paths are relative to https://api.screvi.com/api/v1. List endpoints use page and per_page for pagination (per_page maxes out at 100). Everywhere a tags field is accepted it takes tag names, matched case-insensitively and created when new, or tag ids.
Highlights
| Method | Path | Notes |
|---|---|---|
| GET | /highlights |
Filters: source_id, favorite, tag, tag_id, updated_since, include_deleted |
| GET | /highlights/random |
One random highlight. Add count (max 20) for several; filters: favorite, types, tag, source_id |
| GET | /highlights/:id |
A single highlight with its source and tags |
| GET | /search |
Hybrid semantic and keyword search. Params: q, source, tag, types, favorite, min_relevance, page, per_page (max 50) |
| POST | /highlights |
Create one highlight, optionally with tags (write scope) |
| POST | /highlights/bulk |
Create up to 100 highlights in one transaction (write scope) |
| PATCH | /highlights/:id |
Edit text, note, favorite, or replace tags (write scope) |
| DELETE | /highlights/:id |
Delete a highlight (write scope) |
| POST | /highlights/:id/tags |
Add tags without touching existing ones (write scope) |
| DELETE | /highlights/:id/tags |
Remove the named tags (write scope) |
Articles
Saved web pages, newsletters, and PDFs: the read-later side of Screvi.
| Method | Path | Notes |
|---|---|---|
| GET | /articles |
Filters: q, status, home_status (inbox, later, archive), favorite, has_highlights, tag, saved_since, saved_before, updated_since, include_deleted, sort_by, order |
| GET | /articles/:id |
The article with its body, tags, and highlights. format=text for plain text; page long bodies with offset and max_chars |
| POST | /articles |
Save a URL, optionally with tags. Returns at once with parse_state: queued; the page is parsed in the background (write scope) |
| PATCH | /articles/:id |
Triage and metadata: home_status, favorite, title, excerpt, note, tags (write scope) |
| POST | /articles/:id/tags |
Add tags (write scope) |
| DELETE | /articles/:id/tags |
Remove tags (write scope) |
Articles cannot be deleted through the API, only archived.
Sources
| Method | Path | Notes |
|---|---|---|
| GET | /sources |
Filters: type, search, updated_since, include_deleted, include_empty |
| GET | /sources/:id |
A source with its highlights, paginated |
| POST | /sources |
Create a book, podcast, video, tweet, or custom source (write scope). Web articles go through POST /articles |
| PATCH | /sources/:id |
Edit title, author, cover, and other metadata (write scope) |
| DELETE | /sources/:id |
Delete a source. Add ?cascade=true to delete its highlights too (write scope) |
Tags
| Method | Path | Notes |
|---|---|---|
| GET | /tags |
All your tags with counts |
| POST | /tags |
Create a tag by name. Returns the existing tag if the name is already taken (write scope) |
| PATCH | /tags/:id |
Rename or recolor a tag (write scope) |
| DELETE | /tags/:id |
Delete a tag and remove it from everything; the highlights and articles stay (write scope) |
Incremental Sync
To keep another tool in step with Screvi, store the time of your last run and pass it as updated_since on the next one. Only highlights, sources, or articles changed after that moment come back. Add include_deleted=true if you need to mirror deletions.
Example: Export New Highlights with curl
curl "https://api.screvi.com/api/v1/highlights?updated_since=2026-09-01T00:00:00Z&per_page=100" \
-H "X-API-Key: sk_live_your_key_here"
Example: Save a Link and Read It Back
curl -X POST "https://api.screvi.com/api/v1/articles" \
-H "X-API-Key: sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/essay", "tags": ["to-read"] }'
The response carries the new article's id. A few seconds later, fetch the text:
curl "https://api.screvi.com/api/v1/articles/<id>?format=text" \
-H "X-API-Key: sk_live_your_key_here"
Errors
Every error carries a stable code next to the message, so scripts can branch on the code rather than on wording. Validation problems come with a fields map naming what was wrong. The full list is in the API reference.
Ideas
- Post a random highlight to Slack or X every morning
- Build a Raycast or Alfred command that searches your library
- Save links from an RSS reader, a Telegram bot, or a shortcut on your phone
- Push highlights from a reading app Screvi does not integrate with yet
- Feed your highlights and articles into a personal knowledge base or a custom AI agent
Related
- Screvi MCP Server
- Exporting Your Highlights for one-off ZIP exports without code
Still have questions?