NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For marketing teams in regulated industries

Keep a record of every landing page a campaign sent people to

Capture each campaign landing page in full when it goes live, saved under a name your compliance team can find.

The problem

In finance, insurance, healthcare and other regulated fields, someone will eventually ask exactly what a promotion said on a given day: the rate, the small print, the disclaimer. The page has been edited four times since, and the CMS keeps drafts, not what visitors saw.

How domscout handles it

A full-page capture with save: true keeps an image of the whole landing page, small print at the bottom included, under a captureName that follows your campaign naming, on your plan's retention schedule. Capture at launch and after every edit, or put a monitor on the page to capture it on a schedule and flag changes. Retention is limited, so move the files into your own records system; whether they satisfy a particular rule is for your compliance team to decide.

Where it shows up

  • A capture of every landing page at campaign launch.
  • A new record whenever a promotion's wording changes.
  • A folder of dated images for a compliance review.

The request

POST /screenshot. fullPage starts at Pro, and this capture costs 2 credits. Saved captures are kept for 30 days on Pro, 90 on Business and 365 on Enterprise. A page can be up to 12,000 pixels tall.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.example.com/offers/autumn-savings",
    "fullPage": true,
    "save": true,
    "captureName": "autumn-savings/landing/launch",
    "format": "png",
    "responseType": "binary"
  }' \
  -o landing.png
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://www.example.com/offers/autumn-savings",
    fullPage: true,
    save: true,
    captureName: "autumn-savings/landing/launch",
    format: "png",
    responseType: "binary"
  }),
});
await writeFile("landing.png", 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://www.example.com/offers/autumn-savings",
        "fullPage": True,
        "save": True,
        "captureName": "autumn-savings/landing/launch",
        "format": "png",
        "responseType": "binary"
    },
)
with open("landing.png", "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://www.example.com/offers/autumn-savings",
		"fullPage": true,
		"save": true,
		"captureName": "autumn-savings/landing/launch",
		"format": "png",
		"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("landing.png")
	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://www.example.com/offers/autumn-savings',
        'fullPage' => true,
        'save' => true,
        'captureName' => 'autumn-savings/landing/launch',
        'format' => 'png',
        'responseType' => 'binary'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
file_put_contents('landing.png', $response);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://www.example.com/offers/autumn-savings",
    fullPage: true,
    save: true,
    captureName: "autumn-savings/landing/launch",
    format: "png",
    responseType: "binary"
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
File.binwrite("landing.png", 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://www.example.com/offers/autumn-savings",
                "fullPage": true,
                "save": true,
                "captureName": "autumn-savings/landing/launch",
                "format": "png",
                "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("landing.png")));
        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://www.example.com/offers/autumn-savings",
    fullPage = true,
    save = true,
    captureName = "autumn-savings/landing/launch",
    format = "png",
    responseType = "binary"
});
await File.WriteAllBytesAsync("landing.png", await response.Content.ReadAsByteArrayAsync());

Go further

More in Security, evidence and compliance: Web archiving and evidence · Third-party script audit · Suspicious link checks · Hacked site detection · Tracking silent edits · All use cases

Give your product a browser.

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