NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For agencies and freelancers

A dated PDF of every client page, every month

Capture each client's key pages as named, saved PDFs on a schedule, for the monthly report and the record.

The problem

At the end of the month the client wants to see what changed, the account manager wants proof that the campaign page went live as agreed, and someone needs the version from before the redesign that the client now says they preferred.

How domscout handles it

A capture with format: pdf saves the page as a paginated PDF, and save: true keeps it on your plan's retention schedule under the captureName you give it, so it can be fetched later with GET /capture/{captureId} or from the dashboard. With a binary response, the capture's ID arrives in the X-Domscout-Capture-Id header. Run it for every client page on the first of the month, and the report and the archive come from the same job.

Where it shows up

  • A PDF appendix for each client's monthly report.
  • Before-and-after records around a redesign.
  • Proof that a campaign page went live with the agreed content.

The request

POST /screenshot. PDF output starts at Pro and costs 2 credits. Saved captures are kept for 30 days on Pro, 90 on Business and 365 on Enterprise. Download whatever you need to keep longer.

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.example.com/",
    "format": "pdf",
    "pdfFormat": "A4",
    "save": true,
    "captureName": "client-example/home/2026-10",
    "responseType": "binary"
  }' \
  -o home.pdf
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.example.com/",
    format: "pdf",
    pdfFormat: "A4",
    save: true,
    captureName: "client-example/home/2026-10",
    responseType: "binary"
  }),
});
await writeFile("home.pdf", 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.example.com/",
        "format": "pdf",
        "pdfFormat": "A4",
        "save": True,
        "captureName": "client-example/home/2026-10",
        "responseType": "binary"
    },
)
with open("home.pdf", "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.example.com/",
		"format": "pdf",
		"pdfFormat": "A4",
		"save": true,
		"captureName": "client-example/home/2026-10",
		"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("home.pdf")
	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.example.com/',
        'format' => 'pdf',
        'pdfFormat' => 'A4',
        'save' => true,
        'captureName' => 'client-example/home/2026-10',
        'responseType' => 'binary'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
file_put_contents('home.pdf', $response);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://client.example.com/",
    format: "pdf",
    pdfFormat: "A4",
    save: true,
    captureName: "client-example/home/2026-10",
    responseType: "binary"
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
File.binwrite("home.pdf", 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.example.com/",
                "format": "pdf",
                "pdfFormat": "A4",
                "save": true,
                "captureName": "client-example/home/2026-10",
                "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("home.pdf")));
        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.example.com/",
    format = "pdf",
    pdfFormat = "A4",
    save = true,
    captureName = "client-example/home/2026-10",
    responseType = "binary"
});
await File.WriteAllBytesAsync("home.pdf", 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 · Email template previews · Full-page captures for review tools · All use cases

Give your product a browser.

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