API
Saved.io API
Base URL
https://saved.io/api
Machine-readable docs
GET https://saved.io/api/openapi.json
Authentication
Saved.io supports two ways to authenticate API requests.
Personal API tokens
Use personal API tokens for your own scripts, automations and private agents.
Authorization: Bearer SAVED_IO_TOKEN
Create and revoke tokens from the Developer page.
OAuth
Use OAuth for apps that connect other Saved.io accounts.
Authorization endpoint: https://saved.io/oauth/authorize
Token endpoint: https://saved.io/oauth/token
PKCE: S256
Public clients should use OAuth authorization code with PKCE. Confidential clients can use a client secret.
Scopes
| Scope | Allows |
|---|---|
read |
List and view bookmarks, lists, and tags. |
write |
Save, update, archive, restore, and delete bookmarks and lists. |
MCP
Saved.io provides a Model Context Protocol server for agents and MCP clients.
MCP endpoint
POST https://saved.io/mcp
Authentication
Use a Saved.io personal API token as a Bearer token.
Authorization: Bearer SAVED_IO_TOKEN
Create a token from the Developer page. Give it read, write, or both depending on what the agent should do.
Client support
Use this with any MCP client that supports streamable HTTP MCP servers and Bearer token authentication.
Tools
- Search and fetch bookmarks.
- Save, update, archive and restore bookmarks.
- List and create lists.
Agent-friendly URLs
Markdown guide: https://saved.io/api/guide.md
OpenAPI spec: https://saved.io/api/openapi.json
MCP OAuth metadata: https://saved.io/.well-known/oauth-protected-resource
OAuth metadata: https://saved.io/.well-known/oauth-authorization-server
Notes
- Agents should archive bookmarks unless the user clearly asks to permanently delete them.
- OAuth is available for apps that manage their own OAuth client setup.
Bookmarks
Save a bookmark
POST https://saved.io/api/bookmarks
| Parameter | Type | Required | Description |
|---|---|---|---|
url |
string | Yes | The URL of the bookmark you want to save. |
title |
string | No | Bookmark title. Maximum 255 characters. |
list |
string | No | Save to a list. The list is created if it does not exist. |
notes |
string | No | Notes to save with the bookmark. Maximum 10,000 characters. |
curl -X POST "https://saved.io/api/bookmarks" \
-H "Authorization: Bearer $SAVED_IO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/article","list":"Reading","notes":"Read later #research"}'
Notes
#hashtagscan be included in the notes field.- A bookmark saved without a title will attempt to fetch the title in the background.
- Status is
processingwhile Saved.io fetches metadata, thenready.
List bookmarks
GET https://saved.io/api/bookmarks
| Parameter | Type | Required | Description |
|---|---|---|---|
search | string | No | Search title, URL and notes. |
list | string | No | Filter by list. |
tag | string | No | Filter by tag. |
site | string | No | Filter by host, including subdomains. |
archived | string | No | active, archived or all. Defaults to active. |
date_from | string | No | Include bookmarks saved on or after this date. |
date_to | string | No | Include bookmarks saved on or before this date. |
sort | string | No | newest, oldest or title. Defaults to newest. |
page | integer | No | Page number. |
per_page | integer | No | Results per page. Maximum 100. |
Notes
archiveddefaults toactive, so archived bookmarks are hidden unless requested.date_fromanddate_toshould be date strings such as2026-06-03.
Get one bookmark
GET https://saved.io/api/bookmarks/{id}
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Bookmark ID. |
Update a bookmark
PATCH https://saved.io/api/bookmarks/{id}
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | No | Update the bookmark title. |
url | string | No | Update the bookmark URL. |
notes | string | No | Update bookmark notes. Use null to clear notes. |
archived | boolean | No | Set whether the bookmark is archived. |
list | string | No | Move the bookmark to a list. Use null to clear the list. |
Notes
- Send only the fields you want to update.
- Set
archivedtotrueto archive a bookmark. - Set
archivedtofalseto restore an archived bookmark.
Delete a bookmark
DELETE https://saved.io/api/bookmarks/{id}
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | Bookmark ID. |
Notes
- This permanently deletes a bookmark.
- Use
PATCHwitharchivedset totrueif you want to archive a bookmark instead.
Lists
Create a list
POST https://saved.io/api/lists
| Parameter | Type | Required | Description |
|---|---|---|---|
list | string | Yes | List name. Maximum 80 characters. |
{"list":"Reading"}
List lists
GET https://saved.io/api/lists
Get one list
GET https://saved.io/api/lists/{id}
Update a list
PATCH https://saved.io/api/lists/{id}
{"list":"Reading Later"}
Delete a list
DELETE https://saved.io/api/lists/{id}
Notes
- Deleting a list keeps its bookmarks and clears their list.
Webhooks
You can set up a webhook to trigger whenever you save a bookmark.
Webhook endpoints must be public HTTPS URLs.
Headers
X-Saved-Event: bookmark.saved
X-Saved-Delivery: 7f8a4d1e-...
X-Saved-Timestamp: 1780000000
X-Saved-Signature: sha256=...
Payload
{
"id": "7f8a4d1e-...",
"event": "bookmark.saved",
"created_at": "2026-06-03T00:00:00.000000Z",
"data": {
"bookmark": {
"id": 123,
"url": "https://example.com/article",
"title": "Example article",
"notes": "Read later #research",
"status": "ready",
"list": {"id": 4, "list": "Reading"},
"tags": [{"id": 7, "tag": "Research"}],
"created_at": "2026-06-03T00:00:00.000000Z"
}
}
}
Notes
- Webhooks are managed from the Developer page.
- The event name is
bookmark.saved. - To verify the signature, compute an HMAC SHA-256 digest of
timestamp.raw_body.
Legacy compatibility
- Existing tokens with
bookmarks:read,bookmarks:write,lists:readandlists:writestill work. - Existing integrations can still send
list_slug,tag_slugandq. - New integrations should use
read,write,list,tagandsearch.
Errors
| Status | Meaning |
|---|---|
401 | Missing or invalid Bearer token. |
402 | The account cannot save more bookmarks or create lists. |
403 | The token is missing the required scope. |
404 | The resource does not exist, or it belongs to another account. |
422 | Validation failed. Check the returned field errors. |
429 | Too many requests. Slow down and retry later. |
Validation errors return field-level messages:
{
"message": "The url field is required.",
"errors": {
"url": ["The url field is required."]
}
}
Rate limits
Authenticated API requests are limited to 120 requests per minute.