NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For sites built on JavaScript frameworks

See what your page says before its JavaScript runs

Read a page as your server sends it and as a browser renders it, and compare what each one contains.

The problem

Search engines can render JavaScript, but not always and not straight away, and many link-preview and AI crawlers do not render it at all. A product page whose description, price and links arrive by a client-side fetch can look complete in every browser and be close to empty for anything that only reads the HTML.

How domscout handles it

renderJs: false answers from one HTTP request, exactly as your server sent the page, without running any script. The same request without it renders the page in Chromium. Both return the same shape: the Markdown, the links, the title and description, metadata.wordCount and metadata.contentQuality. A page that drops from hundreds of words to a handful, or loses its links, without JavaScript depends on the browser for that content. The two requests cost the same, and the served one comes back faster.

Where it shows up

  • An audit of templates that render their main content on the client.
  • A CI check that key pages keep their content in the served HTML.
  • A comparison after moving a page between server and client rendering.

The request

POST /scrape. Available on every plan, including the free Hobby plan. Each request costs 1 credit, with or without renderJs. contentQuality is ok, low_text, empty or likely_blocked.

cURL
curl -X POST https://api.domscout.io/scrape \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.example.com/products/42", "renderJs": false}'
Node.js
const response = await fetch("https://api.domscout.io/scrape", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({ url: "https://www.example.com/products/42", renderJs: false }),
});
const result = await response.json();
console.log(result.metadata);
Python
import requests

response = requests.post(
    "https://api.domscout.io/scrape",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={"url": "https://www.example.com/products/42", "renderJs": False},
)
print(response.json()["metadata"])
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://www.example.com/products/42",
		"renderJs": false,
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/scrape", 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["metadata"])
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/scrape');
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://www.example.com/products/42',
        'renderJs' => false
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
$result = json_decode($response, true);
print_r($result['metadata']);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/scrape"),
  { url: "https://www.example.com/products/42", renderJs: false }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts JSON.parse(response.body)["metadata"]
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://www.example.com/products/42",
                "renderJs": false
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/scrape"))
            .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/scrape", new { url = "https://www.example.com/products/42", renderJs = false });
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("metadata"));

Go further

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

Give your product a browser.

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

JavaScript SEO Checker - Content With and Without JS | domscout