
Raindrop Api
- 457 installs
- 281 repo stars
- Updated April 25, 2026
- intellectronica/agent-skills
raindrop-api is a Claude Code agent skill that instructs curl and jq calls against the Raindrop.io REST API for developers who need to read, create, search, organize, import, export, or back up bookmarks and collections
About
raindrop-api is a Claude Code skill from intellectronica/agent-skills for comprehensive Raindrop.io REST API interaction at `https://api.raindrop.io/rest/v1/`. It resolves `RAINDROP_TOKEN` from environment or user input, verifies auth with `GET /user`, and covers CRUD for raindrops, collections, tags, highlights, filters, import, export, and backups. List endpoints paginate with `page` and `perpage` where max `perpage` is 50; the API rate limit is 120 requests per minute. Destructive DELETE and bulk operations require user confirmation. Export supports csv, html, and zip formats; OAuth access tokens expire after two weeks with refresh_token flow documented. Developers use raindrop-api when building research pipelines, share lists, or personal knowledge features that sync bookmarks, collections, and tags through Raindrop.io.
- Raindrop REST operations
- OAuth and token handling
- Collection and tag sync
- Bookmark CRUD patterns
- Pagination and rate limits
Raindrop Api by the numbers
- 457 all-time installs (skills.sh)
- +10 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #916 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/intellectronica/agent-skills --skill raindrop-apiAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 457 |
|---|---|
| repo stars | ★ 281 |
| Last updated | April 25, 2026 |
| Repository | intellectronica/agent-skills ↗ |
How do you sync Raindrop.io bookmarks via API?
Sync bookmarks, collections, and tags with Raindrop.io through its API for research pipelines, share lists, or personal knowledge features inside apps and agents.
Who is it for?
Developers building agents or apps that automate Raindrop.io bookmark CRUD, collection organization, tag merges, and export/backup workflows with curl.
Skip if: Teams without Raindrop.io accounts or developers who only need static markdown notes without bookmark API integration.
When should I use this skill?
User asks to read, create, update, delete, search, export, or organize Raindrop.io bookmarks, collections, or tags via API.
What you get
Authenticated API calls, paginated bookmark lists, created or updated raindrops/collections, and csv/html/zip exports or backups.
- Synced bookmarks and collections
- Tag rename/merge results
- csv/html/zip exports
By the numbers
- Raindrop.io API rate limit is 120 requests per minute
- List pagination perpage max is 50 items per page
- Export formats: csv, html, and zip
Files
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:
1. Check environment variable RAINDROP_TOKEN 2. Check if the user has provided a token in the conversation context 3. 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 \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tags": ["tag-to-remove"]}' \
"https://api.raindrop.io/rest/v1/tags/0"Highlights
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} |
| Delete highlight | PUT | /raindrop/{id} |
For details, see references/highlights.md.
Filters
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 filter
User
Docs: https://developer.raindrop.io/v1/user
| Operation | Method | Endpoint |
|---|---|---|
| Get current user | GET | /user |
| Update user | PUT | /user |
Import
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 |
Backups
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
Authentication: OAuth2 Flow
Docs: https://developer.raindrop.io/v1/authentication/token
For apps accessing other users' data (not personal use), use the full OAuth2 flow:
Step 1: Authorise
Direct users to:
https://raindrop.io/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=codeStep 2: Exchange Code for Token
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"
}Step 3: Refresh Token
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 '.'Error Handling
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 error
Example with Error Handling
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"
fiCommon Patterns
List All Bookmarks in a Collection
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/COLLECTION_ID?perpage=50" | jq '.items[] | {title, link}'Create a Bookmark
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 Bookmarks
# 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.
Move Bookmark to a Collection
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 '.'Get All Tags
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/tags/0" | jq '.items[] | {tag: ._id, count}'Create a Collection
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 '.'List All Collections (Root + Children)
# 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"}'Paginate Through All Bookmarks
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))
doneExport Bookmarks
# 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.htmlCheck if URL Already Saved
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 '.'Pagination
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.
Nested Collection Structure
Collections are organised hierarchically. Reconstructing the full sidebar requires:
1. GET /user - Returns groups array with collection ordering 2. GET /collections - Root collections 3. GET /collections/childrens - Nested collections
Root collection sort order is persisted in the user's groups[].collections array. Child collection sort order is stored in the collection's sort field.
Additional Reference
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 management
Workflow Summary
1. Resolve token - Environment, context, or ask user 2. Verify authentication - Test with GET /user 3. Read operations - Execute directly without confirmation 4. Write operations - Ask for confirmation before executing 5. Handle pagination - Loop with page number until items < perpage 6. Parse responses - Use jq to extract and format data
Collection Sharing and Collaborators
Raindrop.io allows sharing collections with other users for collaboration. This reference covers the sharing API endpoints.
Docs: https://developer.raindrop.io/v1/collections/sharing
Collaborator Object
Each collaborator record contains:
| Field | Type | Description |
|---|---|---|
_id | number | User ID |
email | string | Email address (empty for read-only users) |
email_MD5 | string | MD5 hash of email (for Gravatar) |
fullName | string | Full name |
role | string | member (write + invite) or viewer (read-only) |
Endpoints
Share Collection (Invite)
Send invitations to collaborate on a collection.
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": "member",
"emails": ["user1@example.com", "user2@example.com"]
}' \
"https://api.raindrop.io/rest/v1/collection/{id}/sharing" | jq '.'Fields:
role(string, required) -memberorvieweremails(array, required) - Up to 10 email addresses
Get Collaborators
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collection/{id}/sharing" | jq '.'Returns array of collaborator objects.
Unshare / Leave Collection
- Owner: Removes all collaborators
- Member/Viewer: Removes self from the collection
curl -s -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collection/{id}/sharing" | jq '.'Change Collaborator Role
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role": "viewer"}' \
"https://api.raindrop.io/rest/v1/collection/{id}/sharing/{userId}" | jq '.'Remove Specific Collaborator
curl -s -X DELETE \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/collection/{id}/sharing/{userId}" | jq '.'Accept Invitation
curl -s -X POST \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"token": "INVITATION_TOKEN"}' \
"https://api.raindrop.io/rest/v1/collection/{id}/join" | jq '.'The token is provided in the email invitation.
Error Cases
- Empty emails array
- More than 10 recipients
- Too many pending invitations
- Insufficient permissions (not an owner)
- Invalid/expired invitation token
- Collection no longer exists
- User already owns the collection
Highlights
Highlights are text excerpts saved from web pages, associated with individual raindrops (bookmarks).
Docs: https://developer.raindrop.io/v1/highlights
Highlight Object
| Field | Type | Description |
|---|---|---|
_id | string | Unique identifier |
text | string | Highlighted text content (required) |
title | string | Associated bookmark title |
color | string | Highlight colour (default: yellow) |
note | string | Optional annotation |
created | string | ISO 8601 timestamp |
tags | array | Tag labels |
link | string | Source page URL |
Colour options: blue, brown, cyan, gray, green, indigo, orange, pink, purple, red, teal, yellow
Retrieve All Highlights
Paginated list of all highlights across all raindrops.
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/highlights?page=0&perpage=50" | jq '.'Query parameters:
page(number) - Page number (0-indexed)perpage(number) - Results per page (max 50, default 25)
Retrieve Collection Highlights
Highlights from a specific collection.
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/highlights/{collectionId}" | jq '.'Retrieve Raindrop Highlights
Get highlights for a specific bookmark (returned as part of the raindrop object).
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrop/{id}" | jq '.item.highlights'Add Highlight
Add a new highlight to a raindrop by updating it with the highlights array.
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"highlights": [
{
"text": "The highlighted text",
"color": "yellow",
"note": "My annotation"
}
]
}' \
"https://api.raindrop.io/rest/v1/raindrop/{id}" | jq '.'Fields:
text(string, required) - The highlighted textcolor(string, optional) - Colour name (default:yellow)note(string, optional) - User annotation
Update Highlight
Update an existing highlight's note or colour by including its _id.
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"highlights": [
{
"_id": "HIGHLIGHT_ID",
"note": "Updated annotation",
"color": "blue"
}
]
}' \
"https://api.raindrop.io/rest/v1/raindrop/{id}" | jq '.'Delete Highlight
Remove a highlight by setting its text to an empty string.
curl -s -X PUT \
-H "Authorization: Bearer $RAINDROP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"highlights": [
{
"_id": "HIGHLIGHT_ID",
"text": ""
}
]
}' \
"https://api.raindrop.io/rest/v1/raindrop/{id}" | jq '.'All highlight operations return the updated raindrop object with "result": true.
Raindrop.io Search Query Syntax
The search query parameter on the /raindrops/{collectionId} endpoint accepts the same search syntax used in the Raindrop.io app. You can test searches in the app first, then copy the query string for API use.
Full help: https://help.raindrop.io/using-search
Basic Search
| Syntax | Description | Example |
|---|---|---|
word1 word2 | Items containing these words (in title, description, domain, or page content) | apple iphone |
"exact phrase" | Items containing the exact phrase | "superman vs. batman" |
-term | Exclude results containing term | -superman |
Tag Operators
| Syntax | Description | Example |
|---|---|---|
#tag | Items with a specific tag | #coffee |
#"multi word" | Items with a multi-word tag | #"coffee beans" |
-#tag | Items without a specific tag | -#coffee |
Boolean Logic
| Syntax | Description | Example |
|---|---|---|
word1 word2 | AND (default) - items containing all terms | apple iphone |
word1 word2 match:OR | OR - items containing either term | superman batman match:OR |
Field-Specific Search
| Syntax | Description | Example |
|---|---|---|
title:term | Search in title only | title:css |
title:"phrase" | Search exact phrase in title | title:"css grid" |
excerpt:term | Search in description/excerpt | excerpt:css |
excerpt:"phrase" | Exact phrase in description | excerpt:"css grid" |
note:term | Search in notes | note:css |
note:"phrase" | Exact phrase in notes | note:"css grid" |
link:term | Search in URL | link:drop |
link:"phrase" | Exact phrase in URL | link:"crunch base" |
Date Filters
| Syntax | Description | Example |
|---|---|---|
created:YYYY-MM-DD | Created on specific date | created:2024-06-15 |
created:YYYY-MM | Created in specific month | created:2024-06 |
created:YYYY | Created in specific year | created:2024 |
created:>YYYY-MM-DD | Created after date | created:>2024-01-01 |
created:<YYYY-MM-DD | Created before date | created:<2024-07-01 |
lastUpdate:YYYY-MM-DD | Last updated on date | lastUpdate:2024-06-15 |
Type Filters
| Syntax | Description |
|---|---|
type:link | Regular links |
type:article | Articles |
type:image | Images |
type:video | Videos |
type:document | Documents |
type:audio | Audio files |
Special Filters
| Syntax | Description |
|---|---|
❤️ | Favourites (important items) |
file:true | Items with file attachments |
notag:true | Untagged items |
cache.status:ready | Items with permanent copy saved |
-cache.status:ready | Items without permanent copy |
reminder:true | Items with reminders |
info: | Prefix to disable full-text search |
URL Encoding for curl
When using search queries with curl, URL-encode special characters:
# Search by tag
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=%23tagname"
# Search by exact phrase
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=%22exact%20phrase%22"
# Search by type
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=type%3Aarticle"
# Favourites
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=%E2%9D%A4%EF%B8%8F"
# Untagged items
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=notag%3Atrue"
# Created after a date
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=created%3A%3E2024-01-01"Common Encoding Reference
| Character | Encoded |
|---|---|
| space | %20 |
# | %23 |
" | %22 |
: | %3A |
< | %3C |
> | %3E |
❤️ | %E2%9D%A4%EF%B8%8F |
Combined Search Examples
Articles tagged "design" created this year
search="type%3Aarticle%20%23design%20created%3A2024"
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=$search"Untagged items in a specific collection
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/COLLECTION_ID?search=notag%3Atrue"Bookmarks matching either term
search="react%20vue%20match%3AOR"
curl -s -H "Authorization: Bearer $RAINDROP_TOKEN" \
"https://api.raindrop.io/rest/v1/raindrops/0?search=$search"Related skills
How it compares
Pick raindrop-api over generic web-scraping skills when you need official Raindrop REST v1 patterns for collections, tags, highlights, and confirmed destructive operations.
FAQ
How does raindrop-api authenticate?
raindrop-api resolves `RAINDROP_TOKEN` from the environment or user input, then sends `Authorization: Bearer $RAINDROP_TOKEN` on every request to `https://api.raindrop.io/rest/v1/`. Verify with `GET /user`.
What is the Raindrop.io API rate limit?
raindrop-api documents a limit of 120 requests per minute per authenticated user. HTTP 429 responses indicate the rate limit was exceeded and requests should be retried after backing off.
Which export formats does raindrop-api support?
raindrop-api supports exporting raindrops as csv, html, or zip via `GET /raindrops/{collectionId}/export.{format}`. Backups can be downloaded as html or csv from the backups endpoints.