NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For products built around reviewing websites

Give reviewers the whole page to comment on, images and all

Capture the whole page, lazy-loaded images included, as one image your users can pin comments to.

The problem

A review tool lets clients pin comments on a website. The screenshot underneath is the product: if the images further down never loaded, the comments land on a picture that is not the site anyone will see.

How domscout handles it

fullPage captures the entire scrollable page as one image, up to 12,000 pixels tall, and lazyScroll first scrolls down the page, up to twenty screens, so images that wait to be scrolled into view are loaded. hideSelectors removes elements you do not want in the review, and cleanup, on the same plan, hides likely cookie banners and chat widgets without naming them. Store the image with the URL and the capture time, and every comment refers to a fixed picture of the page as it was.

Where it shows up

  • The base layer of a website annotation or review product.
  • Design-review boards built from live pages.
  • Before-and-after pairs for a client sign-off.

The request

POST /screenshot. Full-page capture starts at Pro; this request costs 2 credits. A page taller than 12,000 pixels or wider than 3,840 is refused rather than cut off.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://client-site.example.com/",
    "fullPage": true,
    "lazyScroll": true,
    "format": "webp",
    "quality": 80,
    "responseType": "binary"
  }' \
  -o page.webp
Node.js
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.domscout.io/screenshot", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({
    url: "https://client-site.example.com/",
    fullPage: true,
    lazyScroll: true,
    format: "webp",
    quality: 80,
    responseType: "binary"
  }),
});
await writeFile("page.webp", Buffer.from(await response.arrayBuffer()));
Python
import requests

response = requests.post(
    "https://api.domscout.io/screenshot",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "url": "https://client-site.example.com/",
        "fullPage": True,
        "lazyScroll": True,
        "format": "webp",
        "quality": 80,
        "responseType": "binary"
    },
)
with open("page.webp", "wb") as f:
    f.write(response.content)
Go
package main

import (
	"bytes"
	"encoding/json"
	"io"
	"net/http"
	"os"
)

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://client-site.example.com/",
		"fullPage": true,
		"lazyScroll": true,
		"format": "webp",
		"quality": 80,
		"responseType": "binary",
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/screenshot", bytes.NewReader(body))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("x-api-key", "YOUR_API_KEY")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	out, _ := os.Create("page.webp")
	defer out.Close()
	io.Copy(out, res.Body)
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/screenshot');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'x-api-key: YOUR_API_KEY'],
    CURLOPT_POSTFIELDS => json_encode([
        'url' => 'https://client-site.example.com/',
        'fullPage' => true,
        'lazyScroll' => true,
        'format' => 'webp',
        'quality' => 80,
        'responseType' => 'binary'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
file_put_contents('page.webp', $response);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://client-site.example.com/",
    fullPage: true,
    lazyScroll: true,
    format: "webp",
    quality: 80,
    responseType: "binary"
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
File.binwrite("page.webp", response.body)
Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;

public class Capture {
    public static void main(String[] args) throws Exception {
        String body = """
            {
                "url": "https://client-site.example.com/",
                "fullPage": true,
                "lazyScroll": true,
                "format": "webp",
                "quality": 80,
                "responseType": "binary"
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/screenshot"))
            .header("Content-Type", "application/json")
            .header("x-api-key", "YOUR_API_KEY")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpResponse<Path> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofFile(Path.of("page.webp")));
        System.out.println("Saved " + response.body());
    }
}
C#
using System.Net.Http.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var response = await client.PostAsJsonAsync("https://api.domscout.io/screenshot", new {
    url = "https://client-site.example.com/",
    fullPage = true,
    lazyScroll = true,
    format = "webp",
    quality = 80,
    responseType = "binary"
});
await File.WriteAllBytesAsync("page.webp", await response.Content.ReadAsByteArrayAsync());

Go further

More in Screenshots, images and PDFs: Thumbnails and link previews · PDFs from your own HTML · HTML to image · Web page to PDF · Screenshots of a list of URLs · Product screenshots for docs · Dashboard screenshots to chat · Monthly reports for clients · Email template previews · All use cases

Give your product a browser.

Get clean web content and visual proof into your workflow in minutes.