> ## Documentation Index
> Fetch the complete documentation index at: https://docs.screenshotly.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Full-page captures

> Capture the entire scrollable length of a webpage, not just the visible viewport.

By default, Screenshotly captures only the visible viewport. Set `full_page` to `true` to capture the entire scrollable page.

## Basic usage

<CodeGroup>
  ```javascript JavaScript SDK theme={null}
  const screenshot = await client.capture({
    url: 'https://example.com',
    full_page: true
  });
  ```

  ```python Python theme={null}
  response = requests.post(
      'https://api.screenshotly.dev/v1/capture',
      headers={
          'X-API-Key': API_KEY,
          'Content-Type': 'application/json'
      },
      json={
          'url': 'https://example.com',
          'options': {
              'full_page': True
          }
      }
  )
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.screenshotly.dev/v1/capture \
    -H "X-API-Key: $SCREENSHOTLY_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com",
      "options": { "full_page": true }
    }' \
    --output screenshot.png
  ```
</CodeGroup>

## How it works

When `full_page` is `true`, the browser scrolls through the entire page and stitches the result into a single image. The `viewport_width` parameter still controls the viewport width used for rendering, but `viewport_height` is overridden by the actual page height.

<Note>
  Full-page screenshots can be significantly larger in file size and take longer to process than viewport-only captures.
</Note>

## Scroll options

For pages with lazy-loaded content, use the scroll options to ensure all content loads before capturing:

| Option                   | Type    | Default | Description                                        |
| ------------------------ | ------- | ------- | -------------------------------------------------- |
| `full_page_scroll`       | boolean | —       | Scroll through the page before capturing           |
| `full_page_scroll_delay` | integer | 400     | Milliseconds to wait between scroll steps (0–5000) |
| `full_page_scroll_by`    | integer | —       | Pixels to scroll per step (0–5000)                 |
| `full_page_max_height`   | integer | —       | Maximum capture height in pixels (0–50000)         |

```bash theme={null}
curl -X POST https://api.screenshotly.dev/v1/capture \
  -H "X-API-Key: $SCREENSHOTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/infinite-scroll",
    "options": {
      "full_page": true,
      "full_page_scroll": true,
      "full_page_scroll_delay": 500,
      "full_page_max_height": 20000
    }
  }' \
  --output screenshot.png
```

## Combining with other options

Full-page captures work with all other parameters:

```javascript theme={null}
const screenshot = await client.capture({
  url: 'https://example.com/long-article',
  full_page: true,
  format: 'jpeg',
  viewport_width: 1440,
  delay: 2000,              // wait for lazy-loaded content
  device_scale_factor: 2    // retina quality
});
```

<Tip>
  If the page has lazy-loaded images or infinite scroll, enable `full_page_scroll` or use the `delay` parameter to ensure all content loads before capture. See [delays and selectors](/guides/delays-and-selectors).
</Tip>
