NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For brands that sell through retailers

Check retailers' advertised prices and keep a dated picture of each

Read each retailer's advertised price as a number and save a screenshot of the page beside it, as dated evidence.

The problem

A brand's pricing policy says resellers may not advertise below a set price. One of forty retailers does it on a Friday and changes it back on Monday, and by the time anyone writes to them, the page no longer shows what it did.

How domscout handles it

One request reads the price with an extract field and, with save: true, keeps the screenshot under a captureName you choose, on your plan's retention schedule. The number and the picture come from the same page load, with the capture's date attached, so the price you act on and the evidence you send cannot disagree. Compare the price with your threshold in your own code and keep the captureId of every breach.

Where it shows up

  • A daily check of each authorised retailer's product pages.
  • A dated record to attach to a policy reminder.
  • A history of how often each retailer advertises below the threshold.

The request

POST /screenshot. extract starts at Pro; with the screenshot, this request costs 2 credits. The saved capture's ID is in metadata.captureId. Saved captures are kept for 30 days on Pro, 90 on Business and 365 on Enterprise.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://retailer.example.com/products/sku-1042",
    "save": true,
    "captureName": "sku-1042/retailer-example",
    "responseType": "json",
    "extract": {
      "fields": {
        "price": {"selector": ".price", "type": "number", "required": true}
      }
    }
  }'
Node.js
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://retailer.example.com/products/sku-1042",
    save: true,
    captureName: "sku-1042/retailer-example",
    responseType: "json",
    extract: {
      fields: { price: { selector: ".price", type: "number", required: true } }
    }
  }),
});
const result = await response.json();
console.log(result.analysis);
Python
import requests

response = requests.post(
    "https://api.domscout.io/screenshot",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "url": "https://retailer.example.com/products/sku-1042",
        "save": True,
        "captureName": "sku-1042/retailer-example",
        "responseType": "json",
        "extract": {
            "fields": {
                "price": {
                    "selector": ".price",
                    "type": "number",
                    "required": True
                }
            }
        }
    },
)
print(response.json()["analysis"])
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://retailer.example.com/products/sku-1042",
		"save": true,
		"captureName": "sku-1042/retailer-example",
		"responseType": "json",
		"extract": map[string]any{
			"fields": map[string]any{
				"price": map[string]any{
					"selector": ".price",
					"type": "number",
					"required": true,
				},
			},
		},
	})
	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()

	var result map[string]any
	json.NewDecoder(res.Body).Decode(&result)
	fmt.Println(result["analysis"])
}
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://retailer.example.com/products/sku-1042',
        'save' => true,
        'captureName' => 'sku-1042/retailer-example',
        'responseType' => 'json',
        'extract' => [
            'fields' => [
                'price' => [
                    'selector' => '.price',
                    'type' => 'number',
                    'required' => true
                ]
            ]
        ]
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
$result = json_decode($response, true);
print_r($result['analysis']);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://retailer.example.com/products/sku-1042",
    save: true,
    captureName: "sku-1042/retailer-example",
    responseType: "json",
    extract: {
      fields: { price: { selector: ".price", type: "number", required: true } }
    }
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts JSON.parse(response.body)["analysis"]
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 = """
            {
                "url": "https://retailer.example.com/products/sku-1042",
                "save": true,
                "captureName": "sku-1042/retailer-example",
                "responseType": "json",
                "extract": {
                    "fields": {
                        "price": {
                            "selector": ".price",
                            "type": "number",
                            "required": true
                        }
                    }
                }
            }
            """;
        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<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
C#
using System.Net.Http.Json;
using System.Text.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://retailer.example.com/products/sku-1042",
    save = true,
    captureName = "sku-1042/retailer-example",
    responseType = "json",
    extract = new {
        fields = new {
            price = new {
                selector = ".price",
                type = "number",
                required = true
            }
        }
    }
});
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("analysis"));

Go further

More in Monitoring and alerts: Website change monitoring · A feed for a site without RSS · Competitor price tracking · New job posting alerts · Vendor changelog watching · Tender, grant and notice alerts · All use cases

Give your product a browser.

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