- Skill ID
- intellectronica/agent-skills/raindrop-api
- Publisher
- intellectronica
- Repository
- agent-skills
- Installs
- 0
- Files
- 4
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
intellectronica/agent-skills/raindrop-apiInstalls these files- SKILL.md
- references/collections-sharing.md
- references/highlights.md
- references/search-operators.md
What this skill tells the agent
Raindrop.io API Skill
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/
Authentication
Token Resolution
Resolve the API token in this order:
- Check environment variable
RAINDROP_TOKEN - Check if the user has provided a token in the conversation context
- If neither is available, use AskUserQuestion to request the token from the user
To 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.
Making Authenticated Requests
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"Verifying Authentication
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'Base URL and Conventions
- Base URL:
https://api.raindrop.io/rest/v1/ - Data Format: JSON for all request/response bodies
- Timestamps: ISO 8601 format
- Rate Limit: 120 requests per minute per authenticated user
- CORS: Supported for browser-based apps
Confirmation Requirement
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:
- Deleting raindrops, collections, or tags
- Bulk updating or moving raindrops
- Merging or removing tags
- Removing collaborators from shared collections
- Clearing trash
Read-only operations (GET requests) do not require confirmation.
Endpoints Reference
Raindrops (Bookmarks)
Docs: https://developer.raindrop.io/v1/raindrops
Single Raindrop Operations
| 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 |
| 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 |
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,image,video,document,audioimportant(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 settings
Deletion behaviour: Removing a raindrop moves it to Trash (collection ID -99). Removing from Trash deletes permanently.
Multiple Raindrop Operations
| 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- Trash- Any positive integer - Specific collection
Query 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)search- Search query (seereferences/search-operators.md)nested- Boolean, include child collection bookmarks
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 move
Export formats: csv, html, zip
Collections
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} |
| 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 |
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 URLsexpanded(boolean) - Whether subcollections are expandedcolor(string) - Collection colour
System collections (non-removable):
- ID
-1- "Unsorted" - ID
-99- "Trash"
Access levels (access.level):
1- Read only2- Collaborator (write)3- Collaborator (write + manage)4- Owner
For sharing/collaborators, see references/collections-sharing.md.
Tags
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 \More from intellectronica
Use this skill in a project
Open any RiverX project, search the Skills panel for intellectronica/agent-skills/raindrop-api, and install it in one click.
