NewIntroducing semantic snapshotsPair every capture with structured DOM data →
Browser-native extraction for AI

The browser
your agent doesn't have.

Render any page in real Chromium and get LLM-ready Markdown, DOM nodes, screenshots or PDFs. Every call reports what it cost and what is left, and no request costs more than 10 credits.

100 free requests · no credit card required
POST /screenshot200
"url": "https://example.com",
"extractMarkdown": true,
"screenshot": "webp"
Chromium renderClean and structureReturn proof
MARKDOWN
# Example Domain

This domain is for use in illustrative examples.

markdownMeta token countone round trip

03 / 08 · Start in minutes

One request, clean data back

No browser pools, no parsing rules, no headless setup. Hobby covers image and Markdown capture; Pro+ adds PDF and full-page output.

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

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

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://example.com",
		"extractMarkdown": true,
		"format": "webp",
	})
	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["markdown"])
}
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://example.com',
        'extractMarkdown' => true,
        'format' => 'webp'
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
$result = json_decode($response, true);
print_r($result['markdown']);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/screenshot"),
  { url: "https://example.com", extractMarkdown: true, format: "webp" }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts JSON.parse(response.body)["markdown"]
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://example.com",
                "extractMarkdown": true,
                "format": "webp"
            }
            """;
        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://example.com",
    extractMarkdown = true,
    format = "webp"
});
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("markdown"));

04 / 08 · Clean output

What the model actually reads

Raw markup becomes structured content. See the before and after on real pages.

Product preview

See the page. Keep the signal.

Shortened illustrations of the shape of the change: what a browser hands over, and what comes back. Run your own URL in the playground for real numbers.

Preset demonstration

Hand-written illustrations, not captured output or a benchmark. The playground runs the real thing.

https://en.wikipedia.org/wiki/JavaScriptChromium
Raw browser outputBefore
<html class="client-nojs vector-feature-language-in-header-enabled">
  <head>
    <script>mw.config.set({ wgPageName: "JavaScript" })</script>
    <link rel="stylesheet" href="/w/load.php?modules=site.styles" />
  </head>
  <div id="bodyContent" class="vector-body">
    <!-- navigation, sidebars, scripts, and 3,200 more lines -->
Structured MarkdownAfter
# JavaScript

JavaScript is a programming language and core technology of the Web, alongside HTML and CSS.

## Key characteristics
- High-level and dynamically typed
- Event-driven and multi-paradigm
- Prototype-based object orientation

Every real capture returns its own markdownMeta.estimatedTokens, so the reduction is something you measure on your pages rather than read off ours.

Try your own URL

05 / 08 · What you get back

Verifiable, not asserted

Three properties of every response - checkable from one request, without believing a number on a marketing page.

Real Chromium

Every request renders in a headless Chromium instance, so single-page apps and lazily loaded content are on the page before anything is extracted.

Proof attached

A capture of what the browser actually saw comes back with the data - PNG, JPEG and WebP on every plan, PDF and full-page on Pro and above.

Its own token count

Every Markdown extraction returns markdownMeta.estimatedTokens, so you measure the reduction on your pages instead of trusting an average from ours.

CapabilityRaw fetchSelf-hosteddomscout
JavaScript-rendered pagesNot renderedRenderedRendered
Response bodyRaw HTML you parseRaw HTML you parseMarkdown, DOM nodes, links
Visual proof of the renderNoneYou build itPNG, JPEG, WebP; PDF on Pro+
Browser infrastructureNone neededYours to run and patchManaged
Token count of the resultNot reportedYou measure itReturned on every capture

Comparing hosted vendors instead? See domscout against Firecrawl, ScreenshotOne and Browserless, with each price read from that vendor's own page on a stated date.

07 / 08 · Pricing

Start small. Scale when it works.

Straightforward plans for prototypes, products, and production browser workloads.

Hobby

$0/mo

For experiments and personal projects.

  • 100 extracts per month
  • Markdown and PNG output
  • API playground
  • Community support
Start free
Most popular

Pro

$9/mo

For indie developers and AI products.

  • 5,000 extracts per month
  • All output formats
  • DOM intelligence
  • Email support
Start Pro

Business

$29/mo

For teams running production workflows.

  • 25,000 extracts per month
  • 20 requests per second
  • 100 recurring monitors
  • Priority support
Start Business

Enterprise

$99/mo

For high-volume browser infrastructure.

  • 100,000 extracts per month
  • 100 requests per second
  • 365-day retention
  • Dedicated support
Start Enterprise

DOM intelligence is included with Pro and higher. The platform retains an emergency pause for this product group; if it is active, GET /credits reports FEATURE_NOT_ENABLED with a platform reason rather than implying that an account needs a hidden entitlement.

Batch and crawl workflows require Business or higher. They are not billed per parent request, but that is a price, not an entitlement - a Pro key calling /batch or /crawl receives PLAN_FEATURE_UNAVAILABLE. Web search is not currently offered on any plan.

Need more?

Metered overage on every paid plan

Go past your included extracts and keep working - usage beyond quota is billed at $0.002 per extract, up to 2x your plan. Every tier, Enterprise included, is self-serve from the dashboard, so nothing here waits on a sales call.

08 / 08 · FAQ

Frequently asked questions

Everything you need to know about domscout.

domscout is a browser-native extraction API. Give it a URL and it renders the page in real Chromium, then returns clean LLM-ready Markdown, semantic DOM nodes, links, and metadata - with a screenshot or PDF as visual proof. No browser infrastructure to manage.

Give your product a browser.

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