API

Saved.io API

Use the Saved.io API to save, search, organise, archive and delete bookmarks.

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

  • #hashtags can be included in the notes field.
  • A bookmark saved without a title will attempt to fetch the title in the background.
  • Status is processing while Saved.io fetches metadata, then ready.

List bookmarks

GET https://saved.io/api/bookmarks
Parameter Type Required Description
searchstringNoSearch title, URL and notes.
liststringNoFilter by list.
tagstringNoFilter by tag.
sitestringNoFilter by host, including subdomains.
archivedstringNoactive, archived or all. Defaults to active.
date_fromstringNoInclude bookmarks saved on or after this date.
date_tostringNoInclude bookmarks saved on or before this date.
sortstringNonewest, oldest or title. Defaults to newest.
pageintegerNoPage number.
per_pageintegerNoResults per page. Maximum 100.

Notes

  • archived defaults to active, so archived bookmarks are hidden unless requested.
  • date_from and date_to should be date strings such as 2026-06-03.

Get one bookmark

GET https://saved.io/api/bookmarks/{id}
ParameterTypeRequiredDescription
idintegerYesBookmark ID.

Update a bookmark

PATCH https://saved.io/api/bookmarks/{id}
ParameterTypeRequiredDescription
titlestringNoUpdate the bookmark title.
urlstringNoUpdate the bookmark URL.
notesstringNoUpdate bookmark notes. Use null to clear notes.
archivedbooleanNoSet whether the bookmark is archived.
liststringNoMove the bookmark to a list. Use null to clear the list.

Notes

  • Send only the fields you want to update.
  • Set archived to true to archive a bookmark.
  • Set archived to false to restore an archived bookmark.

Delete a bookmark

DELETE https://saved.io/api/bookmarks/{id}
ParameterTypeRequiredDescription
idintegerYesBookmark ID.

Notes

  • This permanently deletes a bookmark.
  • Use PATCH with archived set to true if you want to archive a bookmark instead.

Lists

Create a list

POST https://saved.io/api/lists
ParameterTypeRequiredDescription
liststringYesList 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.

Tags

Tags are generated from hashtags in bookmark notes.

List tags

GET https://saved.io/api/tags
ParameterTypeRequiredDescription
pageintegerNoPage number.
per_pageintegerNoResults per page. Maximum 100.

Notes

  • Tags are edited by updating bookmark notes.

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:read and lists:write still work.
  • Existing integrations can still send list_slug, tag_slug and q.
  • New integrations should use read, write, list, tag and search.

Errors

StatusMeaning
401Missing or invalid Bearer token.
402The account cannot save more bookmarks or create lists.
403The token is missing the required scope.
404The resource does not exist, or it belongs to another account.
422Validation failed. Check the returned field errors.
429Too 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.