NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For agencies and freelancers

Open a sales conversation with a picture of the prospect's own site

Capture a prospect's home page at three screen sizes with its title, description and social tags, as the opening of a pitch.

The problem

A cold email that says "we can improve your website" goes unread. One that shows the prospect their own home page breaking on a phone, and notes that it has no meta description, gets a reply, but putting that together by hand for each prospect does not scale past a few a day.

How domscout handles it

One capture with captureMode: grid returns the home page at phone, tablet and desktop size, and extractMarkdown adds markdownMeta: the title, the meta description, the Open Graph title, description and image, and the word count, taken from the desktop view. An empty field is a finding in itself. Put the three images and the gaps on one page, and every pitch starts with something specific to that business.

Where it shows up

  • A one-page audit attached to an outreach email.
  • A qualifying step that sorts prospects by how much their site needs work.
  • The before picture for a case study.

The request

POST /screenshot. Available on every plan, including the free Hobby plan. A grid capture costs 3 credits.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://prospect.example.com/",
    "captureMode": "grid",
    "extractMarkdown": true,
    "format": "webp",
    "responseType": "json"
  }'
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://prospect.example.com/",
    captureMode: "grid",
    extractMarkdown: true,
    format: "webp",
    responseType: "json"
  }),
});
console.log(await response.json());
Python
import requests

response = requests.post(
    "https://api.domscout.io/screenshot",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "url": "https://prospect.example.com/",
        "captureMode": "grid",
        "extractMarkdown": True,
        "format": "webp",
        "responseType": "json"
    },
)
print(response.json())
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://prospect.example.com/",
		"captureMode": "grid",
		"extractMarkdown": true,
		"format": "webp",
		"responseType": "json",
	})
	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()

	raw, _ := io.ReadAll(res.Body)
	fmt.Println(string(raw))
}
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://prospect.example.com/',
        'captureMode' => 'grid',
        'extractMarkdown' => true,
        'format' => 'webp',
        'responseType' => 'json'
    ]),
]);
$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/screenshot"),
  {
    url: "https://prospect.example.com/",
    captureMode: "grid",
    extractMarkdown: true,
    format: "webp",
    responseType: "json"
  }.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 = """
            {
                "url": "https://prospect.example.com/",
                "captureMode": "grid",
                "extractMarkdown": true,
                "format": "webp",
                "responseType": "json"
            }
            """;
        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 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://prospect.example.com/",
    captureMode = "grid",
    extractMarkdown = true,
    format = "webp",
    responseType = "json"
});
Console.WriteLine(await response.Content.ReadAsStringAsync());

Go further

More in SEO and site health: SEO regression checks · Link preview checks · Find every page on a site · Website migration checks · JavaScript SEO checks · Page weight and load metrics · Backlink checks · JSON-LD structured data checks · hreflang checks · All use cases

Give your product a browser.

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