evernote-rate-limits
Implements error handling and exponential backoff to manage Evernote API rate limit exceptions.
Install
mkdir -p .claude/skills/evernote-rate-limits && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8868" && unzip -o skill.zip -d .claude/skills/evernote-rate-limits && rm skill.zipInstalls to .claude/skills/evernote-rate-limits
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Handle Evernote API rate limits effectively.Key capabilities
- →Catch EDAMSystemException for rate limit handling
- →Implement exponential backoff for API retries
- →Add configurable delays between API calls
- →Process batch operations with progress tracking
- →Monitor rate limit hits and request statistics
How it works
It wraps API calls in a handler that detects rate limit errors, waits for the specified duration, and retries the operation using exponential backoff.
Inputs & outputs
When to use evernote-rate-limits
- →Implementing rate limit handling
- →Optimizing API usage
- →Troubleshooting rate limit errors
- →Adding retry logic to API calls
About this skill
Evernote Rate Limits
Overview
Evernote enforces rate limits per API key, per user. When exceeded, the API throws EDAMSystemException with errorCode: RATE_LIMIT_REACHED and rateLimitDuration (seconds to wait). Production integrations must handle this gracefully.
Prerequisites
- Evernote SDK setup
- Understanding of async/await patterns
- Error handling implementation
Instructions
Step 1: Rate Limit Handler
Catch EDAMSystemException and check for rateLimitDuration. Implement exponential backoff: wait the specified duration, then retry. Track retry attempts to avoid infinite loops.
async function withRateLimitRetry(operation, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await operation();
} catch (error) {
if (error.rateLimitDuration && attempt < maxRetries - 1) {
const waitMs = error.rateLimitDuration * 1000;
console.log(`Rate limited. Waiting ${error.rateLimitDuration}s...`);
await new Promise(r => setTimeout(r, waitMs));
continue;
}
throw error;
}
}
}
Step 2: Rate-Limited Client Wrapper
Wrap the NoteStore with a class that adds configurable delays between API calls. Use a request queue to prevent bursts. Track request timestamps for monitoring.
class RateLimitedClient {
constructor(noteStore, minDelayMs = 100) {
this.noteStore = noteStore;
this.minDelayMs = minDelayMs;
this.lastRequestTime = 0;
}
async call(method, ...args) {
const elapsed = Date.now() - this.lastRequestTime;
if (elapsed < this.minDelayMs) {
await new Promise(r => setTimeout(r, this.minDelayMs - elapsed));
}
this.lastRequestTime = Date.now();
return withRateLimitRetry(() => this.noteStoremethod);
}
}
Step 3: Batch Operations with Rate Limiting
Process items sequentially with delay between each operation. On rate limit, wait and retry the failed item. Report progress via callback. Collect successes and failures.
Step 4: Avoiding Rate Limits
Strategies to minimize API calls: cache listNotebooks() and listTags() results, use findNotesMetadata() instead of getNote() for listings, request only needed fields in NotesMetadataResultSpec, batch reads with sync chunks instead of individual fetches.
Step 5: Rate Limit Monitoring
Track request counts, rate limit hits, average response times, and wait times. Log statistics periodically to identify optimization opportunities.
For the complete rate limiter, batch processor, monitoring dashboard, and optimization examples, see Implementation Guide.
Output
- Automatic retry with exponential backoff on rate limit errors
- Request queue with configurable minimum delay between calls
- Batch processor with progress tracking and failure collection
- Rate limit monitoring with request/error statistics
- API call optimization strategies (caching, metadata-only queries)
Error Handling
| Scenario | Response |
|---|---|
| First rate limit hit | Wait rateLimitDuration seconds, retry |
| Repeated rate limits | Increase minDelayMs, reduce batch size |
| Rate limit during sync | Pause sync, wait, resume from last USN |
| Rate limit on initial setup | Request rate limit boost from Evernote support |
Resources
- Rate Limits Overview
- API Best Practices
- Webhooks (reduce polling)
Next Steps
For security considerations, see evernote-security-basics.
Examples
Batch note export: Export 1,000 notes with 200ms delay between API calls and automatic retry on rate limits. Track progress and report failures at the end.
High-throughput sync: Use getFilteredSyncChunk() to fetch changes in bulk (100 entries per call) instead of individual getNote() calls, reducing API call count by 100x.
When not to use it
- →When ignoring rate limit duration headers
- →When performing high-frequency API calls without delays
Prerequisites
Limitations
- →Requires rate limit boost from Evernote support for initial setup if limits are too low
How it compares
It automates the retry logic and request queuing, whereas a standard implementation would require manual error handling for every API call.
Compared to similar skills
evernote-rate-limits side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| evernote-rate-limits (this skill) | 0 | 27d | No flags | Intermediate |
| posthog-common-errors | 1 | 27d | Caution | Intermediate |
| paypal-integration | 10 | 2mo | No flags | Intermediate |
| shopify-apps | 1 | 4mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
posthog-common-errors
jeremylongshore
Diagnose and fix PostHog common errors and exceptions. Use when encountering PostHog errors, debugging failed requests, or troubleshooting integration issues. Trigger with phrases like "posthog error", "fix posthog", "posthog not working", "debug posthog".
paypal-integration
wshobson
Integrate PayPal payment processing with support for express checkout, subscriptions, and refund management. Use when implementing PayPal payments, processing online transactions, or building e-commerce checkout flows.
shopify-apps
alinaqi
Shopify app development - Remix, Admin API, checkout extensions
ccxt-typescript
ccxt
CCXT cryptocurrency exchange library for TypeScript and JavaScript developers (Node.js and browser). Covers both REST API (standard) and WebSocket API (real-time). Helps install CCXT, connect to exchanges, fetch market data, place orders, stream live tickers/orderbooks, handle authentication, and manage errors. Use when working with crypto exchanges in TypeScript/JavaScript projects, trading bots, arbitrage systems, or portfolio management tools. Includes both REST and WebSocket examples.
convex
waynesutton
Umbrella skill for all Convex development patterns. Routes to specific skills like convex-functions, convex-realtime, convex-agents, etc.
evernote-enterprise-rbac
jeremylongshore
Implement enterprise RBAC for Evernote integrations. Use when building multi-tenant systems, implementing role-based access, or handling business accounts. Trigger with phrases like "evernote enterprise", "evernote rbac", "evernote business", "evernote permissions".