Rate limits, usage and plans
Shotvik is in private beta and free to use during the beta. Paid plans are coming soon.
Limits per account
Section titled “Limits per account”- Per-minute rate limit: the number of requests per minute for your account. Above it, you get
429 rate_limited. Your limit is in theX-RateLimit-Limitheader and inGET /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 isplan.max_concurrentinGET /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.
How usage is counted
Section titled “How usage is counted”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, including502 target_unreachableand503 queue_timeout); - blocked or refused requests (
403 url_blocked, validation and authentication errors,429rate-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_exceededuntil the next period. - No overage. Overage isn’t available, so the monthly limit stays hard and
GET /v1/usagereportsoverage_enabled: false.
Usage and rate-limit headers
Section titled “Usage and rate-limit headers”| 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).
Checking your usage: GET /v1/usage
Section titled “Checking your usage: GET /v1/usage”curl https://api.shotvik.com/v1/usage -H "Authorization: Bearer $SHOTVIK_API_KEY"The response contains:
account_idandkey_id;plan, withid,name,monthly_quota,per_minute,max_concurrent,overage_allowedandqueue_priority;overage_enabled;period, withmonth(YYYY-MM, UTC),starts_atandresets_at(00:00 UTC on the first day of this and next month);used,remainingandoverage_renders;history: a list of{month, renders}entries.
Per-request limits
Section titled “Per-request limits”| 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