url
string
required
The web page or document URL to fetch.
Turn any web page or document URL into clean, LLM-ready Markdown.
Fetches a URL through a real Chrome fingerprint over a residential proxy and returns clean Markdown plus the raw HTML. Document URLs (PDF, Word, PowerPoint, Excel, Outlook, EPUB, CSV, and XML; RSS/Atom feeds convert best) are converted to Markdown too. Results are cached up to 30 days: by default a cached copy up to 7 days old is served, and `max_age_days=0` forces a fresh scrape. Priced by output: $0.001 per started 1,000 words of returned Markdown, a minimum of $0.001 and a maximum of $0.10 — pages beyond 100,000 words are truncated and the response `truncated` flag is set to true. A completed scrape is charged even when the page is thin, but a fetch that yields no Markdown (target down, unreachable, blocked, or timed out after 30 seconds) returns 502 and is never charged. Ideal for feeding pages into LLM and RAG pipelines, extracting document text, or monitoring content.
/api/v1/scrape
$0.001 per 1,000 words
Use your polyscrape API key instantly, or inspect the sample response first.
curl -X POST https://polyscrape.com/api/v1/scrape \
-H "Content-Type: application/json" \
-H "X-API-Key: $POLYSCRAPE_API_KEY" \
-d '{"url": "https://example.com"}'
Sample response
{
"html": "\u003c!doctype html\u003e\u003chtml\u003e\u003chead\u003e\u003ctitle\u003eExample Domain\u003c/title\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1\u003eExample Domain\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e",
"markdown": "---\ntitle: Example Domain\ncanonical: https://example.com\n---\n\n# Example Domain\n\nThis domain is for use in illustrative examples in documents.",
"metadata": {
"canonical": "https://example.com",
"description": "Illustrative example domain.",
"og:title": "Example Domain",
"title": "Example Domain"
},
"title": "Example Domain",
"truncated": false,
"url": "https://example.com",
"word_count": 14
}
Run a real /api/v1/scrape request. No key? We show the real sample result so you can still inspect the shape.
Endpoint
POST /api/v1/scrape
X-API-Key
$0.001 per 1,000 words
Leave empty to inspect the response shape without spending API balance.
Sample mode: explore the real response shape for free. Add a key to run a live request.
Response
POST /api/v1/scrape
{
"html": "\u003c!doctype html\u003e\u003chtml\u003e\u003chead\u003e\u003ctitle\u003eExample Domain\u003c/title\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1\u003eExample Domain\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e",
"markdown": "---\ntitle: Example Domain\ncanonical: https://example.com\n---\n\n# Example Domain\n\nThis domain is for use in illustrative examples in documents.",
"metadata": {
"canonical": "https://example.com",
"description": "Illustrative example domain.",
"og:title": "Example Domain",
"title": "Example Domain"
},
"title": "Example Domain",
"truncated": false,
"url": "https://example.com",
"word_count": 14
}
The full contract for /api/v1/scrape: what to send and what comes back.
url
string
required
The web page or document URL to fetch.
max_age_days
integer
optional
Max age (0–30) of a cached copy to accept. 0 forces a fresh scrape. Default 7.
| Field | Type | Description |
|---|---|---|
url |
string | The requested URL, echoed back. |
title |
string | null | Page title when available. |
markdown |
string | Clean Markdown with a metadata frontmatter block. |
html |
string | Raw HTML of the page. Empty string for documents. |
metadata |
object | Extracted frontmatter (title, canonical, og:*, description). |
word_count |
integer | Word count of the returned Markdown — the basis for the charge (1 credit per started 1,000 words). |
truncated |
boolean | True when the page exceeded 100,000 words and the returned Markdown was cut to that cap. |
Copy, paste, swap in your API key.
curl -X POST https://polyscrape.com/api/v1/scrape \
-H "Content-Type: application/json" \
-H "X-API-Key: " \
-d '{"url": "https://example.com"}'
Common ways Scrape ends up in production.
Ingesting a web page into an LLM or RAG pipeline.
Extracting a document's text as Markdown.
Monitoring a page's content over time.
The same predictable contract on every endpoint.
200 |
Success. The lookup completed and was charged, even if the response is empty (a no-match search, or a thin page). |
400 |
The request was rejected before any fetch (for search: an unsupported country code). Never charged. |
401 |
Missing or unknown API key. Never charged. |
402 |
Not enough balance on the account. Never charged. The detail is a JSON object with error, message, credits_required, and api_credits. |
422 |
Invalid request body (wrong shape or types). The detail is a list of per-field errors. Never charged. |
429 |
Rate limit exceeded: max 10 requests per second per API key (5/second for parse, which is CPU-heavier). Never charged. |
502 |
Upstream fetch failed — the target page or search could not be fetched (site down, unreachable, timed out, or blocked). Never charged. |
Body |
Every error response is JSON shaped as {"detail": ...}. detail is a message string, except 402 (a JSON object) and 422 (a list of field errors). |
Explore the rest of the polyscrape API.
New accounts start with a free API balance. Paid balance never expires, so it can sit until your workflows need it.
$0.50 to start
$0.50 free balance to start. Get an API key in seconds with no credit card.
$10 one-time
Adds $10 to your API balance for steady production traffic and early automated jobs.
$100 one-time
$130 spendable balance, including a $30 bonus. The sweet spot for production workloads.
Start with a free key and $0.50 free balance, on REST, MCP, or both.