Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.blinkpdf.io/llms.txt

Use this file to discover all available pages before exploring further.

Blink PDF enforces rate limits to keep rendering quality consistent and fair for every customer. Limits are applied per API key and reset on a rolling basis. This page explains what each limit means, how to stay within it, and what to do when you hit one.

Limits by Plan

PlanSustained RateConcurrencyDaily CapMax Input Size
Free5 / min150 / day256 KB
Starter30 / min31 MB
Pro120 / min102 MB
Business600 / min405 MB
Scale~5,000 / min (fair-use)Per capacity10 MB
EnterpriseCustomDedicatedCustom

Understanding Each Limit

Sustained Rate

The sustained rate is the maximum number of render requests you can make in any 60-second window. Short bursts slightly above this rate may succeed, but requests that consistently exceed it will receive 429 Too Many Requests responses.

Concurrency

Concurrency controls how many render jobs can be in-flight simultaneously on your account. A request occupies a concurrency slot from the moment the server accepts it until the PDF response is returned. If you hit the concurrency ceiling, new requests block until a slot frees up or return 429 depending on your client configuration.
If you need to render many PDFs quickly, pipeline your requests up to your concurrency limit rather than sending them sequentially. For example, a Pro account can keep 10 renders running at once, which is far more efficient than waiting for each one to finish before starting the next.

Daily Cap (Free Plan Only)

Free accounts are capped at 50 PDFs per day in addition to the 500/month quota. The daily cap resets at midnight UTC. Paid plans have no daily cap — only the monthly quota and rate limits apply.

Max Input Size

The maximum size of the Markdown payload (plus any embedded assets) you can send in a single request. Requests that exceed this limit receive 413 Payload Too Large.
Input size limits apply to the request body, not the final PDF file size. A 1 MB Markdown document with embedded images can produce a PDF larger than 1 MB, and that’s fine.

What Counts Toward Your Quota

Only successful PDF renders consume your monthly quota. A render is counted only when the API returns a valid PDF response (HTTP 200).

What Does NOT Count

The following are always free and never affect your quota or rate limit counters:
  • GET /health and any health-check endpoints
  • GET /fonts and font listing calls
  • Account management and admin API calls
  • Requests that return any error status (400, 401, 403, 413, 429, 5xx)
  • Retried requests that ultimately fail

Handling HTTP 429 Too Many Requests

When you exceed your rate limit, the API responds with:
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1720000060
Content-Type: application/json

{
  "error": "rate_limit_exceeded",
  "message": "You have exceeded the sustained rate limit for your plan.",
  "retry_after_seconds": 12
}

Retry Strategy

Use exponential backoff with jitter when retrying after a 429. A simple recipe:
wait = base_delay * (2 ^ attempt) + random_jitter
For example, in Python:
import time
import random
import httpx

def render_pdf(client, payload, max_attempts=5):
    base_delay = 1.0  # seconds

    for attempt in range(max_attempts):
        response = client.post("/v1/render", json=payload)

        if response.status_code == 200:
            return response.content

        if response.status_code == 429:
            retry_after = int(response.headers.get("Retry-After", base_delay))
            jitter = random.uniform(0, 1)
            wait = max(retry_after, base_delay * (2 ** attempt)) + jitter
            time.sleep(wait)
            continue

        response.raise_for_status()

    raise RuntimeError("Exceeded maximum retry attempts")
Always respect the Retry-After header value. Retrying immediately after a 429 will not succeed and may result in your key being temporarily throttled further.

Monthly Spending Cap

On Starter and Pro plans, you can set a configurable monthly spending cap in your account dashboard. When your usage reaches the cap:
  • The API returns a clear 403 error with the reason spending_cap_reached
  • No further charges are incurred for that billing period
  • The cap resets automatically at the start of your next billing cycle
The spending cap is optional. If you don’t set one, your account follows soft overage billing — you’re never cut off, but overage charges apply beyond your included quota.

Upgrading for Higher Limits

If you consistently hit rate or concurrency limits, the most effective solution is to upgrade your plan. Limits increase significantly with each tier. Need limits beyond what Scale offers? Contact our team to discuss an Enterprise arrangement with dedicated capacity and custom throughput agreements.