Credits and limits
Monthly credits, request limits, queue capacity, and output limits by plan.
Plan limits
| Plan | Credits/month | Per minute | Per hour | In flight |
|---|---|---|---|---|
| Free | 1,500 | 5 | 50 | 1 |
| Starter | 10,000 | 15 | 300 | 3 |
| Builder | 30,000 | 30 | 900 | 10 |
Shared render capacity
ViperCapture runs at most 3 browser renders at once. API requests have 2 reserved slots and may borrow the third while the website is idle; queued website work takes the next available slot and at most 1 website render runs at once. Separate queues accept 30 API and 10 website requests. Each account or guest IP may have only 1 active-or-queued website request. A queued request waits at most 60 seconds. A full or timed-out queue returns HTTP 503 with capture_queue_busy.
Website output delivery
Guest website captures return artifacts up to 10 MiB directly. Signed-in website image captures return files directly up to the plan limit: 10 MiB on Free, 25 MiB on Starter, and 50 MiB on Builder. If a signed-in Free or Starter image is larger than that direct limit but no larger than 50 MiB, ViperCapture places it in a temporary UploadThing cache and returns an unguessable public URL. The object is deleted after four hours. This temporary path applies only to PNG, JPEG, and WebP website captures; API responses, ZIP, PDF, HTML, Markdown, and metadata keep their normal plan limits.
Charging and refunds
A request reserves its weighted cost before browser work begins. A single image, video, HTML, Markdown, metadata, diagnostic, certified, or sliced output settles 1 credit; PDF settles 2. A two-image viewport pack settles 2 and a three-image pack settles 3. Packs render sequentially in one browser slot and one overall deadline. A failed, timed-out, or cancelled render releases its entire reservation automatically.
Opt-in API image caching keeps an exact account-scoped PNG, JPEG, or WebP render in UploadThing for 15 minutes. A cache miss has the normal one-credit image cost. Cached hits are paired account-wide: the first hit costs zero and opens a 15-minute pending half; a second hit in that window costs one credit and clears it. An unpaired hit remains free. Cache hits still consume API attempts but do not enter the browser queue.
Async job limits
Async image jobs share the same credits, attempt windows, per-account in-flight allowance, and browser scheduler. Active limits match plan concurrency: Free 1, Starter 3, and Builder 10 queued/running jobs; the global durable queue holds 30. A queued job that does not start within 15 minutes expires without charge. Successful results remain downloadable for four hours, and terminal job metadata is removed after 24 hours. Retryable failures use bounded backoff for at most 3 execution attempts, with a fresh credit reservation per attempt and no charge for failed attempts. Polling and downloads do not consume attempts; result delivery is capped at 2 transfers service-wide. Submission consumes an API attempt but not a render in-flight slot, allowing an exact idempotent replay to return the original running job; workers acquire in-flight capacity at execution time.
Rate-limit headers
Authenticated REST responses expose the structured-field RateLimit-Policy and RateLimit headers for the effective minute and hour attempt windows. Render responses also retain RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset for monthly-credit compatibility. HTTP 429 includes Retry-After. Agents should pause for that many seconds before retrying and should use the stable error code to distinguish attempt, concurrency, credit, and queue limits.
Referral credits
The referrer receives 120 credits after the referred account’s first successful payment. Rewards expire after 12 months and unused credits can be clawed back when the qualifying payment is refunded or reversed.