raindrop-api by intellectronica/agent-skills
npx skills add https://github.com/intellectronica/agent-skills --skill raindrop-api此技能支持通过 REST API 与 Raindrop.io 书签服务进行交互。使用 curl 和 jq 进行直接的 REST 调用。
官方 API 文档 : https://developer.raindrop.io/
按以下顺序解析 API 令牌:
RAINDROP_TOKEN要验证环境中是否存在令牌:
[ -n "$RAINDROP_TOKEN" ] && echo "Token available" || echo "Token not set"
快速设置 : 对于个人使用或开发,请在 https://app.raindrop.io/settings/integrations 生成测试令牌 — 打开您的应用并复制“测试令牌”。测试令牌不会过期。
有关完整的 OAuth2 流程详情,请参阅下面的认证部分。
所有请求都需要在 Authorization 头中携带 Bearer 令牌:
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/ENDPOINT"
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
对于带有 JSON 请求体的 POST/PUT 请求:
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key": "value"}' \
"https://api.raindrop.io/rest/v1/ENDPOINT"
通过获取当前用户信息来测试令牌:
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/user" | jq '.user.fullName'
https://api.raindrop.io/rest/v1/在执行任何破坏性操作(DELETE、批量更新、移动到回收站)之前,务必使用 AskUserQuestion 向用户请求确认。 对于一个逻辑上相关的一组操作,一次确认即可。
破坏性操作包括:
只读操作(GET 请求)不需要确认。
| 操作 | 方法 | 端点 |
|---|---|---|
| 获取书签 | GET | /raindrop/{id} |
| 创建书签 | POST | /raindrop |
| 更新书签 | PUT | /raindrop/{id} |
| 移除书签 | DELETE | /raindrop/{id} |
| 上传文件 | PUT | /raindrop/file |
| 上传封面 | PUT | /raindrop/{id}/cover |
| 获取永久副本 | GET | /raindrop/{id}/cache |
| 建议(新 URL) | POST | /raindrop/suggest |
| 建议(现有) | GET | /raindrop/{id}/suggest |
书签创建/更新字段:
link (字符串,创建时必需) - 书签 URLtitle (字符串) - 书签标题excerpt (字符串) - 简短描述note (字符串) - 用户笔记(支持 Markdown)tags (字符串数组) - 标签名称collection (对象) - {"$id": collectionId}type (字符串) - link, article, image, video, document, audioimportant (布尔值) - 标记为收藏order (数字) - 排序顺序(升序)media (数组) - 媒体/缩略图信息highlights (数组) - 文本高亮cover (字符串) - 封面图片 URL,或使用 <screenshot> 自动截图pleaseParse (对象) - {} 用于触发后台元数据解析created (字符串) - ISO 8601 创建日期lastUpdate (字符串) - ISO 8601 最后更新日期reminder (对象) - 提醒设置删除行为 : 移除书签会将其移动到回收站(收藏集 ID -99)。从回收站移除则会永久删除。
| 操作 | 方法 | 端点 |
|---|---|---|
| 获取书签列表 | GET | /raindrops/{collectionId} |
| 创建多个书签 | POST | /raindrops |
| 更新多个书签 | PUT | /raindrops/{collectionId} |
| 移除多个书签 | DELETE | /raindrops/{collectionId} |
| 导出 | GET | /raindrops/{collectionId}/export.{format} |
collectionId 取值:
0 - 所有书签-1 - 未分类-99 - 回收站GET /raindrops/{collectionId} 的查询参数:
sort - 排序方式:-created (默认), created, score, -sort, title, -title, domain, -domainperpage - 每页结果数(最大 50)page - 页码(从 0 开始)search - 搜索查询(参见 references/search-operators.md)nested - 布尔值,是否包含子收藏集的书签批量更新字段 (PUT 请求,使用 ids 数组或 search 查询):
important (布尔值)tags (数组) - 追加标签;空数组则清除所有标签media (数组) - 追加;空数组则清除cover (字符串) - URL 或 <screenshot>collection (对象) - {"$id": collectionId} 用于移动书签导出格式 : csv, html, zip
| 操作 | 方法 | 端点 |
|---|---|---|
| 列出根收藏集 | GET | /collections |
| 列出子收藏集 | GET | /collections/childrens |
| 获取收藏集 | GET | /collection/{id} |
| 创建收藏集 | POST | /collection |
| 更新收藏集 | PUT | /collection/{id} |
| 上传封面 | PUT | /collection/{id}/cover |
| 删除收藏集 | DELETE | /collection/{id} |
| 删除多个收藏集 | DELETE | /collections |
| 重新排序/展开所有收藏集 | PUT | /collections |
| 合并收藏集 | PUT | /collections/merge |
| 移除空收藏集 | PUT | /collections/clean |
| 清空回收站 | DELETE | /collection/-99 |
| 系统收藏集计数 | GET | /user/stats |
| 搜索封面/图标 | GET | /collections/covers/{text} |
| 推荐封面 | GET | /collections/covers |
收藏集字段:
title (字符串) - 收藏集名称view (字符串) - 显示样式:list, simple, grid, masonrypublic (布尔值) - 公开访问权限parent (对象) - {"$id": parentCollectionId} 用于嵌套sort (数字) - 排序位置cover (数组) - 封面图片 URLexpanded (布尔值) - 子收藏集是否展开color (字符串) - 收藏集颜色系统收藏集 (不可移除):
-1 - "未分类"-99 - "回收站"访问级别 (access.level):
1 - 只读2 - 协作者(可写)3 - 协作者(可写 + 管理)4 - 所有者关于共享/协作者,请参阅 references/collections-sharing.md。
| 操作 | 方法 | 端点 |
|---|---|---|
| 获取标签 | GET | /tags/{collectionId} |
| 重命名标签 | PUT | /tags/{collectionId} |
| 合并标签 | PUT | /tags/{collectionId} |
| 移除标签 | DELETE | /tags/{collectionId} |
collectionId : 省略或使用 0 表示来自所有收藏集的标签。
获取标签响应:
{
"result": true,
"items": [{"_id": "tagname", "count": 42}]
}
重命名标签:
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"replace": "new-name", "tags": ["old-name"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
合并标签 (同一端点,数组中包含多个标签):
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"replace": "merged-name", "tags": ["tag1", "tag2", "tag3"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
移除标签:
curl -s -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["tag-to-remove"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
| 操作 | 方法 | 端点 |
|---|---|---|
| 获取所有高亮 | GET | /highlights |
| 获取收藏集高亮 | GET | /highlights/{collectionId} |
| 获取书签高亮 | GET | /raindrop/{id} |
| 添加高亮 | PUT | /raindrop/{id} |
| 更新高亮 | PUT | /raindrop/{id} |
| 删除高亮 | PUT | /raindrop/{id} |
详情请参阅 references/highlights.md。
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/filters/{collectionId}" | jq '.'
对所有收藏集使用 0。返回损坏链接、重复项、收藏项、未标记项、标签和内容类型的聚合计数。
查询参数:
tagsSort - -count (默认) 或 _id (字母顺序)search - 额外的搜索过滤器| 操作 | 方法 | 端点 |
|---|---|---|
| 获取当前用户 | GET | /user |
| 更新用户 | PUT | /user |
| 操作 | 方法 | 端点 |
|---|---|---|
| 解析 URL | GET | /import/url/parse?url={url} |
| 检查 URL 是否存在 | POST | /import/url/exists |
| 解析 HTML 书签文件 | POST | /import/file |
| 操作 | 方法 | 端点 |
|---|---|---|
| 列出备份 | GET | /backups |
| 下载备份 | GET | /backup/{id}.{format} |
| 生成新备份 | GET | /backup |
格式 : html 或 csv
对于访问其他用户数据(非个人使用)的应用,请使用完整的 OAuth2 流程:
引导用户访问:
https://raindrop.io/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code
curl -s -X POST "https://raindrop.io/oauth/access_token" \
-H "Content-Type: application/json" \
-d '{
"code": "AUTH_CODE",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"redirect_uri": "YOUR_REDIRECT_URI",
"grant_type": "authorization_code"
}' | jq '.'
响应:
{
"access_token": "...",
"refresh_token": "...",
"expires_in": 1209599,
"token_type": "Bearer"
}
访问令牌在两周后过期。使用以下方式刷新:
curl -s -X POST "https://raindrop.io/oauth/access_token" \
-H "Content-Type: application/json" \
-d '{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"refresh_token": "YOUR_REFRESH_TOKEN",
"grant_type": "refresh_token"
}' | jq '.'
检查 HTTP 状态码:
200 - 成功204 - 成功,无内容400 - 错误请求401 - 认证失败(检查令牌)403 - 禁止访问(权限不足)404 - 资源未找到429 - 超出速率限制(超过 120 次/分钟)5xx - 服务器错误response=$(curl -s -w "\n%{http_code}" \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
echo "$body" | jq '.'
else
echo "Error: HTTP $http_code"
echo "$body"
fi
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/COLLECTION_ID?perpage=50" | jq '.items[] | {title, link}'
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"link": "https://example.com",
"title": "Example Site",
"tags": ["reference", "example"],
"collection": {"$id": COLLECTION_ID},
"pleaseParse": {}
}' \
"https://api.raindrop.io/rest/v1/raindrop" | jq '.'
# 在所有收藏集中搜索
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=YOUR_QUERY" | jq '.items[] | {title, link}'
# 使用标签过滤器搜索
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=%23tagname" | jq '.items[] | {title, link}'
完整的搜索查询语法请参阅 references/search-operators.md。
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"collection": {"$id": TARGET_COLLECTION_ID}}' \
"https://api.raindrop.io/rest/v1/raindrop/RAINDROP_ID" | jq '.'
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/tags/0" | jq '.items[] | {tag: ._id, count}'
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "My Collection", "view": "list"}' \
"https://api.raindrop.io/rest/v1/collection" | jq '.'
# 根收藏集
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collections" | jq '.items[] | {id: ._id, title}'
# 子收藏集
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collections/childrens" | jq '.items[] | {id: ._id, title, parent: .parent."$id"}'
page=0
while true; do
response=$(curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?perpage=50&page=$page")
count=$(echo "$response" | jq '.items | length')
echo "$response" | jq '.items[] | {title, link}'
if [ "$count" -lt 50 ]; then
break
fi
page=$((page + 1))
done
# 将所有书签导出为 CSV
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0/export.csv" -o bookmarks.csv
# 导出为 HTML
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0/export.html" -o bookmarks.html
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com"]}' \
"https://api.raindrop.io/rest/v1/import/url/exists" | jq '.'
Raindrop 使用基于页面的分页(非基于游标):
page - 页码(从 0 开始)perpage - 每页项目数(最大 50,高亮默认为 25)当返回的项目数少于 perpage 时,表示已到达最后一页。
收藏集按层级组织。要重建完整的侧边栏需要:
GET /user - 返回包含收藏集排序的 groups 数组GET /collections - 根收藏集GET /collections/childrens - 嵌套收藏集根收藏集的排序顺序保存在用户的 groups[].collections 数组中。子收藏集的排序顺序保存在收藏集的 sort 字段中。
关于特定主题的详细文档,请查阅:
references/search-operators.md - 搜索查询语法和操作符references/collections-sharing.md - 收藏集共享与协作者references/highlights.md - 高亮管理GET /user 测试每周安装数
124
仓库
GitHub 星标
228
首次出现
2026 年 1 月 28 日
安全审计
安装于
codex104
opencode102
gemini-cli99
cursor96
github-copilot92
claude-code92
This skill enables interaction with the Raindrop.io bookmarks service through its REST API. Use curl and jq for direct REST calls.
Official API documentation : https://developer.raindrop.io/
Resolve the API token in this order:
RAINDROP_TOKENTo verify a token exists in the environment:
[ -n "$RAINDROP_TOKEN" ] && echo "Token available" || echo "Token not set"
Quick setup : For personal use or development, generate a test token at https://app.raindrop.io/settings/integrations — open your app and copy the "Test token". Test tokens do not expire.
For full OAuth2 flow details, see the Authentication section below.
All requests require the Authorization header with Bearer token:
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/ENDPOINT"
For POST/PUT requests with JSON body:
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key": "value"}' \
"https://api.raindrop.io/rest/v1/ENDPOINT"
Test the token by retrieving the current user:
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/user" | jq '.user.fullName'
https://api.raindrop.io/rest/v1/Before executing any destructive action (DELETE, bulk update, move to trash), always ask the user for confirmation using AskUserQuestion. A single confirmation suffices for a logical group of related actions.
Destructive actions include:
Read-only operations (GET requests) do not require confirmation.
Docs: https://developer.raindrop.io/v1/raindrops
| Operation | Method | Endpoint |
|---|---|---|
| Get raindrop | GET | /raindrop/{id} |
| Create raindrop | POST | /raindrop |
| Update raindrop | PUT | /raindrop/{id} |
| Remove raindrop | DELETE | /raindrop/{id} |
| Upload file | PUT | /raindrop/file |
Docs: https://developer.raindrop.io/v1/raindrops/single
Raindrop creation/update fields:
link (string, required for creation) - Bookmark URLtitle (string) - Bookmark titleexcerpt (string) - Short descriptionnote (string) - User notes (supports Markdown)tags (array of strings) - Tag namescollection (object) - {"$id": collectionId}type (string) - link, article, , , , Deletion behaviour : Removing a raindrop moves it to Trash (collection ID -99). Removing from Trash deletes permanently.
| Operation | Method | Endpoint |
|---|---|---|
| Get raindrops | GET | /raindrops/{collectionId} |
| Create multiple | POST | /raindrops |
| Update multiple | PUT | /raindrops/{collectionId} |
| Remove multiple | DELETE | /raindrops/{collectionId} |
| Export | GET | /raindrops/{collectionId}/export.{format} |
Docs: https://developer.raindrop.io/v1/raindrops/multiple
collectionId values:
0 - All raindrops-1 - Unsorted-99 - TrashQuery parameters for GET /raindrops/{collectionId}:
sort - Sort order: -created (default), created, score, -sort, title, -title, domain, -domainperpage - Results per page (max 50)page - Page number (0-indexed)Bulk update fields (PUT with ids array or search query):
important (boolean)tags (array) - Appends tags; empty array clears allmedia (array) - Appends; empty array clearscover (string) - URL or <screenshot>collection (object) - {"$id": collectionId} to moveExport formats : csv, html, zip
Docs: https://developer.raindrop.io/v1/collections
| Operation | Method | Endpoint |
|---|---|---|
| List root collections | GET | /collections |
| List child collections | GET | /collections/childrens |
| Get collection | GET | /collection/{id} |
| Create collection | POST | /collection |
| Update collection | PUT | /collection/{id} |
Docs: https://developer.raindrop.io/v1/collections/methods
Collection fields:
title (string) - Collection nameview (string) - Display style: list, simple, grid, masonrypublic (boolean) - Public accessibilityparent (object) - {"$id": parentCollectionId} for nestingsort (number) - Sort positioncover (array) - Cover image URLsSystem collections (non-removable):
-1 - "Unsorted"-99 - "Trash"Access levels (access.level):
1 - Read only2 - Collaborator (write)3 - Collaborator (write + manage)4 - OwnerFor sharing/collaborators, see references/collections-sharing.md.
Docs: https://developer.raindrop.io/v1/tags
| Operation | Method | Endpoint |
|---|---|---|
| Get tags | GET | /tags/{collectionId} |
| Rename tag | PUT | /tags/{collectionId} |
| Merge tags | PUT | /tags/{collectionId} |
| Remove tag(s) | DELETE | /tags/{collectionId} |
collectionId : Omit or use 0 for tags from all collections.
Get tags response:
{
"result": true,
"items": [{"_id": "tagname", "count": 42}]
}
Rename tag:
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"replace": "new-name", "tags": ["old-name"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
Merge tags (same endpoint, multiple tags in array):
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"replace": "merged-name", "tags": ["tag1", "tag2", "tag3"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
Remove tags:
curl -s -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["tag-to-remove"]}' \
"https://api.raindrop.io/rest/v1/tags/0"
Docs: https://developer.raindrop.io/v1/highlights
| Operation | Method | Endpoint |
|---|---|---|
| Get all highlights | GET | /highlights |
| Get collection highlights | GET | /highlights/{collectionId} |
| Get raindrop highlights | GET | /raindrop/{id} |
| Add highlight | PUT | /raindrop/{id} |
| Update highlight | PUT | /raindrop/{id} |
For details, see references/highlights.md.
Docs: https://developer.raindrop.io/v1/filters
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/filters/{collectionId}" | jq '.'
Use 0 for all collections. Returns aggregated counts for broken links, duplicates, favourites, untagged items, tags, and content types.
Query parameters:
tagsSort - -count (default) or _id (alphabetical)search - Additional search filterDocs: https://developer.raindrop.io/v1/user
| Operation | Method | Endpoint |
|---|---|---|
| Get current user | GET | /user |
| Update user | PUT | /user |
Docs: https://developer.raindrop.io/v1/import
| Operation | Method | Endpoint |
|---|---|---|
| Parse URL | GET | /import/url/parse?url={url} |
| Check URL existence | POST | /import/url/exists |
| Parse HTML bookmark file | POST | /import/file |
Docs: https://developer.raindrop.io/v1/backups
| Operation | Method | Endpoint |
|---|---|---|
| List backups | GET | /backups |
| Download backup | GET | /backup/{id}.{format} |
| Generate new backup | GET | /backup |
Formats : html or csv
Docs: https://developer.raindrop.io/v1/authentication/token
For apps accessing other users' data (not personal use), use the full OAuth2 flow:
Direct users to:
https://raindrop.io/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code
curl -s -X POST "https://raindrop.io/oauth/access_token" \
-H "Content-Type: application/json" \
-d '{
"code": "AUTH_CODE",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"redirect_uri": "YOUR_REDIRECT_URI",
"grant_type": "authorization_code"
}' | jq '.'
Response:
{
"access_token": "...",
"refresh_token": "...",
"expires_in": 1209599,
"token_type": "Bearer"
}
Access tokens expire after two weeks. Refresh with:
curl -s -X POST "https://raindrop.io/oauth/access_token" \
-H "Content-Type: application/json" \
-d '{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"refresh_token": "YOUR_REFRESH_TOKEN",
"grant_type": "refresh_token"
}' | jq '.'
Check HTTP status codes:
200 - Success204 - Success, no content400 - Bad request401 - Authentication failed (check token)403 - Forbidden (insufficient permissions)404 - Resource not found429 - Rate limited (120 req/min exceeded)5xx - Server errorresponse=$(curl -s -w "\n%{http_code}" \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
echo "$body" | jq '.'
else
echo "Error: HTTP $http_code"
echo "$body"
fi
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/COLLECTION_ID?perpage=50" | jq '.items[] | {title, link}'
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"link": "https://example.com",
"title": "Example Site",
"tags": ["reference", "example"],
"collection": {"$id": COLLECTION_ID},
"pleaseParse": {}
}' \
"https://api.raindrop.io/rest/v1/raindrop" | jq '.'
# Search across all collections
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=YOUR_QUERY" | jq '.items[] | {title, link}'
# Search with tag filter
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=%23tagname" | jq '.items[] | {title, link}'
See references/search-operators.md for the complete search query syntax.
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"collection": {"$id": TARGET_COLLECTION_ID}}' \
"https://api.raindrop.io/rest/v1/raindrop/RAINDROP_ID" | jq '.'
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/tags/0" | jq '.items[] | {tag: ._id, count}'
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "My Collection", "view": "list"}' \
"https://api.raindrop.io/rest/v1/collection" | jq '.'
# Root collections
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collections" | jq '.items[] | {id: ._id, title}'
# Child collections
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collections/childrens" | jq '.items[] | {id: ._id, title, parent: .parent."$id"}'
page=0
while true; do
response=$(curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?perpage=50&page=$page")
count=$(echo "$response" | jq '.items | length')
echo "$response" | jq '.items[] | {title, link}'
if [ "$count" -lt 50 ]; then
break
fi
page=$((page + 1))
done
# Export all bookmarks as CSV
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0/export.csv" -o bookmarks.csv
# Export as HTML
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0/export.html" -o bookmarks.html
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com"]}' \
"https://api.raindrop.io/rest/v1/import/url/exists" | jq '.'
Raindrop uses page-based pagination (not cursor-based):
page - Page number (0-indexed)perpage - Items per page (max 50, default 25 for highlights)When the number of items returned is less than perpage, you have reached the last page.
Collections are organised hierarchically. Reconstructing the full sidebar requires:
GET /user - Returns groups array with collection orderingGET /collections - Root collectionsGET /collections/childrens - Nested collectionsRoot collection sort order is persisted in the user's groups[].collections array. Child collection sort order is stored in the collection's sort field.
For detailed documentation on specific topics, consult:
references/search-operators.md - Search query syntax and operatorsreferences/collections-sharing.md - Collection sharing and collaboratorsreferences/highlights.md - Highlight managementGET /userWeekly Installs
124
Repository
GitHub Stars
228
First Seen
Jan 28, 2026
Security Audits
Gen Agent Trust HubWarnSocketPassSnykFail
Installed on
codex104
opencode102
gemini-cli99
cursor96
github-copilot92
claude-code92
Azure RBAC 权限管理工具:查找最小角色、创建自定义角色与自动化分配
135,700 周安装
| Upload cover | PUT | /raindrop/{id}/cover |
| Get permanent copy | GET | /raindrop/{id}/cache |
| Suggest (new URL) | POST | /raindrop/suggest |
| Suggest (existing) | GET | /raindrop/{id}/suggest |
imagevideodocumentaudioimportant (boolean) - Mark as favouriteorder (number) - Sort order (ascending)media (array) - Media/thumbnail infohighlights (array) - Text highlightscover (string) - Cover image URL, or <screenshot> for auto-capturepleaseParse (object) - {} to trigger background metadata parsingcreated (string) - ISO 8601 creation datelastUpdate (string) - ISO 8601 last update datereminder (object) - Reminder settingssearchreferences/search-operators.mdnested - Boolean, include child collection bookmarks| Upload cover | PUT | /collection/{id}/cover |
| Delete collection | DELETE | /collection/{id} |
| Delete multiple | DELETE | /collections |
| Reorder/expand all | PUT | /collections |
| Merge collections | PUT | /collections/merge |
| Remove empty | PUT | /collections/clean |
| Empty trash | DELETE | /collection/-99 |
| System collection counts | GET | /user/stats |
| Search covers/icons | GET | /collections/covers/{text} |
| Featured covers | GET | /collections/covers |
expanded (boolean) - Whether subcollections are expandedcolor (string) - Collection colour| Delete highlight | PUT | /raindrop/{id} |