Website Scraper API
Five APIs that read any public page: fields, Markdown, a crawl, URLs or a screenshot.
For a site with no ready-made endpoint, Upscrape has five APIs that read any public page. Each costs 1 credit a call, a failed call costs nothing, and each has a short address of its own.
| You need | API | Address |
|---|---|---|
| Named fields from a page: a price, a rating, a team size | Extract API | POST /extract |
| A page, PDF or document as clean Markdown | Website to Markdown API | POST /markdown |
| Every page of a site, each as Markdown | Web Crawling API | POST /crawl |
| Every URL a site has | Sitemap Extractor API | POST /sitemap |
| A picture of a page | Screenshot API | POST /screenshot |
One request shape
Send the page and the options as the body, with your API key:
curl https://data.upscrape.com/markdown \ -H "Authorization: Bearer $UPSCRAPE_API_KEY" \ -H "Content-Type: application/json" \ -H "Prefer: wait=30" \ -d '{"url": "https://stripe.com/privacy"}'
import osimport requestsjob = requests.post( "https://data.upscrape.com/markdown", headers={"Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Prefer": "wait=30"}, json={"url": "https://stripe.com/privacy"},).json()print(job["results"][0]["data"]["parsed"]["markdown"][:500])
const res = await fetch("https://data.upscrape.com/markdown", { method: "POST", headers: { Authorization: `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", Prefer: "wait=30", }, body: JSON.stringify({ url: "https://stripe.com/privacy" }),});const job = await res.json();console.log(job.results[0].data.parsed.markdown.slice(0, 500));
The answer is the same job as every other call: state, the data in results[0].data and billing.credits_charged. A call still running after 30 seconds answers 202; fetch its poll_url, as Jobs and results shows.
Each API is also an endpoint like any other, so POST /execute with {"capability": "web.markdown", "input": {"url": "…"}} runs the same job, and an AI agent finds them over MCP.
What they share
Public pages only. Anything a visitor can see without signing in.
Pages that need JavaScript are opened in a real browser for you, at the same price.
Robots rules. The crawl and sitemap APIs follow a site's robots.txt by default.
Honest failures. A page that is blocked, empty or gone fails with its reason, such as
website_not_foundorunsupported_content, and costs nothing. Errors and retries lists them.Same headers as every call:
Prefer: wait=N,Idempotency-KeyandX-Max-Credits.
Something missing or unclear? Ask the team that builds the endpoints.