---
title: Website Screenshot API - Full-Page Captures, Scrolling Video & PDF Output
version: 1.0.0
description: Capture full-page screenshots and videos of websites with advanced options like device simulation, custom code injection, cookie banner blocking, and scrollable content recording. Supports multiple output formats including PNG, JPEG, WebP, PDF, MP4, GIF, and WebM. Returns a screenshot URL, timestamps, format metadata, and all echoed parameters. Returns a 400 error for an invalid or missing url, and a 408 error if the capture exceeds the configured timeout.
openapi: 3.1.1
servers:
  - https://api.apifreaks.com/v1.0
paths: 1
operations: 1
schemas: 2
---

## Table of Contents

- [Website Screenshot API - Full-Page Captures, Scrolling Video & PDF Output v1.0.0](#website-screenshot-api-full-page-captures-scrolling-video-pdf-output-v100)
  - [Authentication](#authentication)
  - [Screenshot APIs](#screenshot-apis)
    - [websiteScreenshot](#websitescreenshot)
      - [Parameters](#parameters)
      - [Responses](#responses)
  - [Schemas](#schemas)
    - [ScreenshotResponse](#screenshotresponse)
    - [ErrorResponse](#errorresponse)



# Website Screenshot API - Full-Page Captures, Scrolling Video & PDF Output v1.0.0

Capture full-page screenshots and videos of websites with advanced options like device simulation, custom code injection, cookie banner blocking, and scrollable content recording. Supports multiple output formats including PNG, JPEG, WebP, PDF, MP4, GIF, and WebM. Returns a screenshot URL, timestamps, format metadata, and all echoed parameters. Returns a 400 error for an invalid or missing url, and a 408 error if the capture exceeds the configured timeout.

Base URLs:

* [https://api.apifreaks.com/v1.0](https://api.apifreaks.com/v1.0)

## Authentication

* API Key (ApiKeyAuthHeader)
    - Parameter Name: **X-apiKey**, in: header. Pass your API key via the X-apiKey request header.

* API Key (ApiKeyAuthQuery)
    - Parameter Name: **apiKey**, in: query. Pass your API key via the apiKey query parameter.

## Screenshot APIs

### websiteScreenshot

`GET /screenshot`

*Build screenshots the way real users see the web — not just what fits on the screen.*

Capture full-page screenshots and videos of websites with advanced options like device simulation, custom code injection, cookie banner blocking, and scrollable content recording.
Supports multiple output formats including JSON, image, GIF, MP4, and WebM.

#### Parameters

|Name|In|Type|Required|Description|
|---|---|---|---|---|
|format|query|string|false|Response format: 'json'.|
|output|query|string|false|Output format for screenshot results|
|file_type|query|string|false|File type for screenshot output|
|url|query|string|true|URLs to capture screenshots of|
|width|query|integer|false|Browser viewport width in pixels|
|height|query|integer|false|Browser viewport height in pixels|
|full_page|query|boolean|false|Capture a full-page screenshot|
|fresh|query|boolean|false|Bypass cache and take a fresh screenshot|
|no_cookie_banners|query|boolean|false|Remove cookie banners from the screenshot|
|enable_caching|query|boolean|false|Enable caching for repeated requests|
|block_ads|query|boolean|false|Block advertisements on the page|
|block_chat_widgets|query|boolean|false|Block chat widget scripts from loading|
|extract_text|query|boolean|false|Extract visible text from the page|
|extract_html|query|boolean|false|Extract HTML content of the page|
|destroy_screenshot|query|boolean|false|Auto-destroy screenshot after fetch|
|lazy_load|query|boolean|false|Enable lazy-loading content before screenshot|
|retina|query|boolean|false|Capture screenshot in high-DPI (Retina) mode|
|dark_mode|query|boolean|false|Render page in dark mode|
|block_tracking|query|boolean|false|Block common user-tracking scripts|
|enable_incognito|query|boolean|false|Enable private/incognito mode for browser session|
|omit_background|query|boolean|false|Omit background color (transparent background)|
|thumbnail_width|query|integer|false|Thumbnail width in pixels|
|adjust_top|query|integer|false|Adjust top in pixels|
|wait_for_event|query|string|false|Wait for a specific load event before capturing the screenshot.|
|grayscale|query|integer|false|Range:0 to 100 for grayscale filter|
|delay|query|integer|false|How many milliseconds to wait before taking the screenshot|
|timeout|query|integer|false|Maximum timeout in milliseconds. Defalut is `10,000`|
|ttl|query|integer|false|Number of seconds the screenshot should be cached|
|clip[x]|query|integer|false|X position of the clipping rectangle in pixels|
|clip[y]|query|integer|false|Y position of the clipping rectangle in pixels|
|clip[width]|query|integer|false|Width of the clipping rectangle in pixels|
|clip[height]|query|integer|false|Height of the clipping rectangle in pixels|
|css_url|query|string|false|URL to CSS file|
|css|query|string|false|Your custom CSS code|
|js_url|query|string|false|URL to JS file|
|js|query|string|false|Your JS code|
|block_js|query|boolean|false|Block Scripts|
|block_stylesheets|query|boolean|false|Block Stylesheets|
|block_images|query|boolean|false|Block Images|
|block_media|query|boolean|false|Block Media|
|block_font|query|boolean|false|Block Fonts|
|block_text_track|query|boolean|false|Block Text Tracks|
|block_xhr|query|boolean|false|Block XHR Requests|
|block_fetch|query|boolean|false|Block Fetch Requests|
|block_event_source|query|boolean|false|Block Event Source|
|block_web_socket|query|boolean|false|Block Web Sockets|
|block_manifest|query|boolean|false|Block Manifest|
|block_specific_requests|query|string|false|Comma- or newline-separated list of specific requests to block. Each line and comma are treated as separate requests for processing. Example: https://example.com, https://example.js|
|blur_selector|query|string|false|Comma-separated list of indexed CSS selectors to blur. Format: index:<selector>, e.g., 0:.banner,1:#ads.|
|remove_selector|query|string|false|Comma-separated list of indexed CSS selectors to remove. Format: index:<selector>, e.g., 0:.banner,1:#ads.|
|result_file_name|query|string|false|Specify a meaningful and unique file name to easily identify the screenshot result. Avoid using spaces or special characters; use hyphens or underscores to separate words.|
|scrolling_screenshot|query|boolean|false|**`Scrolling Screenshot`**: Capture a long scrolling screenshot. When true, disable `fullPage` and `freshScreenshot`.|
|scroll_speed|query|string|false|Speed of scrolling during the screenshot.|
|scroll_back|query|boolean|false|If true, the scroll will reverse back to the top after reaching the bottom.|
|start_immediately|query|boolean|false|If true, the scrolling capture will start immediately upon page load.|
|multiple_scrolling|query|boolean|false|If true, multiple scrolling screenshots will be taken at different viewport sizes.|
|sizes|query|string|false|Comma-separated list of viewport sizes in format index:XXw:YYh. Example: sizes=0:120w:300h,1:240w:500h|
|duration|query|number|false|Duration in seconds for the scrolling capture. Acceptable range is 0 to 60 seconds.|
|fail_on_error|query|boolean|false|If true, returns an error when the target page responds with 4xx or 5xx status.|
|longitude|query|number|false|Specify longitude for the browser Geolocation API.|
|latitude|query|number|false|Specify latitude for the browser Geolocation API.|
|proxy|query|string|false|Allows defining a proxy for the connection. Provide a JSON string with keys: server (include port number), username, and password.|
|headers|query|string|false|Custom HTTP headers to include as key=value pairs. Use a semicolon to separate multiple headers (e.g., key1=value1;key2=value2).|
|cookies|query|string|false|Cookies to include in the request before rendering. Supports single or multiple cookies. Example: cookie=value; otherCookie=otherValue;|
|scroll_to_element|query|string|false|Scrolls the page to bring the specified CSS selector into view before capture.|
|selector|query|string|false|CSS selector to capture a specific element. Only that element is rendered.|
|selector_to_click|query|string|false|CSS selector for an element to click before capturing the screenshot.|
|click_recursion|query|integer|false|Number of times to click the selector (when set via selector_to_click). Default: 1.|
|user_agent|query|string|false|Custom User-Agent string sent in the request headers.|
|accept_languages|query|string|false|Sets the accepted languages for the HTTP request. Sent as the Accept-Language header.|
|scroll_delay|query|integer|false|Delay in milliseconds between scroll steps when lazy_load is enabled.|
|custom_html|query|string|false|Custom HTML to render instead of loading a URL. Overrides the url option.|
|image_quality|query|integer|false|Compression level for JPEG output (0–100). Lower = smaller file, higher = better quality. Only applies to JPEG.|
|extract_markdown|query|boolean|false|Extracts rendered page content as a structured .md (Markdown) file.|
|get_image_urls|query|boolean|false|Extracts all image URLs from the rendered DOM and returns them in structured format.|

##### Enumerated Values

|Parameter|Value|
|---|---|
|format|json|
|output|json|
|output|image|
|file_type|PNG|
|file_type|JPEG|
|file_type|WEBP|
|file_type|PDF|
|file_type|mp4|
|file_type|gif|
|file_type|webm|
|wait_for_event|load|
|wait_for_event|domcontentloaded|
|wait_for_event|networkidle|
|scroll_speed|normal|
|scroll_speed|fast|
|scroll_speed|slow|

> Example responses

> 200 Response

> Successful PDF response

```json
{
  "screenshot": "https://s3.eu-central-2.wasabisys.com/w.storage.apifreaks.com/example_com_e56fe7e60d8d.png",
  "url": "https://example.com",
  "created_at": "2026-07-27T10:19:08.668Z",
  "format": "json",
  "ttl": "2026-08-26T10:19:05.486Z"
}
```

> Bad Request — Invalid or missing parameters

```json
{
  "timestamp": "2026-07-27T10:19:11.354Z",
  "status": 400,
  "error": "invalid_url",
  "message": "Your URL is incorrect",
  "path": "/v3/screenshot"
}
```

```json
{
  "error": "Invalid Param Exception",
  "message": "please pass correct parameters",
  "path": "/v1.0/screenshot",
  "status": 400,
  "timestamp": "2026-07-27T10:19:11.922Z"
}
```

> Request Timeout — Screenshot capture exceeded the configured timeout

```json
{
  "timestamp": "2026-07-27T10:19:25.676Z",
  "status": 408,
  "error": "timeout_error",
  "message": "The request took too long to complete. Please try again later.",
  "path": "/v3/screenshot"
}
```

#### Responses

|Status|Meaning|Description|Schema|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful PDF response|[ScreenshotResponse](#screenshotresponse)|
|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|Bad Request — Invalid or missing parameters|[ErrorResponse](#errorresponse)|
|408|[Request Timeout](https://tools.ietf.org/html/rfc7231#section-6.5.7)|Request Timeout — Screenshot capture exceeded the configured timeout|[ErrorResponse](#errorresponse)|

#### Response Headers

|Status|Header|Type|Format|Description|
|---|---|---|---|---|
|200|X-AF-Credits-Cost|integer||Specifies the number of credits consumed by the current request.|
|200|X-Concurrent-Threads|integer||Specifies the maximum number of concurrent requests allowed.|
|200|X-Concurrent-Threads-Active|integer||Indicates the number of active concurrent requests being processed.|
|400|X-AF-Credits-Cost|integer||Specifies the number of credits consumed by the current request.|
|400|X-Concurrent-Threads|integer||Specifies the maximum number of concurrent requests allowed.|
|400|X-Concurrent-Threads-Active|integer||Indicates the number of active concurrent requests being processed.|
|408|X-AF-Credits-Cost|integer||Specifies the number of credits consumed by the current request.|
|408|X-Concurrent-Threads|integer||Specifies the maximum number of concurrent requests allowed.|
|408|X-Concurrent-Threads-Active|integer||Indicates the number of active concurrent requests being processed.|

To perform this operation, you must be authenticated by means of one of the following methods:
ApiKeyAuthHeader, ApiKeyAuthQuery

## Schemas

### ScreenshotResponse

Website screenshot response containing the screenshot URL and metadata.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|screenshot|string(uri)|true|none|URL of the captured screenshot image file.|
|url|string(uri)|true|none|The original URL that was captured.|
|created_at|string(date-time)|true|none|Timestamp when the screenshot was created (ISO 8601 format).|
|format|string|true|none|Response format type.|
|ttl|string|true|none|Time until the screenshot expires (ISO 8601 format).|
|file_type|string|false|none|The file type of the output (e.g., PNG, JPEG).|
|width|integer|false|none|Viewport width used for capture in pixels.|
|height|integer|false|none|Viewport height used for capture in pixels.|
|fresh|boolean|false|none|Whether a fresh render was performed.|
|full_page|boolean|false|none|Whether full page capture was used.|
|lazy_load|boolean|false|none|Whether lazy loading was triggered.|
|retina|boolean|false|none|Whether retina capture was used.|
|dark_mode|boolean|false|none|Whether dark mode was enabled.|
|enable_caching|boolean|false|none|Whether caching was enabled.|
|omit_background|boolean|false|none|Whether background was removed.|
|destroy_screenshot|boolean|false|none|Whether the screenshot was destroyed after generation.|
|fail_on_error|boolean|false|none|Whether the request failed on error.|
|block_ads|boolean|false|none|Whether ads were blocked.|
|no_cookie_banners|boolean|false|none|Whether cookie banners were blocked.|
|block_chat_widgets|boolean|false|none|Whether chat widgets were blocked.|
|block_tracking|boolean|false|none|Whether tracking scripts were blocked.|
|block_js|boolean|false|none|Whether JavaScript was blocked.|
|block_stylesheets|boolean|false|none|Whether stylesheets were blocked.|
|block_images|boolean|false|none|Whether images were blocked.|
|block_media|boolean|false|none|Whether media files were blocked.|
|block_font|boolean|false|none|Whether fonts were blocked.|
|block_xhr|boolean|false|none|Whether XHR requests were blocked.|
|block_fetch|boolean|false|none|Whether Fetch API requests were blocked.|
|block_web_socket|boolean|false|none|Whether WebSocket connections were blocked.|
|block_manifest|boolean|false|none|Whether manifest files were blocked.|
|extract_text|boolean|false|none|Whether text content was extracted.|
|extract_html|boolean|false|none|Whether HTML content was extracted.|
|extract_markdown|boolean|false|none|Whether markdown extraction was enabled.|
|get_image_urls|boolean|false|none|Whether image URL extraction was enabled.|
|longitude|number(float)|false|none|The longitude value used for geolocation.|
|latitude|number(float)|false|none|The latitude value used for geolocation.|
|proxy|string|false|none|The proxy configuration used for the request.|
|headers|string|false|none|The custom headers that were included in the request.|
|cookies|string|false|none|The cookies that were included in the request.|
|scroll_to_element|string|false|none|The element that was scrolled to before rendering.|
|selector|string|false|none|The element that was selected for rendering.|
|selector_to_click|string|false|none|The CSS selector that was clicked before capture.|
|click_recursion|integer|false|none|The number of times the selector was clicked.|
|blur_selector|string|false|none|The elements that were blurred in the output.|
|remove_selector|string|false|none|The elements that were removed from the output.|
|css|string|false|none|The custom CSS that was injected into the page.|
|css_url|string(uri)|false|none|The external CSS URL that was loaded.|
|js|string|false|none|The custom JavaScript that was injected.|
|js_url|string(uri)|false|none|The external JavaScript URL that was loaded.|
|user_agent|string|false|none|The User-Agent string that was used.|
|accept_languages|string|false|none|The Accept-Language header that was used.|
|delay|integer|false|none|The delay duration that was applied in milliseconds.|
|thumbnail_width|integer|false|none|The thumbnail width that was used in pixels.|
|output|string|false|none|The output type that was used.|
|image_quality|integer|false|none|The image quality level that was applied.|
|timeout|integer|false|none|The actual timeout duration that was applied in milliseconds.|
|adjust_top|integer|false|none|The vertical position that was scrolled to in pixels.|
|wait_for_event|string|false|none|The event that triggered the rendering to start.|
|grayscale|integer|false|none|The grayscale level that was applied (0-100).|
|scrolling_screenshot|boolean|false|none|Whether scrolling screenshot mode was enabled.|
|multiple_scrolling|boolean|false|none|Whether multiple scrolling captures were performed.|
|sizes|[string]|false|none|The dimensions used for each capture.|
|scroll_speed|string|false|none|Scrolling speed that was used.|
|scroll_back|boolean|false|none|Whether scroll back was enabled.|
|start_immediately|boolean|false|none|Whether recording started immediately.|
|duration|integer|false|none|Duration of scrolling capture in seconds.|
|result_file_name|string|false|none|The final filename used for the output file.|
|enable_incognito|boolean|false|none|Whether incognito mode was enabled.|

### ErrorResponse

Standard error envelope returned by the API on failed requests.

#### Properties

|Name|Type|Required|Restrictions|Description|
|---|---|---|---|---|
|error|string|false|none|Short error category or exception type.|
|message|string|true|none|Human-readable error message describing the failure.|
|path|string|false|none|API endpoint path that produced the error.|
|status|integer|false|none|HTTP status code returned with the error.|
|timestamp|string(date-time)|false|none|Timestamp when the error occurred (ISO 8601).|
