---
title: "Batch extract — one schema, up to 25 URLs"
method: POST
path: "/batch/extract"
---

# Batch extract — one schema, up to 25 URLs

`POST /batch/extract`

## Request

- Base URL: `https://fastcrawl.net/api/v1`
- URL: `https://fastcrawl.net/api/v1/batch/extract`
- Auth: HTTP bearer

Scrape up to 25 URLs (10-wide, same pipeline and cache as /scrape) and run one prompt + schema over each, 5 LLM calls wide. One credit per page; cached pages are free. A page that fails (dead host, anti-bot, timeout) returns its own error entry and the other pages still succeed — the request stays 200. Failed pages are never charged.

## Request body

- object
  - `urls` string[], required
  - `prompt` string: What to extract, e.g. 'extract the pricing tiers'
  - `schema` object: JSON schema the extracted data must match
  - `maxAge` integer: Cache max age in seconds (default 172800 = 48h, 0 = always refetch). Cache hits are free. max_age is accepted as an alias.

## Response `200`

Per-item results (aligned to input order) + totals.

- object
  - `success` boolean
  - `total` integer
  - `succeeded` integer
  - `failed` integer
  - `results` object[]
    - `url` string
    - `success` boolean
    - `data` object: Extracted JSON matching your schema (present when success is true)
    - `error` string
    - `error_code` string
    - `retryable` boolean
    - `from_cache` boolean: Served from the scrape cache — this page cost 0 credits
    - `engine_path` string

## Other responses

- `400`: urls missing/empty, more than 25, or a non-http(s) URL (error_code invalid_request).

## Changes

- **2026-10-20** `db3591634a49`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fastcrawl/apis/fastcrawl-api/changes/batch/extract/post.md)

---

[API](https://skmtc.dev/fastcrawl/apis/fastcrawl-api.md) · [All operations](https://skmtc.dev/fastcrawl/apis/fastcrawl-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fastcrawl/apis/fastcrawl-api/revisions/db3591634a49?raw)
