Devices reference
A device preset sets several viewport properties with one id. It is the fastest way to get a realistic phone, tablet or laptop capture. This page lists all 15 devices, the size of the image each one produces, and what a device changes in the browser. It is part of the API documentation. For when to use a device and when a custom viewport is better, read the mobile screenshots guide.
Use a device
GET, with a flat query parameter:
curl -G https://api.renderscreenshot.com/v1/screenshot \ -H "Authorization: Bearer $RS_API_KEY" \ -d url=https://example.com \ -d device=iphone_14 \ -o phone.png
POST, with device at the top level of the body, next to url:
{ "url": "https://example.com", "device": "iphone_14" }
Keep device at the top level. In the current API version, a request that nests it as viewport.device passes validation but renders at the default 1280 x 800 desktop viewport.
With the Node.js and Python SDKs (client and TakeOptions as set up in the SDK docs):
// Node.js const image = await client.take(TakeOptions.url('https://example.com').device('iphone_14'));
# Python image = client.take(TakeOptions.url('https://example.com').device('iphone_14'))
All devices
The output size is the image you get from a viewport capture: CSS viewport times scale, rounded to whole pixels. We measured it by repeating the renderer's viewport step for each device in Chrome (see the method note below).
| id | Name | CSS viewport | Scale | Output (px) | Mobile |
|---|---|---|---|---|---|
| Phones | |||||
iphone_14_pro |
iPhone 14 Pro | 393 x 852 | 3 | 1179 x 2556 | yes |
iphone_14 |
iPhone 14 | 390 x 844 | 3 | 1170 x 2532 | yes |
iphone_13 |
iPhone 13 | 390 x 844 | 3 | 1170 x 2532 | yes |
iphone_se |
iPhone SE | 375 x 667 | 2 | 750 x 1334 | yes |
pixel_7 |
Google Pixel 7 | 412 x 915 | 2.625 | 1082 x 2402 | yes |
pixel_7_pro |
Google Pixel 7 Pro | 412 x 892 | 3.5 | 1442 x 3122 | yes |
samsung_galaxy_s23 |
Samsung Galaxy S23 | 360 x 780 | 3 | 1080 x 2340 | yes |
| Tablets | |||||
ipad_pro_12 |
iPad Pro 12.9" | 1024 x 1366 | 2 | 2048 x 2732 | yes |
ipad_pro_11 |
iPad Pro 11" | 834 x 1194 | 2 | 1668 x 2388 | yes |
ipad_air |
iPad Air | 820 x 1180 | 2 | 1640 x 2360 | yes |
| Laptops and desktops | |||||
macbook_pro_14 |
MacBook Pro 14" | 1512 x 982 | 2 | 3024 x 1964 | no |
macbook_pro_16 |
MacBook Pro 16" | 1728 x 1117 | 2 | 3456 x 2234 | no |
macbook_air |
MacBook Air | 1470 x 956 | 2 | 2940 x 1912 | no |
imac_24 |
iMac 24" | 2240 x 1260 | 2 | 4480 x 2520 | no |
surface_pro_8 |
Surface Pro 8 | 1440 x 960 | 2 | 2880 x 1920 | no |
iphone_14 and iphone_13 share a viewport. They differ only in the iOS version in the user agent. GET /v1/devices returns this list from the API, and it is the list the API validates against. See list devices.
What a device sets, and what it does not
| Property | Set by the device? | Notes |
|---|---|---|
| Viewport width and height | Yes | CSS pixels, as in the table |
| Device scale factor | Yes | Multiplies the output size. The large scale of pixel_7_pro makes the biggest phone images |
| Mobile emulation | Yes, for phones and tablets | Applies the page's <meta name="viewport"> tag, the way a real phone does |
| User agent | Yes | The device's own browser string, so sites that choose a template on the server send the mobile HTML |
| Touch | Yes | The device's has_touch is applied as viewport.touch |
| Orientation | Partly | viewport.landscape: true sets the browser's landscape flag but does not swap width and height. Swap them yourself, as below |
Override part of a device
Explicit viewport values win over the device. Everything you do not set still comes from the device. This request keeps the iPhone 14 scale, mobile mode and user agent, and turns the viewport to landscape:
{ "url": "https://example.com", "device": "iphone_14", "viewport": { "width": 844, "height": 390 } }
The same rule gives you a smaller file: add "scale": 1 to viewport to keep the phone layout at one third of the pixel width of a scale 3 device. The retina screenshots guide covers the cost of a high scale.
Unknown device ids
A device id that is not in the list fails before any rendering, so a typo never uses a credit:
{ "error": { "type": "validation_error", "code": "invalid_device", "message": "Unknown device 'iphone_15'. Use GET /v1/devices to see available devices.", "param": "device", "retryable": false, "docs": "https://renderscreenshot.com/docs/errors/error-codes" }, "request_id": "3f1c9a52-7d4e-4b8a-9e21-6c0d5b7a8f13" }
The device record
Each entry from GET /v1/devices has this shape:
{ "id": "pixel_7", "name": "Google Pixel 7", "viewport": { "width": 412, "height": 915, "device_scale_factor": 2.625, "is_mobile": true, "has_touch": true }, "user_agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36" }
For a device that is not in the list, set viewport.width, viewport.height, viewport.scale and viewport.mobile, and send the device's user agent in browser.user_agent. The viewport parameters list the limits.
Method, 2026-10-15: we read the 15 device records from the API source and repeated the renderer's viewport step for each one (page.setViewport with width, height, scale and mobile, plus the device user agent) in Puppeteer 24.43.1 with Chrome Headless Shell, then captured https://example.com. The output column is the PNG size from that run. The touch result comes from matchMedia('(pointer: coarse)') in the same run. The override and viewport.device behaviour come from the API's parameter code with the same inputs. These are not API renders.
See also
- Mobile screenshots: when width alone is not enough
- Presets: the
mobileandmobile_landscapepresets, which also set format and cache - List devices: the endpoint behind this table