Get API key

Rate Limits

Rate limits protect the API and ensure fair usage. Limits are applied per API key.

Plan Limits

PlanMonthly CallsRate LimitAt the cap
Free1003 req/minHard cap — HTTP 429
Basic ($19/mo)40010 req/minHard cap — HTTP 429
Starter ($69/mo)10,00060 req/minHard cap — HTTP 429
Pro ($179/mo)100,000300 req/minHard cap — HTTP 429
EnterpriseUnlimited1,000 req/minCustom SLA

Watermark by plan

Renders on the Freeplan carry a “rendex.dev” mark — a light watermark tiled across PNG/JPEG/WebP images (content stays readable underneath) and a footer line on PDFs. Every paid plan — starting with Basic ($19/month)— is fully watermark-free. Text extraction (/v1/extract) is never marked. The mark is rendered into the output server-side, so it can't be removed in code — it's gone the moment you upgrade. See Watermark by Plan for the full breakdown.

Rendex Watch limits

Rendex Watch (website change monitoring) shares your plan, API key, and credit pool — there is no separate subscription. Each scheduled check counts as one render call against your monthly cap. Your plan sets how many watches you can run and how often:

PlanWatchesFastest checkAlerts
Free1DailyEmail only
Basic ($19/mo)2Every 3 hoursEmail only
Starter ($69/mo)10Every 3 hoursEmail + webhook
Pro ($179/mo)50Every 30 minutesEmail + webhook
Enterprise1,000Every 5 minutesEmail + webhook

Separately, a single website (host) can have at most 10 active watches — an anti-abuse guardrail on every plan. This only matters on plans that allow more than 10 watches (Pro and Enterprise); on Free and Starter your plan's watch count is already at or below that limit, so it never applies.

If your shared credit pool runs out, scheduled watches pause (they are not deleted, just deactivated); resuming is manual — once you upgrade or your monthly cap resets, resume the watch from the dashboard and checks continue. See the Watch API reference for the full parameter set.

Rate Limit Headers

Every response includes rate limit information:

HeaderDescription
x-ratelimit-remainingRequests remaining in the current window
x-ratelimit-resetUnix timestamp when the rate limit resets
Retry-AfterSeconds to wait (only on 429 responses)

Retry Strategy

When you receive a 429 response:

  1. Read the Retry-After header for the wait time
  2. Wait the specified number of seconds
  3. Retry the request
  4. Use exponential backoff if retries continue to fail
async function captureWithRetry(url, apiKey, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const res = await fetch("https://api.rendex.dev/v1/screenshot", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${apiKey}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ url }),
    });

    if (res.status !== 429) return res;

    const retryAfter = parseInt(res.headers.get("Retry-After") || "1");
    await new Promise(r => setTimeout(r, retryAfter * 1000));
  }
  throw new Error("Rate limit exceeded after retries");
}
A backoff timeline for HTTP 429 responses: honor the Retry-After header, otherwise wait 1, 2, then 4 seconds with jitter until the request succeeds.

Using the SDK? The official SDKs throw typed errors with the status code and retry-after value, making retry logic simpler:

import { Rendex, RendexApiError } from "@copperline/rendex";

const rendex = new Rendex(process.env.RENDEX_API_KEY);
try {
  const { image } = await rendex.screenshot({ url: "https://example.com" });
} catch (err) {
  if (err instanceof RendexApiError && err.statusCode === 429) {
    // Rate limited — wait and retry
  }
}

Best Practices

  • Cache screenshots: Store results to avoid redundant API calls for the same URL.
  • Batch wisely: Space out bulk screenshot jobs rather than sending all requests simultaneously.
  • Monitor usage: Check your usage dashboard regularly to stay within plan limits.
  • Upgrade proactively: If you consistently hit limits, upgrade your plan for higher quotas.
Was this page helpful?