Skip to main content

Screenshot Scout Python SDK

The official Python SDK for the Screenshot Scout screenshot API. Easily capture website screenshots from your Python applications.

Requirements

Python 3.11 or newer.

Installation

python -m pip install screenshotscout

Get your API credentials

Before using the SDK, sign up for Screenshot Scout or sign in to your existing account. Screenshot Scout automatically creates a default API key when you sign up.

Open the API Keys page, copy the access key and secret key, and store them securely. The access key is required when creating ScreenshotScoutClient or AsyncScreenshotScoutClient. The secret key is optional and enables signed requests.

Capture a screenshot

Read your access key from an environment variable and pass it to the client:

import os
from pathlib import Path

from screenshotscout import (
    BinaryCaptureResponse,
    CaptureFormat,
    CaptureOptions,
    ScreenshotScoutClient,
)

access_key = os.environ.get("SCREENSHOTSCOUT_ACCESS_KEY")
if not access_key:
    raise RuntimeError("Set SCREENSHOTSCOUT_ACCESS_KEY first.")

with ScreenshotScoutClient(access_key) as client:
    response = client.capture(
        "https://example.com",
        CaptureOptions(format=CaptureFormat.WEBP, full_page=True),
    )

if not isinstance(response, BinaryCaptureResponse):
    raise RuntimeError("Expected a binary capture response")

Path("screenshot.webp").write_bytes(response.bytes)

POST is used by default. The screenshot is available as response.bytes.

Request a JSON result

Set response_type to CaptureResponseType.JSON to receive screenshot metadata instead of the binary file:

import os

from screenshotscout import (
    CaptureOptions,
    CaptureResponseType,
    JsonCaptureResponse,
    ScreenshotScoutClient,
)

options = CaptureOptions(response_type=CaptureResponseType.JSON)

with ScreenshotScoutClient(os.environ["SCREENSHOTSCOUT_ACCESS_KEY"]) as client:
    response = client.capture("https://example.com", options)

if not isinstance(response, JsonCaptureResponse):
    raise RuntimeError("Expected a JSON capture response")

print(response.result.screenshot_url)

Async client

Use AsyncScreenshotScoutClient in applications that use asyncio. await capture() waits for and returns the completed capture; it does not create a background job.

import asyncio
import os

from screenshotscout import AsyncScreenshotScoutClient, BinaryCaptureResponse, CaptureOptions


async def main() -> None:
    async with AsyncScreenshotScoutClient(os.environ["SCREENSHOTSCOUT_ACCESS_KEY"]) as client:
        response = await client.capture(
            "https://example.com",
            CaptureOptions(full_page=True),
        )

    if isinstance(response, BinaryCaptureResponse):
        print(len(response.bytes))


asyncio.run(main())

Use GET

POST is the default. Pass CaptureHTTPMethod.GET when you need a GET request:

from screenshotscout import CaptureHTTPMethod

response = client.capture(
    "https://example.com",
    method=CaptureHTTPMethod.GET,
)

Build a capture URL

Use build_capture_url() when a browser, an HTML <img> element, or another application needs to load the screenshot directly. Building the URL does not make a request.

from screenshotscout import CaptureOptions

capture_url = client.build_capture_url(
    "https://example.com",
    CaptureOptions(full_page=True, block_ads=True),
)

The generated URL contains your access key. If the client has a secret key, the URL is signed automatically; otherwise, it is unsigned. Treat generated URLs as sensitive. Before exposing one to a browser or user, add your secret key to the client and enable Require signed requests on the API Keys page.

Signed requests

Pass your secret key to sign GET and POST requests and generated capture URLs automatically. The secret key stays in your application and is never transmitted.

import os

from screenshotscout import ScreenshotScoutClient

with ScreenshotScoutClient(
    os.environ["SCREENSHOTSCOUT_ACCESS_KEY"],
    secret_key=os.environ["SCREENSHOTSCOUT_SECRET_KEY"],
) as client:
    response = client.capture("https://example.com")

See the signed requests guide for details.

Capture options

The target URL is the first argument to capture(). Use CaptureOptions keyword arguments to customize the screenshot:

