Extract a page
Core options
| Option | Values | Default |
|---|---|---|
response_length | short (25k), medium (50k), large (100k), max, or a char count (1k-1M) | short |
extract_effort | normal (fast), high (better, slower), auto | normal |
summary | false, true, an instruction string, or a JSON schema | false |
screenshot | true to capture a page screenshot (not for PDFs) | false |
Academic papers
When you pass an academic paper URL or DOI, Valyu serves it from our pre-processed academic index rather than crawling the live page. You get clean markdown with preserved figures, equations, tables, and section structure, plus inline pre-signed image URLs - the things lost when a JavaScript-heavy or PDF paper is scraped live. This happens automatically; just pass the URL.| Source | Example URL / id | Plan for index access |
|---|---|---|
| arXiv | https://arxiv.org/pdf/2506.05440 (or /abs/, /html/) | tier_0 (pay-as-you-go) |
| PubMed Central | https://pubmed.ncbi.nlm.nih.gov/PMC10584482 | tier_0 |
| bioRxiv | https://www.biorxiv.org/content/10.1101/2020.07.28.225581 | tier_1 |
| medRxiv | https://www.medrxiv.org/content/10.1101/... | tier_1 |
| ChemRxiv | https://chemrxiv.org/doi/full/10.26434/chemrxiv-... | tier_2 |
Academic results set
source to the dataset id (e.g. valyu/valyu-arxiv) and include doi, authors, and citation_count. Figures are returned in image_url as a filename→URL map and referenced inline in the markdown.AI summaries and structured extraction
Thesummary field controls AI post-processing:
false- raw markdown, fastest and cheapest (no AI)true- a basic AI summary- string - custom instructions, e.g.
"Summarise the methodology and key findings in 2-3 paragraphs" - object - a JSON schema for structured extraction
Summary examples (all four modes)
Summary examples (all four modes)
JSON schema reference and tips
JSON schema reference and tips
Use any valid JSON Schema. Limits: 5,000 characters, 3 levels deep, 20 properties per object.Supported types:
string, number/integer, boolean, array, object.Tips:- Use clear
descriptionfields to guide extraction. - Use
enumfor consistent categorisation. - Keep schemas shallow and mark essential fields
required.
Screenshot capture
Screenshot capture
Python
Async processing
For 11-50 URLs (required above 10) or non-blocking workflows, use async mode. Submit URLs, get ajob_id immediately, then poll or receive results via webhook. Async also raises the per-URL timeout to 120s (vs 25s for sync).
Async mode is required above 10 URLs. For 1-10 URLs it’s optional, for non-blocking workflows.
Polling, job lifecycle, and status fields
Polling, job lifecycle, and status fields
The initial submit returns HTTP 202 with a
To poll manually:Status response fields include:
job_id, poll_url, and a one-time webhook_secret (store it immediately - you cannot retrieve it later).Jobs move through these statuses:| Status | Meaning |
|---|---|
pending | Created, not yet started |
processing | URLs running in batches of 5 |
completed | All URLs succeeded |
partial | Finished with some failures |
failed | All URLs failed |
job_id, status, urls_total, urls_processed, urls_failed, created_at, updated_at, current_batch / total_batches (while processing), results and actual_cost_dollars (when completed/partial), and error (when partial/failed).Webhooks and signature verification
Webhooks and signature verification
When you provide a
webhook_url, Valyu POSTs to it when the job finishes (completed, partial, or failed). Headers: Content-Type: application/json, User-Agent: Valyu-Contents/1.0, X-Webhook-Signature: sha256={hex}, X-Webhook-Timestamp (Unix seconds).Retries: up to 5 attempts with exponential backoff (1s, 2s, 4s, 8s), no retry on 4xx, 5s connect / 15s read timeout.The payload is signed with HMAC-SHA256 over "{timestamp}.{json_payload}":Limits and pricing
| Detail | Value |
|---|---|
| Max URLs (sync / async) | 10 / 50 |
| Batch size | 5 URLs |
| Timeout per URL (sync / async) | 25s / 120s |
| Base pricing | $0.001 per URL |
| AI features (summary/schema) | +$0.001 per URL |
| Job expiry (TTL) | 7 days |
Response format
summary set, content is the AI summary (string) or extracted JSON (object), and each result adds summary_success.
Result fields
Result fields
| Field | Description |
|---|---|
status | "success" or "failed" for this URL |
error | Human-readable failure reason (failed results only) |
title | Extracted page title |
url | Original URL |
content | Extracted content (markdown or JSON) |
description | Page meta description (paper abstract for academic sources) |
source | "web", or the dataset id for academic papers (e.g. valyu/valyu-arxiv) |
price | Cost for this URL in dollars |
length | Character count |
data_type | "unstructured" or "structured" |
summary_success | Whether AI processing succeeded (only when summary is used) |
image_url | Extracted image URLs (figures, for academic papers) |
screenshot_url | Page screenshot URL (only when screenshot=true) |
doi, authors, citation_count | Academic sources only |
Error handling
Each result carries astatus of success or failed. Failed results include a descriptive error (page unavailable, required sign-in, blocked, timed out) that never exposes Valyu’s internal infrastructure - branch on status and surface the error string as-is.
| HTTP status | Meaning |
|---|---|
200 | All URLs extracted successfully |
206 | Partial - some succeeded, some failed (check urls_failed and per-result status) |
422 | Every URL failed - see the top-level error |
Next steps
API reference
Complete parameter documentation
Python SDK
Python integration
TypeScript SDK
TypeScript integration
Integrations
LangChain, LlamaIndex, and more

