Web Data · DomScan product

Web Scraping API

Fetch public web pages as HTML, Markdown, or text with synchronous and asynchronous options.

What you get

Fetch public web pages as HTML, Markdown, or text with synchronous and asynchronous options.

SynchronousAsynchronousRESTMCPSDK

Choose this product when

Who it is for

Use focused APIs when a product or workflow needs current public page evidence in a structured response.

Choose this product when

Choose this when you need HTML, text, or markdown from a public page, with rendering or asynchronous collection only when supported and necessary.

What you get

Fetch public web pages as HTML, Markdown, or text with synchronous and asynchronous options.

Endpoints

Review the supported operations, inputs, outputs, execution modes, and response limits before integrating.

POST /v1/scrape View API reference
POST /v1/scrape/jobs View API reference
GET /v1/scrape/jobs/:job_id View API reference
GET /v1/scrape/jobs/:job_id/results View API reference

Credits and authentication

0-20 Authentication required. Check the operation reference for the exact cost and any per-item pricing.

Example operation

Use documented operations to collect, assess, enrich, verify, compare, protect, or monitor public evidence.

POST /v1/scrape Credits: 1-20/item

Body parameters

Parameter Type required
url string required
mode string
Allowed values standardresilientrenderedrendered_resilient
Default standard
optional
output string
Allowed values htmltextmarkdown
Default html
optional

Response fields

Field Type
data object
data.url string
data.final_url string
data.status integer | null
data.outcome string
data.content_type string | null
data.content string
data.bytes integer
data.truncated boolean
data.redirect_count integer
data.attempt_count integer
data.duration_ms integer
data.fetched_at string
data.headers object
data.rendered boolean
billing object
billing.credits_charged integer
billing.credits_refunded integer
billing.credits_per_item integer
billing.credits_net integer
billing.policy string

Example request

curl -X POST "https://domscan.net/v1/scrape" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "url": "https://example.com/",
  "mode": "standard",
  "output": "markdown"
}'
const response = await fetch("https://domscan.net/v1/scrape", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "url": "https://example.com/",
    "mode": "standard",
    "output": "markdown"
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/scrape",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "url": "https://example.com/",
        "mode": "standard",
        "output": "markdown",
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "url": "https://example.com/",
	  "mode": "standard",
	  "output": "markdown"
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/scrape", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/scrape")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "url" => "https://example.com/",
  "mode" => "standard",
  "output" => "markdown"
})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

Example response

{
  "data": {
    "url": "https://example.com",
    "final_url": "https://example.com",
    "status": 1,
    "outcome": "success",
    "content_type": "domain",
    "content": "example",
    "bytes": 1,
    "truncated": false,
    "redirect_count": 1,
    "attempt_count": 1,
    "duration_ms": 1,
    "fetched_at": "2026-08-27T12:00:00Z",
    "headers": {},
    "rendered": false
  },
  "billing": {
    "credits_charged": 1,
    "credits_refunded": 1,
    "credits_per_item": 1,
    "credits_net": 1,
    "policy": "effort_based"
  }
}

HTTP status codes

  • 200 OK
  • 400 Bad Request
  • 401 Unauthorized
  • 402 Payment Required
  • 403 Forbidden
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 Too Many Requests
  • 503 Service Unavailable

Frequently asked questions

Where can I find the Web Scraping request and response reference?

Use the API reference for Web Scraping to review parameters, response fields, examples, status codes, and supported operation modes.

How should I interpret unknown or incomplete results from Web Scraping?

Unknown or partial results mean that the requested evidence could not be fully determined. Keep the result state, confidence, freshness, and limitations in downstream decisions.

How is Web Scraping priced?

Pricing depends on the operation and execution mode. Check the endpoint reference for the current credit cost, authentication requirement, and per-item rules.

Used by people at these companies

InstantOutseerMongoDBRespondentSage Expense ManagementInstantlyD.R. HortonWhatConvertsAdobeLLM Pulse