--- layout: page title: Jumbo Images permalink: /guides/advanced/jumbo-images/ parent: Advanced grand_parent: Guides nav_order: 6 description: >- Render large images without reducing quality by splitting into tiles and stitching them together. --- # Jumbo Images {: .no_toc } {: .fs-9 } Render large screenshots without reducing quality by splitting and stitching tiles. {: .fs-6 .fw-300 }
1. TOC {:toc}
## What are jumbo images? Rendering really tall or wide html (~ 8,000px) causes quality to degrade. Most images don't reach these extremes, and when they do - we'll scale down your image to fit and prevent unwanted behavior. Jumbo images allow you to scale beyond this without sacrificing quality. When you set `jumbo_max_width` and `jumbo_max_height`, the API lets you generate images up to **80,000 pixels** on a side. ### Why jumbo matters The big win is **quality**. Jumbo lets you produce huge images **without losing sharpness**: - Your `device_scale` is preserved end-to-end. A `2x` retina render stays `2x` — even at 40,000 pixels wide. - Each tile is rendered natively in Chrome at full resolution, then stitched. There's no resampling or post-render shrinking. - Crisp text, vector edges, and 1px borders that would normally turn fuzzy on huge canvases stay clean. {% include hint.md title="Without jumbo, large images get downscaled" text="If your output would naturally exceed ~8000px and you **don't** set the jumbo params, the API automatically scales the image down to fit Chrome's limit and avoid duplication issues.
This manifests as a **blurry, lower-resolution image** — text gets soft, fine lines smear, and high `device_scale` values stop helping.
If your render is anywhere near 8000px on either side, set `jumbo_max_width` and `jumbo_max_height` to keep it sharp." %} ### When to use it - Long marketing pages, full-site captures, or scrollable dashboards. - Print-resolution posters, signage, or banners. - Wide infographics, timelines, charts, or data tables. - Retina (`device_scale: 2` or `3`) renders of medium-sized pages where `width * device_scale` would already cross 8000px. - Any HTML or URL screenshot where the natural output exceeds ~8000px. Jumbo works with both `html`/`css` and `url` requests. You can apply jumbo params on [Templates](/getting-started/templates) as well.
## Parameters | Parameter | Type | Description | |:----------|:-----|:------------| | `jumbo_max_width` | `Integer` | Maximum output width, in pixels. Range: `1` – `80000`. **Required** when `jumbo_max_height` is set. | | `jumbo_max_height` | `Integer` | Maximum output height, in pixels. Range: `1` – `80000`. **Required** when `jumbo_max_width` is set. | Both parameters must be set together. Setting one without the other returns a `400`. These are **maximums**, not exact dimensions. If your content is smaller than the max, you get a smaller image. If it's larger, the renderer scales down to fit (see [How it works](#how-it-works)).
## How it works When you pass `jumbo_max_width` and `jumbo_max_height`, the renderer: 1. Measures the natural size of your page (or `selector` element) at the requested `device_scale`. 2. If that natural size fits inside `jumbo_max_width` x `jumbo_max_height`, it renders at full resolution. 3. If it doesn't fit, it picks the largest scale that **preserves the aspect ratio** and stays inside both maxes. 4. Splits the output into **8000 x 8000 tiles**. 5. Renders each tile separately in Chrome. No scrolling, no need to worry about sticky elements. 6. Stitches the tiles back into a single image and uploads the result. The result is a single large screenshot. {% include hint.md title="Jumbo is measured after device_scale is applied." text="If you expect your final image to be `5,000` x `2,000` and you want a crisp retina image, you should set your jumbo max to at least `10,000` x `4,000`." %}
## Limits | Rule | Limit | |:-----|:------| | Max value per dimension | `80,000` pixels | | Min value per dimension | `1` pixel | | At least one dimension must exceed | `8,000` pixels | | Max total area (`width * height`) | `400,000,000` pixels | | Compatible with `pdf_options` | No — jumbo is image-only | The "at least one dimension must exceed 8,000" rule exists because anything smaller fits in a single tile and should use a normal render instead. The 400-million-pixel area cap means you can't max out both dimensions at once. Some valid combinations at the limit: - `80,000 x 5,000` - `40,000 x 10,000` - `20,000 x 20,000` - `12,500 x 32,000`
## Billing Jumbo images consume one additional image credit per tile. The number of tiles is calculated from the **maximum specified size**. When used with `ms_delay`, the [standard `ms_delay` multiple](/parameters/ms_delay#credit-usage) is applied only to the base image, not to the image credits for additional tiles. ### Examples | Jumbo size | `ms_delay` | Total Tiles | Image credits billed | |:------------------|:-----------|:-----------:|:--------------:| | `8,001 x 8,001` | | 4 | 5 | | `12,000 x 4,000` | | 2 | 3 | | `16,000 x 1,000` | `6000` | 2 | 4 | | `24,000 x 16,000` | | 6 | 7 | | `80,000 x 5,000` | | 10 | 11 | | `16,000 x 16,000` | `7000` | 4 | 6 |
## Examples ### HTML render ```json { "html": "
", "jumbo_max_width": 12000, "jumbo_max_height": 8100, "selector": "#big-div" } ``` ### URL render ```json { "url": "https://example.com/long-marketing-page", "jumbo_max_width": 2000, "jumbo_max_height": 30000, "full_screen": true } ``` ### Render a specific large element Combine `selector` with jumbo to capture one giant element on a page. ```json { "html": "... lots of content ...
...
", "selector": "#poster", "jumbo_max_width": 10000, "jumbo_max_height": 18000, "device_scale": 2 } ``` ### cURL ```bash curl -X POST https://hcti.io/v1/image \ -u 'user-id:api-key' \ -H 'Content-Type: application/json' \ -d '{ "url": "https://example.com", "jumbo_max_width": 12000, "jumbo_max_height": 8100, "full_screen": true }' ```
## Troubleshooting ### `jumbo_max_width must be present when jumbo_max_height is specified.` Both params are required together. Add the missing one. ### `jumbo_max_height or jumbo_max_width should be greater than 8000` At least one dimension must be `> 8000`. If both are `<= 8000`, drop the jumbo params and use a normal render — it will be cheaper and faster. ### `total jumbo pixel area cannot be greater than 400,000,000.` `jumbo_max_width * jumbo_max_height` exceeds the 400M area cap. Reduce one or both dimensions. ### `cannot set pdf_options and jumbo options together` Jumbo is image-only (PNG / JPG / WebP). Remove `pdf_options` if you want a jumbo render. ### My image came back smaller than `jumbo_max_width` x `jumbo_max_height` Those parameters are **maximums**. If your content is naturally smaller, the output will be smaller too. If your content is larger, the renderer downscales to fit while preserving aspect ratio — so the output matches one dimension exactly and is shorter on the other axis. ### My large image is blurry (and I'm not using jumbo parameters) When a render naturally exceeds ~8000px and `jumbo_max_width` / `jumbo_max_height` are not set, the API scales the image down to fit Chrome's limit. The result is a single-resolution image that no longer matches your `device_scale`, which usually looks blurry — especially text and thin lines. Fix: set `jumbo_max_width` and `jumbo_max_height` to the size you actually want. The renderer will tile and stitch instead of downscaling, and your `device_scale` will be preserved. #### For example: If your final image is 10,000 px tall, the effective device_scale will be 0.8 to fit it within the 8000px boundary. If you're expecting a readable, sharp image - you need jumbo. ### Why did this cost N image credits? See [Billing](#billing). The image credit count is `1 + ceil(width / 8000) * ceil(height / 8000)` based on the **maximum output size**, plus any [`ms_delay` image credit cost](/parameters/ms_delay#credit-usage). The dashboard usage view shows the image credit count for each image. ### Why does jumbo cost more? Jumbo images require significantly more resources than a standard image to render, stitch and store. {% include code_footer.md version=1 %}