Limits
| Operation | Limit | Applies to |
|---|---|---|
| Read | 120 requests/min | All GET requests |
| Write | 30 requests/min | POST, PATCH, DELETE requests |
| Save | 10 requests/min | POST /v1/items (saving new URLs) |
| Search | 30 requests/min | GET /v1/search |
| Markdown | 20 requests/min | GET requests with ?include=markdown |
| Burst | 5 requests/sec | All requests (short-term ceiling) |
Rate limit headers
Every response includes headers showing your current quota:| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the current window. |
X-RateLimit-Remaining | Requests remaining in the current window. |
X-RateLimit-Reset | Unix timestamp (seconds) when the window resets. |
Handling 429 responses
When you exceed the limit, the API returns429 Too Many Requests with a Retry-After header:
Recommended retry strategy
Best practices
Use incremental sync instead of full fetches
Use incremental sync instead of full fetches
The
updated_since parameter on list endpoints dramatically reduces the number of requests needed to stay in sync. Fetch everything once, then sync only changes.Use larger page sizes
Use larger page sizes
Set
limit=100 (the maximum) to reduce the number of requests needed to paginate through results.Cache responses locally
Cache responses locally
Store items locally and only refetch when needed. The
updated_at field tells you if an item has changed.Batch your writes
Batch your writes
If you’re tagging many items, space your requests rather than firing them all at once.