CrawlVolt Browser API

Structured extraction

Use the structured format when downstream code needs validated JSON rather than a free-form page representation. CrawlVolt evaluates the schema against the final rendered HTML, after browser actions when called through /v1/browse.

Structured extraction is deterministic. It does not send page content to an LLM and does not guess fields that are absent from the document.

Custom schema

Each field has a CSS selector. The default source is visible text and the default type is string.

curl --request POST https://www.crawlvolt.com/v1/scrape \
  --header "Authorization: Bearer $CRAWLVOLT_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "url": "https://store.example/products/tea",
    "formats": ["structured", "markdown"],
    "extract": {
      "fields": {
        "name": {
          "selector": "main h1",
          "required": true
        },
        "price": {
          "selector": "[itemprop=price]",
          "type": "number",
          "required": true
        },
        "in_stock": {
          "selector": "[data-available]",
          "source": "attribute",
          "attribute": "data-available",
          "type": "boolean"
        },
        "images": {
          "selector": "main img[src]",
          "source": "attribute",
          "attribute": "src",
          "type": "url",
          "multiple": true
        }
      }
    }
  }'

Supported sources are text, html and attribute. Supported scalar types are string, number, boolean and url. Relative URLs are resolved against the final page URL. A schema can contain at most 64 fields and every selector is validated before browser work is billed. CrawlVolt caps each field at 1,000 matches and 256 KiB per value, with a 4 MiB structured source-value budget per request. The normal max_output_bytes response cap still applies after extraction.

Result contract

The result is returned in outputs.structured:

{
  "valid": true,
  "confidence": 1.0,
  "data": {
    "name": "Green tea",
    "price": 12.5,
    "in_stock": true,
    "images": ["https://store.example/images/tea.jpg"]
  },
  "fields": {
    "name": { "matched_count": 1, "confidence": 1.0 },
    "price": { "matched_count": 1, "confidence": 1.0 }
  },
  "errors": []
}

valid is false when a required field is missing or a matched value cannot be converted to its declared type. errors identifies the field and returns required_missing or type_conversion_failed. confidence is the fraction of schema fields that produced correctly typed values; optional fields that are absent lower confidence without making the result invalid.

Presets

Presets provide conservative defaults and can be extended or overridden by custom fields.

Article

{
  "url": "https://example.com/news/launch",
  "formats": ["structured"],
  "extract": { "preset": "article" }
}

Returns title, author, published_at and body.

Product

{
  "url": "https://store.example/products/42",
  "formats": ["structured"],
  "extract": { "preset": "product" }
}

Returns name, price, currency, description and availability from common semantic attributes and page markup.

Directory

{
  "url": "https://example.com/partners",
  "formats": ["structured"],
  "extract": { "preset": "directory" }
}

Returns repeated items and normalized links.

Documentation

{
  "url": "https://example.com/docs/quickstart",
  "formats": ["structured", "markdown"],
  "extract": { "preset": "documentation" }
}

Returns title, content, sections and code_samples while preserving the raw Markdown output requested alongside it.

After browser actions

The same extract object works with POST /v1/browse. CrawlVolt runs the action sequence first, then evaluates the schema against the resulting DOM. This is useful for tabs, consent dialogs and authenticated session content.

On this page