Screenshots 

Screenshot any website.
=======================

screeenly opens your URL in a real Chrome browser and sends back a PNG, JPEG or WebP. Pick the viewport, wait for lazy images, capture the full page or a single element.

 [ Start for free → ](https://3.screeenly.com/app/register) [ Try the playground ](https://3.screeenly.com/playground) 

    your-site.com 

 selector=#pricing 

  01 · Send a URL POST the address to `/v1/shots` with your API token and any options you need.

 02 · Chrome renders it A fresh browser loads the page, runs its JavaScript and waits as long as you ask it to.

 03 · Download the file The response contains a `shot_url`. We host the file for 24 hours.

    API requests handled 21,732,869   Launched as open source July 2014 

Every request runs in real Chrome. Revenue, customers and usage are public too.

 [See the open startup numbers →](https://3.screeenly.com/open) 

  [Options](#options) [Code examples](#code) [Pages behind a login](#protected) [Use cases](#use-cases) [Questions](#faq) 

Every option you need
---------------------

 Options are plain form fields. Send only the ones you care about. The most used ones are below, and the [API reference](https://docs.3.screeenly.com/) lists all of them. The free plan has [lower maximums](https://3.screeenly.com/pricing#free-plan).

 ParameterWhat it does  `url`The page to capture. Must start with http or https. `file_type` `png`, `jpg` or `webp`. `quality`Image quality from 1 to 100 for `jpg` and `webp`. Lower values give smaller files. `window_width` `window_height`Size of the browser window in pixels, up to 10,000. `full_page`Capture the whole scrollable page instead of only the first screen. `selector`Capture one element, such as `#pricing`, instead of the page. `device_scale_factor`Pixel density. Use 2 for sharp screenshots on retina displays. `delay`Wait this many milliseconds before the capture, up to 30,000. `wait_until_network_idle`Wait until the page has stopped loading resources. `wait_for_selector`Wait until an element, such as `#content`, exists before the capture. `css_media_type`Render with `screen` or `print` styles. `color_scheme`Capture the `light` or `dark` version of a page that supports dark mode. `disable_images`Load the page without images. `block_urls` `block_domains`Skip requests to URLs that contain one of these strings, or to these domains, such as ad or tracking scripts. `dismiss_dialogs`Close JavaScript alerts and confirms that would block the capture. `cache` `cache_ttl`Identical requests return the stored result for free. With a plan or credits you can turn this off with `cache=0`, or keep results for 1 minute up to 24 hours.  

Code examples
-------------

 curl 

```
curl --request POST \
  --url https://3.screeenly.com/api/v1/shots \
  --header "authorization: Bearer $token" \
  --data url=https://example.com \
  --data window_width=1440 \
  --data window_height=900
```

 php 

```
$response = Http::withToken($token)
    ->asForm()
    ->post('https://3.screeenly.com/api/v1/shots', [
        'url' => 'https://example.com',
        'window_width' => 1440,
        'window_height' => 900,
    ]);

$imageUrl = $response->json('data.shot_url');
```

The JSON response looks like this:

 response.json 

```
{
  "data": {
    "url": "https://example.com",
    "expires_at": "2026-10-02T14:30:00+00:00",
    "shot_url": "https://3.screeenly.com/…/shot.png"
  }
}
```

Pages behind a login
--------------------

 Send cookies, HTTP headers or basic authentication credentials with your request, and the browser uses them when it loads the page. That covers staging sites, admin screens and signed preview links.

Test before you spend requests

Add `test_request=1` to check your parameters. screeenly validates the request and returns a sample response without rendering a page.

What you can build with it
--------------------------

Link previews

Thumbnails for bookmarks, directories, link-in-bio pages and dashboards.

Visual monitoring

Capture a page every day and compare it with yesterday.

Evidence for agents

Let an AI agent attach a screenshot to a ticket, a pull request or a report.

Social cards

Render your own page at 1200×630 and use it as the share image.

screeenly is not a web scraper

screeenly loads pages the way a regular browser does. It cannot get past bot protection such as Cloudflare challenges, CAPTCHAs or other checks that decide a visitor is not human, and it does not try to. Use it on your own pages and on pages you are allowed to load.

Questions
---------

   How long are screenshots kept?  We host every file for 24 hours, or shorter if you set `cache_ttl`. The response includes the exact expiry time. Download the file if you need to keep it.

   Does it run JavaScript?  Yes. The page loads in a real Chrome, so single page applications render before the capture. Use `delay` or `wait_until_network_idle` for pages that load content late.

   Can I capture a full page that scrolls?  Yes. Set `full_page=1` and the whole scrollable page is captured. Full page screenshots need a plan or credits.

   What counts as one request?  Every call to the screenshot, PDF or rendered HTML endpoint that renders a page is one request, including renders that fail or time out. Captures through the MCP server count the same way. Results from the cache, test requests and requests that fail validation are free.

   Can screeenly get past Cloudflare or CAPTCHAs?  No. screeenly does not bypass bot protection, challenges or CAPTCHAs, and it is not meant for scraping. If a page shows a challenge to a normal browser visit, you will get the challenge page.

   More from screeenly [     PDFs ](https://3.screeenly.com/features/pdf) [     Your own HTML ](https://3.screeenly.com/features/your-own-html) [     Rendered HTML ](https://3.screeenly.com/features/rendered-html) [     MCP for agents New ](https://3.screeenly.com/features/mcp) [     OG image templates Soon ](https://3.screeenly.com/features/og-image-templates) [     No-code integrations Soon ](https://3.screeenly.com/features/no-code-integrations)
