NewIntroducing semantic snapshotsPair every capture with structured DOM data →

For support and documentation teams

Draft the FAQ your documentation already answers

Turn a documentation page into question-and-answer pairs drawn from its own text, as validated JSON.

The problem

The answers are in the docs, but customers ask questions, not section headings. An FAQ written by hand drifts away from the docs it summarises, and nobody updates both.

How domscout handles it

POST /extract reads the page and returns the questions it answers, each with an answer drawn from the page, in the shape your schema sets: a list of question and answer pairs, capped at the number you want. The result is validated before it is returned, so it can feed an FAQ page, FAQPage structured data or support macros directly. Regenerate it when the docs page changes, and have a person read it before it is published.

Where it shows up

  • A first draft of a help-centre FAQ for each docs section.
  • FAQPage structured data that matches the page it sits on.
  • Support macros built from the passages that answer each question.

The request

POST /extract. /extract starts at Pro and costs 4 credits a request, with 18 seconds for fetching the page and the model's answer together.

cURL
curl -X POST https://api.domscout.io/extract \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://docs.example.com/billing",
    "prompt": "List the questions this page answers. Answer each one using only what the page says.",
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": ["faqs"],
      "properties": {
        "faqs": {
          "type": "array",
          "maxItems": 10,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["question", "answer"],
            "properties": {
              "question": {"type": "string"},
              "answer": {"type": "string"}
            }
          }
        }
      }
    }
  }'
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://docs.example.com/billing",
    prompt: "List the questions this page answers. Answer each one using only what the page says.",
    schema: {
      type: "object",
      additionalProperties: false,
      required: ["faqs"],
      properties: {
        faqs: {
          type: "array",
          maxItems: 10,
          items: {
            type: "object",
            additionalProperties: false,
            required: ["question", "answer"],
            properties: { question: { type: "string" }, answer: { type: "string" } }
          }
        }
      }
    }
  }),
});
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://docs.example.com/billing",
        "prompt": "List the questions this page answers. Answer each one using only what the page says.",
        "schema": {
            "type": "object",
            "additionalProperties": False,
            "required": ["faqs"],
            "properties": {
                "faqs": {
                    "type": "array",
                    "maxItems": 10,
                    "items": {
                        "type": "object",
                        "additionalProperties": False,
                        "required": ["question", "answer"],
                        "properties": {
                            "question": {"type": "string"},
                            "answer": {"type": "string"}
                        }
                    }
                }
            }
        }
    },
)
print(response.json()["data"])
Go
package main

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

func main() {
	body, _ := json.Marshal(map[string]any{
		"url": "https://docs.example.com/billing",
		"prompt": "List the questions this page answers. Answer each one using only what the page says.",
		"schema": map[string]any{
			"type": "object",
			"additionalProperties": false,
			"required": []any{"faqs"},
			"properties": map[string]any{
				"faqs": map[string]any{
					"type": "array",
					"maxItems": 10,
					"items": map[string]any{
						"type": "object",
						"additionalProperties": false,
						"required": []any{"question", "answer"},
						"properties": map[string]any{
							"question": map[string]any{"type": "string"},
							"answer": map[string]any{"type": "string"},
						},
					},
				},
			},
		},
	})
	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://docs.example.com/billing',
        'prompt' => 'List the questions this page answers. Answer each one using only what the page says.',
        'schema' => [
            'type' => 'object',
            'additionalProperties' => false,
            'required' => ['faqs'],
            'properties' => [
                'faqs' => [
                    'type' => 'array',
                    'maxItems' => 10,
                    'items' => [
                        'type' => 'object',
                        'additionalProperties' => false,
                        'required' => ['question', 'answer'],
                        'properties' => [
                            'question' => ['type' => 'string'],
                            'answer' => ['type' => 'string']
                        ]
                    ]
                ]
            ]
        ]
    ]),
]);
$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://docs.example.com/billing",
    prompt: "List the questions this page answers. Answer each one using only what the page says.",
    schema: {
      type: "object",
      additionalProperties: false,
      required: ["faqs"],
      properties: {
        faqs: {
          type: "array",
          maxItems: 10,
          items: {
            type: "object",
            additionalProperties: false,
            required: ["question", "answer"],
            properties: { question: { type: "string" }, answer: { type: "string" } }
          }
        }
      }
    }
  }.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://docs.example.com/billing",
                "prompt": "List the questions this page answers. Answer each one using only what the page says.",
                "schema": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": ["faqs"],
                    "properties": {
                        "faqs": {
                            "type": "array",
                            "maxItems": 10,
                            "items": {
                                "type": "object",
                                "additionalProperties": false,
                                "required": ["question", "answer"],
                                "properties": {
                                    "question": {"type": "string"},
                                    "answer": {"type": "string"}
                                }
                            }
                        }
                    }
                }
            }
            """;
        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://docs.example.com/billing",
    prompt = "List the questions this page answers. Answer each one using only what the page says.",
    schema = new {
        type = "object",
        additionalProperties = false,
        required = new[] { "faqs" },
        properties = new {
            faqs = new {
                type = "array",
                maxItems = 10,
                items = new {
                    type = "object",
                    additionalProperties = false,
                    required = new[] { "question", "answer" },
                    properties = new {
                        question = new { type = "string" },
                        answer = new { type = "string" }
                    }
                }
            }
        }
    }
});
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
Console.WriteLine(result.GetProperty("data"));

Go further

More in AI and agents: Web access for AI agents · llms.txt from your docs · Screenshots for vision models · Rendering generated HTML · Coding agents checking their work · Newsletter curation · All use cases

Give your product a browser.

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