NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For products full of links

Show a picture of every link in your product

Turn every URL in a directory, bookmark list or search result into an image, without running a browser fleet.

The problem

A directory, a bookmarking app, a CRM, a search result page: anywhere a list of links is easier to scan with a picture of each. Producing those pictures yourself means running headless browsers, keeping them patched, and deciding what to do when a page takes thirty seconds to settle.

How domscout handles it

One POST returns the rendered page as PNG, JPEG or WebP at the viewport you ask for, after its JavaScript has run. With responseType: binary the body is the image itself, ready to store or put behind your CDN. A phone viewport shows the mobile layout, and hideSelectors hides elements you know you never want in the picture.

Where it shows up

  • Preview images for a curated directory or link-in-bio page.
  • Thumbnails beside saved links in a bookmarking or research tool.
  • A picture of each result in an internal search or CRM record.

The request

POST /screenshot. Image capture is on every plan, including the free Hobby plan: PNG, JPEG and WebP. The image is the viewport size multiplied by deviceScaleFactor, which defaults to 2, so set it to 1 for an image the size of the viewport and scale it down to thumbnail size on your side or in your CDN.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "format": "webp",
    "quality": 70,
    "width": 1280,
    "height": 800,
    "deviceScaleFactor": 1,
    "responseType": "binary"
  }' \
  -o thumbnail.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://example.com",
    format: "webp",
    quality: 70,
    width: 1280,
    height: 800,
    deviceScaleFactor: 1,
    responseType: "binary"
  }),
});
await writeFile("thumbnail.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://example.com",
        "format": "webp",
        "quality": 70,
        "width": 1280,
        "height": 800,
        "deviceScaleFactor": 1,
        "responseType": "binary"
    },
)
with open("thumbnail.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://example.com",
		"format": "webp",
		"quality": 70,
		"width": 1280,
		"height": 800,
		"deviceScaleFactor": 1,
		"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("thumbnail.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://example.com',
        'format' => 'webp',
        'quality' => 70,
        'width' => 1280,
        'height' => 800,
        'deviceScaleFactor' => 1,
        'responseType' => 'binary'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
file_put_contents('thumbnail.webp', $response);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://example.com",
    format: "webp",
    quality: 70,
    width: 1280,
    height: 800,
    deviceScaleFactor: 1,
    responseType: "binary"
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
File.binwrite("thumbnail.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://example.com",
                "format": "webp",
                "quality": 70,
                "width": 1280,
                "height": 800,
                "deviceScaleFactor": 1,
                "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("thumbnail.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://example.com",
    format = "webp",
    quality = 70,
    width = 1280,
    height = 800,
    deviceScaleFactor = 1,
    responseType = "binary"
});
await File.WriteAllBytesAsync("thumbnail.webp", await response.Content.ReadAsByteArrayAsync());

Go further

Other use cases: Web access for AI agents · Website change monitoring · Web archiving and evidence · Crawling a whole site · SEO regression checks · PDFs from your own HTML · Structured data from web pages · Link preview checks · Responsive layout checks

Give your product a browser.

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