NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For sales and market research

Turn a company's own website into a structured profile

Read a company's own pages and get its profile back as JSON in your schema, ready for the CRM.

The problem

A sales team comes back from an event with two hundred company domains. Before anyone writes to them, someone has to find out what each company does, who it sells to and where it is, which means opening two hundred websites.

How domscout handles it

POST /extract reads the page you point it at and fills your schema: the company's name, what it sells, the customers it describes, where it says it is based. The answer is validated against the schema before it is returned, so a CRM import never receives a field of the wrong type. Keep to what a company says about itself; collecting personal data is governed by data protection law and by the service's terms.

Where it shows up

  • Qualifying inbound or event leads before outreach.
  • Filling industry and product fields in a CRM.
  • A market map of the companies in a category.

The request

POST /extract. /extract starts at Pro and costs 4 credits a request. A url is fetched without running JavaScript; for a site that builds its content in the browser, capture the Markdown first and send it as content.

cURL
curl -X POST https://api.domscout.io/extract \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.example.com/about",
    "prompt": "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": ["name", "offering"],
      "properties": {
        "name": {"type": "string"},
        "offering": {"type": "string", "maxLength": 300},
        "customers": {"type": ["string", "null"]},
        "headquarters": {"type": ["string", "null"]}
      }
    }
  }'
Node.js
const response = await fetch("https://api.domscout.io/extract", {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY" },
  body: JSON.stringify({
    url: "https://www.example.com/about",
    prompt: "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
    schema: {
      type: "object",
      additionalProperties: false,
      required: ["name", "offering"],
      properties: {
        name: { type: "string" },
        offering: { type: "string", maxLength: 300 },
        customers: { type: ["string", "null"] },
        headquarters: { type: ["string", "null"] }
      }
    }
  }),
});
const result = await response.json();
console.log(result.data);
Python
import requests

response = requests.post(
    "https://api.domscout.io/extract",
    headers={"x-api-key": "YOUR_API_KEY"},
    json={
        "url": "https://www.example.com/about",
        "prompt": "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
        "schema": {
            "type": "object",
            "additionalProperties": False,
            "required": ["name", "offering"],
            "properties": {
                "name": {"type": "string"},
                "offering": {"type": "string", "maxLength": 300},
                "customers": {"type": ["string", "null"]},
                "headquarters": {"type": ["string", "null"]}
            }
        }
    },
)
print(response.json()["data"])
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://www.example.com/about",
		"prompt": "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
		"schema": map[string]any{
			"type": "object",
			"additionalProperties": false,
			"required": []any{"name", "offering"},
			"properties": map[string]any{
				"name": map[string]any{"type": "string"},
				"offering": map[string]any{"type": "string", "maxLength": 300},
				"customers": map[string]any{"type": []any{"string", "null"}},
				"headquarters": map[string]any{"type": []any{"string", "null"}},
			},
		},
	})
	req, _ := http.NewRequest("POST", "https://api.domscout.io/extract", 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["data"])
}
PHP
<?php
$ch = curl_init('https://api.domscout.io/extract');
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/about',
        'prompt' => 'Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.',
        'schema' => [
            'type' => 'object',
            'additionalProperties' => false,
            'required' => ['name', 'offering'],
            'properties' => [
                'name' => ['type' => 'string'],
                'offering' => ['type' => 'string', 'maxLength' => 300],
                'customers' => ['type' => ['string', 'null']],
                'headquarters' => ['type' => ['string', 'null']]
            ]
        ]
    ]),
]);
$response = curl_exec($ch);
if ($response === false) {
    throw new RuntimeException(curl_error($ch));
}
$result = json_decode($response, true);
print_r($result['data']);
Ruby
require "json"
require "net/http"

response = Net::HTTP.post(
  URI("https://api.domscout.io/extract"),
  {
    url: "https://www.example.com/about",
    prompt: "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
    schema: {
      type: "object",
      additionalProperties: false,
      required: ["name", "offering"],
      properties: {
        name: { type: "string" },
        offering: { type: "string", maxLength: 300 },
        customers: { type: ["string", "null"] },
        headquarters: { type: ["string", "null"] }
      }
    }
  }.to_json,
  "Content-Type" => "application/json",
  "x-api-key" => "YOUR_API_KEY"
)
puts JSON.parse(response.body)["data"]
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/about",
                "prompt": "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
                "schema": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["name", "offering"],
                    "properties": {
                        "name": {"type": "string"},
                        "offering": {"type": "string", "maxLength": 300},
                        "customers": {"type": ["string", "null"]},
                        "headquarters": {"type": ["string", "null"]}
                    }
                }
            }
            """;
        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.domscout.io/extract"))
            .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/extract", new {
    url = "https://www.example.com/about",
    prompt = "Describe the company using only what this page says: its name, what it sells, who its customers are and where it is based.",
    schema = new {
        type = "object",
        additionalProperties = false,
        required = new[] { "name", "offering" },
        properties = new {
            name = new { type = "string" },
            offering = new { type = "string", maxLength = 300 },
            customers = new { type = new[] { "string", "null" } },
            headquarters = new { type = new[] { "string", "null" } }
        }
    }
});
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("data"));

Go further

More in Data extraction and search: Crawling a whole site · Structured data from web pages · AI extraction to a JSON Schema · Semantic search over your content · Content behind clicks · Evaluation sets from real pages · All use cases

Give your product a browser.

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