NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For lists too long to loop over

Hand over up to 100 URLs and collect every screenshot

Submit up to 100 URLs in one request and collect each page's screenshot from a durable job.

The problem

A directory with four thousand listings, a portfolio of client sites, a spreadsheet of competitors. A loop over the screenshot endpoint works until it meets the rate limit, one slow page holds up the rest, and a crash halfway leaves you working out which ones already ran.

How domscout handles it

POST /batch takes up to 100 capture requests, each with its own URL and options, and returns a job straight away. Every item runs as its own durable child job, so one slow or failing page does not hold up the others, and each item draws on your quota only when it starts. GET /batch/{jobId} reports the counts and the completed results as they arrive, and an Idempotency-Key makes a retried submission return the same batch instead of starting a second.

Where it shows up

  • Thumbnails for every listing in a directory, refreshed a hundred at a time.
  • A monthly picture of every site in a client portfolio.
  • Screenshots of the pages in a spreadsheet, without writing a job runner.

The request

POST /batch. Batch starts at Business. Submitting is free, and each item costs what the same capture costs on its own: 1 credit for a viewport image. One API key runs one batch or crawl at a time; a second submission while one is active is refused with 409 and names the job that is running.

cURL
curl -X POST https://api.domscout.io/batch \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requests": [
      {
        "url": "https://example.com",
        "format": "webp",
        "width": 1280,
        "height": 800
      },
      {
        "url": "https://example.org",
        "format": "webp",
        "width": 1280,
        "height": 800
      }
    ]
  }'
Node.js
const response = await fetch("https://api.domscout.io/batch", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({
    requests: [
      {
        url: "https://example.com",
        format: "webp",
        width: 1280,
        height: 800
      },
      {
        url: "https://example.org",
        format: "webp",
        width: 1280,
        height: 800
      }
    ]
  }),
});
console.log(await response.json());
Python
import requests

response = requests.post(
    "https://api.domscout.io/batch",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "requests": [
            {
                "url": "https://example.com",
                "format": "webp",
                "width": 1280,
                "height": 800
            },
            {
                "url": "https://example.org",
                "format": "webp",
                "width": 1280,
                "height": 800
            }
        ]
    },
)
print(response.json())
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"requests": []any{
			map[string]any{
				"url": "https://example.com",
				"format": "webp",
				"width": 1280,
				"height": 800,
			},
			map[string]any{
				"url": "https://example.org",
				"format": "webp",
				"width": 1280,
				"height": 800,
			},
		},
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/batch", 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()

	raw, _ := io.ReadAll(res.Body)
	fmt.Println(string(raw))
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/batch');
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([
        'requests' => [
            [
                'url' => 'https://example.com',
                'format' => 'webp',
                'width' => 1280,
                'height' => 800
            ],
            [
                'url' => 'https://example.org',
                'format' => 'webp',
                'width' => 1280,
                'height' => 800
            ]
        ]
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
echo $response;
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/batch"),
  {
    requests: [
      {
        url: "https://example.com",
        format: "webp",
        width: 1280,
        height: 800
      },
      {
        url: "https://example.org",
        format: "webp",
        width: 1280,
        height: 800
      }
    ]
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts response.body
Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Capture {
    public static void main(String[] args) throws Exception {
        String body = """
            {
                "requests": [
                    {
                        "url": "https://example.com",
                        "format": "webp",
                        "width": 1280,
                        "height": 800
                    },
                    {
                        "url": "https://example.org",
                        "format": "webp",
                        "width": 1280,
                        "height": 800
                    }
                ]
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/batch"))
            .header("Content-Type", "application/json")
            .header("x-api-key", "YOUR_API_KEY")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
        HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(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/batch", new {
    requests = new[] {
        new {
            url = "https://example.com",
            format = "webp",
            width = 1280,
            height = 800
        },
        new {
            url = "https://example.org",
            format = "webp",
            width = 1280,
            height = 800
        }
    }
});
Console.WriteLine(await response.Content.ReadAsStringAsync());

Go further

More in Screenshots, images and PDFs: Thumbnails and link previews · PDFs from your own HTML · HTML to image · Web page to PDF · Product screenshots for docs · Dashboard screenshots to chat · Monthly reports for clients · 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.