Skip to content

Rate limits, usage and plans

Shotvik is in private beta and free to use during the beta. Paid plans are coming soon.

  • Per-minute rate limit: the number of requests per minute for your account. Above it, you get 429 rate_limited. Your limit is in the X-RateLimit-Limit header and in GET /v1/usage (plan.per_minute).
  • Concurrent requests: the number of your account’s requests that can be in progress at the same time, across all your API keys. A request above the limit is refused right away with 429 too_many_concurrent_requests (it isn’t queued). Retry it once one of your running requests has finished. Your limit is plan.max_concurrent in GET /v1/usage.
  • Monthly quota: see below.

Shotvik also limits each target domain to 30 renders per minute across all customers, to protect the sites being rendered (429 target_rate_limited). The render queue is bounded; when it’s full you get 429 queue_full. All 429 responses carry Retry-After.

A request counts toward your monthly quota when we return an image or PDF that we rendered for that request. This includes pages where the target site itself answered with an HTTP 4xx or 5xx status: you get the rendered page (with the status in X-Target-Status), and it counts.

These don’t count:

  • requests that time out (504);
  • errors on our side (5xx, including 502 target_unreachable and 503 queue_timeout);
  • blocked or refused requests (403 url_blocked, validation and authentication errors, 429 rate-limit, concurrency, quota and queue rejections);
  • responses served from your opt-in cache (X-Cache: HIT).

Cache hits still count toward the per-minute rate limit.

The rules:

  • The period is the calendar month (UTC). Usage resets at 00:00 UTC on the first day of the month.
  • Hard limit. When you reach your quota, requests get 429 monthly_quota_exceeded until the next period.
  • No overage. Overage isn’t available, so the monthly limit stays hard and GET /v1/usage reports overage_enabled: false.
Header Meaning
X-RateLimit-Limit Your requests-per-minute limit.
X-RateLimit-Remaining Requests left in the current window.
X-RateLimit-Reset Seconds until the window resets.
X-Usage-Limit Your monthly quota.
X-Usage-Used Counted renders this month, including this one.
X-Usage-Remaining Renders left this month.
X-Usage-Overage true when a render is billed as overage. Overage isn’t available, so this header isn’t sent.
Retry-After On 429 and 503: seconds to wait.

The X-Usage-* headers are on every successful render response, including cache hits (which don’t change your usage).

Terminal window
curl https://api.shotvik.com/v1/usage -H "Authorization: Bearer $SHOTVIK_API_KEY"

The response contains:

  • account_id and key_id;
  • plan, with id, name, monthly_quota, per_minute, max_concurrent, overage_allowed and queue_priority;
  • overage_enabled;
  • period, with month (YYYY-MM, UTC), starts_at and resets_at (00:00 UTC on the first day of this and next month);
  • used, remaining and overage_renders;
  • history: a list of {month, renders} entries.
Limit Value
Render timeout (total, including delay_ms) 30 s
delay_ms max 10,000 ms
Viewport (width × height) 100–3840 × 100–3840 CSS px
Full-page capture max 16,384 px height and 50 megapixels
device_scale_factor 1–3
HTML input (html and css together) max 1,048,576 bytes
URL length max 4,096 characters
Downloaded bytes per render max 26,214,400 (25 MiB)
Sub-requests per render max 400
Redirects max 5
Ports 80 and 443 only
WebSockets during renders blocked
OG template variables max 30, each max 1,000 characters
Opt-in cache TTL 60 s – 30 days (provisional), default 1 day

When you hit a limit, see Errors.

Shotvik is in private beta. Request access: support@shotvik.com · Privacy