NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For teams that report from dashboards

Post a picture of a dashboard to your team's channel every morning

Capture a signed-in dashboard as an image on your own schedule and post it where your team already reads.

The problem

The weekly numbers live in a dashboard that half the team never opens. A picture of it in the channel on Monday morning gets read; producing that picture means someone remembering to take it, crop it and paste it.

How domscout handles it

Send the dashboard's URL with a read-only viewer token in an Authorization header, or the session cookie of a dedicated viewer account, and set the viewport to the size you want to post. delay gives charts up to five seconds to finish drawing, or waitForSelector waits for an element that appears once the data has loaded. Headers go only to the dashboard's own origin. Run the request from your own scheduler and post the image with your chat tool's API. The dashboard must be reachable from the public internet, and monitors cannot carry credentials, so the schedule stays on your side.

Where it shows up

  • A Monday-morning revenue chart in the leadership channel.
  • A picture of the error-rate graph posted into an incident channel.
  • A weekly email of the same view for people without dashboard access.

The request

POST /screenshot. Available on every plan, including the free Hobby plan, at 1 credit an image. Use a token that can only view, and rotate it like any other credential.

cURL
curl -X POST https://api.domscout.io/screenshot \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://dashboards.example.com/d/weekly-revenue",
    "headers": {"Authorization": "Bearer YOUR_VIEWER_TOKEN"},
    "width": 1600,
    "height": 900,
    "deviceScaleFactor": 1,
    "delay": 3000,
    "format": "png",
    "responseType": "binary"
  }' \
  -o dashboard.png
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://dashboards.example.com/d/weekly-revenue",
    headers: { Authorization: "Bearer YOUR_VIEWER_TOKEN" },
    width: 1600,
    height: 900,
    deviceScaleFactor: 1,
    delay: 3000,
    format: "png",
    responseType: "binary"
  }),
});
await writeFile("dashboard.png", 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://dashboards.example.com/d/weekly-revenue",
        "headers": {"Authorization": "Bearer YOUR_VIEWER_TOKEN"},
        "width": 1600,
        "height": 900,
        "deviceScaleFactor": 1,
        "delay": 3000,
        "format": "png",
        "responseType": "binary"
    },
)
with open("dashboard.png", "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://dashboards.example.com/d/weekly-revenue",
		"headers": map[string]any{"Authorization": "Bearer YOUR_VIEWER_TOKEN"},
		"width": 1600,
		"height": 900,
		"deviceScaleFactor": 1,
		"delay": 3000,
		"format": "png",
		"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("dashboard.png")
	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://dashboards.example.com/d/weekly-revenue',
        'headers' => ['Authorization' => 'Bearer YOUR_VIEWER_TOKEN'],
        'width' => 1600,
        'height' => 900,
        'deviceScaleFactor' => 1,
        'delay' => 3000,
        'format' => 'png',
        'responseType' => 'binary'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
file_put_contents('dashboard.png', $response);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  {
    url: "https://dashboards.example.com/d/weekly-revenue",
    headers: { Authorization: "Bearer YOUR_VIEWER_TOKEN" },
    width: 1600,
    height: 900,
    deviceScaleFactor: 1,
    delay: 3000,
    format: "png",
    responseType: "binary"
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
File.binwrite("dashboard.png", 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://dashboards.example.com/d/weekly-revenue",
                "headers": {"Authorization": "Bearer YOUR_VIEWER_TOKEN"},
                "width": 1600,
                "height": 900,
                "deviceScaleFactor": 1,
                "delay": 3000,
                "format": "png",
                "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("dashboard.png")));
        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://dashboards.example.com/d/weekly-revenue",
    headers = new { Authorization = "Bearer YOUR_VIEWER_TOKEN" },
    width = 1600,
    height = 900,
    deviceScaleFactor = 1,
    delay = 3000,
    format = "png",
    responseType = "binary"
});
await File.WriteAllBytesAsync("dashboard.png", await response.Content.ReadAsByteArrayAsync());

Go further

More in Screenshots, images and PDFs: Thumbnails and link previews · PDFs from your own HTML · HTML to image · Web page to PDF · Screenshots of a list of URLs · Product screenshots for docs · 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.