NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For teams running paid campaigns

Check every ad's landing page on a phone before the budget goes live

Load every ad destination on a phone in one batch, and see where it lands, what it answered and what it shows.

The problem

A campaign launches with sixty ads. One points at a page that was unpublished last week, two redirect through a path that drops the tracking parameters, and one shows a desktop layout squeezed onto a phone. Each one wastes spend until someone notices.

How domscout handles it

Send every destination URL in one batch, each captured at a phone's viewport. For each you get metadata.httpStatus, markdownMeta.finalUrl to confirm the redirects ended where they should with the utm parameters intact, the page title, and a screenshot of what the visitor sees. A batch takes up to 100 URLs and runs each as its own job, so one slow page does not hold up the rest.

Where it shows up

  • A pre-launch check of every destination in a campaign.
  • A weekly sweep for destinations that started failing.
  • A visual record of what each ad led to.

The request

POST /batch. Batch starts at Business. Submitting is free and each item costs 1 credit.

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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
        "width": 390,
        "height": 844,
        "isMobile": true,
        "hasTouch": true,
        "extractMarkdown": true,
        "format": "webp"
      },
      {
        "url": "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
        "width": 390,
        "height": 844,
        "isMobile": true,
        "hasTouch": true,
        "extractMarkdown": true,
        "format": "webp"
      }
    ]
  }'
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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
        width: 390,
        height: 844,
        isMobile: true,
        hasTouch: true,
        extractMarkdown: true,
        format: "webp"
      },
      {
        url: "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
        width: 390,
        height: 844,
        isMobile: true,
        hasTouch: true,
        extractMarkdown: true,
        format: "webp"
      }
    ]
  }),
});
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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
                "width": 390,
                "height": 844,
                "isMobile": True,
                "hasTouch": True,
                "extractMarkdown": True,
                "format": "webp"
            },
            {
                "url": "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
                "width": 390,
                "height": 844,
                "isMobile": True,
                "hasTouch": True,
                "extractMarkdown": True,
                "format": "webp"
            }
        ]
    },
)
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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
				"width": 390,
				"height": 844,
				"isMobile": true,
				"hasTouch": true,
				"extractMarkdown": true,
				"format": "webp",
			},
			map[string]any{
				"url": "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
				"width": 390,
				"height": 844,
				"isMobile": true,
				"hasTouch": true,
				"extractMarkdown": true,
				"format": "webp",
			},
		},
	})
	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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn',
                'width' => 390,
                'height' => 844,
                'isMobile' => true,
                'hasTouch' => true,
                'extractMarkdown' => true,
                'format' => 'webp'
            ],
            [
                'url' => 'https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn',
                'width' => 390,
                'height' => 844,
                'isMobile' => true,
                'hasTouch' => true,
                'extractMarkdown' => true,
                'format' => 'webp'
            ]
        ]
    ]),
]);
$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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
        width: 390,
        height: 844,
        isMobile: true,
        hasTouch: true,
        extractMarkdown: true,
        format: "webp"
      },
      {
        url: "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
        width: 390,
        height: 844,
        isMobile: true,
        hasTouch: true,
        extractMarkdown: true,
        format: "webp"
      }
    ]
  }.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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
                        "width": 390,
                        "height": 844,
                        "isMobile": true,
                        "hasTouch": true,
                        "extractMarkdown": true,
                        "format": "webp"
                    },
                    {
                        "url": "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
                        "width": 390,
                        "height": 844,
                        "isMobile": true,
                        "hasTouch": true,
                        "extractMarkdown": true,
                        "format": "webp"
                    }
                ]
            }
            """;
        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://www.example.com/lp/autumn?utm_source=search&utm_campaign=autumn",
            width = 390,
            height = 844,
            isMobile = true,
            hasTouch = true,
            extractMarkdown = true,
            format = "webp"
        },
        new {
            url = "https://www.example.com/lp/autumn-b?utm_source=social&utm_campaign=autumn",
            width = 390,
            height = 844,
            isMobile = true,
            hasTouch = true,
            extractMarkdown = true,
            format = "webp"
        }
    }
});
Console.WriteLine(await response.Content.ReadAsStringAsync());

Go further

More in Testing and QA: Responsive layout checks · Visual regression testing · JavaScript error checks · Signup and checkout flow checks · Hover, focus and dark mode screenshots · Localization screenshots · Unlabelled control checks · A screenshot of every step · Embedded widget checks · Screenshots for support tickets · Before and after hydration · Selectors for test automation · Print layout checks · All use cases

Give your product a browser.

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