Skip to main content
Screenshotly enforces rate limits to ensure fair usage and service reliability.

Limits by plan

PlanMonthly screenshotsRate limit
Free100Limited
Starter5,000Basic
Pro25,000Priority
Business75,000Highest priority
Rate limits are applied per API key. Check your current usage in the dashboard.

429 Too Many Requests

When you exceed your rate limit, the API returns a 429 status code:
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Please slow down."
}

Handling rate limits

Check remaining credits

The API response includes your remaining credits:
const screenshot = await client.capture({ url: 'https://example.com' });

if (screenshot.success) {
  console.log('Remaining credits:', screenshot.remainingCredits);
}

Exponential backoff

When you receive a 429 response, wait before retrying:
async function captureWithBackoff(client, options) {
  const maxRetries = 5;

  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const result = await client.capture(options);

    if (result.success) return result;
    if (result.statusCode !== 429) throw new Error(result.error);

    const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s, 8s, 16s
    console.log(`Rate limited. Retrying in ${delay}ms...`);
    await new Promise(resolve => setTimeout(resolve, delay));
  }

  throw new Error('Rate limit retry attempts exhausted');
}

Best practices

  • Monitor usage — check your remaining credits before large batch operations
  • Stagger requests — spread requests over time instead of sending them all at once
  • Use batch processing — the batch endpoint is more efficient than individual requests
  • Upgrade your plan — if you consistently hit limits, consider upgrading at pricing
  • Cache results — store screenshot URLs and reuse them instead of recapturing the same pages