Area CaptureOptions fields
Output format, response_type
Network and location country, proxy, geolocation_latitude, geolocation_longitude, geolocation_accuracy
Cookies and headers cookies, headers
Navigation and timing timeout, wait_until, navigation_timeout, delay
Device emulation device, device_viewport_width, device_viewport_height, device_scale_factor, device_is_mobile, device_has_touch, device_user_agent
Page preferences timezone, media_type, color_scheme, reduced_motion
Full page full_page, full_page_pre_scroll, full_page_pre_scroll_step, full_page_pre_scroll_step_delay, full_page_max_height
Blocking block_cookie_banners, block_ads, block_chat_widgets
Interactions and injection hide_selectors, click_selectors, click_all_selectors, inject_css, inject_js, bypass_csp
Selection and clipping selector, clip_x, clip_y, clip_width, clip_height
Image output image_width, image_height, image_mode, image_anchor, image_allow_upscale, image_background, image_quality
PDF output pdf_paper_format, pdf_landscape, pdf_print_background, pdf_margin, pdf_margin_top, pdf_margin_right, pdf_margin_bottom, pdf_margin_left, pdf_scale, pdf_page_ranges
Caching cache, cache_ttl, cache_key
Storage storage_mode, storage_endpoint, storage_bucket, storage_region, storage_object_key

Use the provided constants for autocomplete, or pass a string:

from screenshotscout import CaptureFormat, CaptureOptions, CaptureWaitUntil

options = CaptureOptions(
    format=CaptureFormat.WEBP,
    wait_until=CaptureWaitUntil.LOAD,
)
response = client.capture("https://example.com", options)

See the screenshot option reference for available values and examples.

Timeouts

import os

from screenshotscout import CaptureOptions, ScreenshotScoutClient

with ScreenshotScoutClient(
    os.environ["SCREENSHOTSCOUT_ACCESS_KEY"],
) as client:
    response = client.capture(
        "https://example.com",
        CaptureOptions(timeout=180),
    )

CaptureOptions.timeout controls how long Screenshot Scout may spend capturing the page. If your application needs network timeouts, configure them on an injected httpx.Client or httpx.AsyncClient; async callers can also set a total deadline with asyncio.timeout().

Responses

  • BinaryCaptureResponse provides the screenshot as bytes, along with URL, expiry, and cache information when available.
  • JsonCaptureResponse provides screenshot metadata in result.

Both response types include raw_response for access to the HTTP status, headers, content type, and body.

Error handling

import os

from screenshotscout import (
    ScreenshotScoutAPIError,
    ScreenshotScoutClient,
    ScreenshotScoutError,
    ScreenshotScoutTransportError,
)

try:
    with ScreenshotScoutClient(os.environ["SCREENSHOTSCOUT_ACCESS_KEY"]) as client:
        response = client.capture("https://example.com")
except ScreenshotScoutAPIError as error:
    print(error.status, error.error_code, error.error_message)
except ScreenshotScoutTransportError as error:
    print(error.cause)
except ScreenshotScoutError as error:
    print(error)

The SDK does not automatically retry failed requests.

Examples

Runnable programs are available in examples:

Development

Create a virtual environment and install the package with its development tools:

python -m venv .venv
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"

Run the local checks:

python -m ruff format --check .
python -m ruff check .
python -m mypy
python -m pytest
python -m build

License

This project is licensed under the MIT License. See LICENSE.

Metadata

Release files for screenshotscout 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for screenshotscout 0.3.0
File Size Uploaded Provenance
screenshotscout-0.3.0.tar.gz 19.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for screenshotscout 0.3.0
File Interpreter ABI Platform
screenshotscout-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 34.8 kB

Release files / screenshotscout-0.3.0.tar.gz

Download URL screenshotscout-0.3.0.tar.gz
Size 19.1 kB
Tags Source
SHA-256 checksum
How to use checksums
01d7f5546047784105031ad843daee523a25fa6c503a5cc8b141d99c42b3cb92
BLAKE2b-256 checksum
How to use checksums
41485deb1241d83615a302fc7e5794c83a03bd1bb76331ac40907bd6d7f6e2fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release files / screenshotscout-0.3.0-py3-none-any.whl

Download URL screenshotscout-0.3.0-py3-none-any.whl
Size 15.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d6b327f2b28c23f7e27e85cf76caa7494d12ab632906f7d9054d9fe65ec4f4f6
BLAKE2b-256 checksum
How to use checksums
13adabbec182179ba52cdf2a3cea2717928d36aac2d4f8d6303c73fade63faa6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Security for screenshotscout 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page