curl --request GET \
--url https://api.context.dev/v1/web/scrape/html \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.context.dev/v1/web/scrape/html"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.context.dev/v1/web/scrape/html', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.context.dev/v1/web/scrape/html",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.context.dev/v1/web/scrape/html"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.context.dev/v1/web/scrape/html")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.context.dev/v1/web/scrape/html")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"html": "<string>",
"url": "<string>",
"type": "html",
"metadata": {
"sourceUrl": "<string>",
"finalUrl": "<string>",
"title": "<string>",
"description": "<string>",
"language": "<string>",
"keywords": [
"<string>"
],
"canonicalUrl": "<string>",
"author": "<string>",
"siteName": "<string>",
"image": "<string>",
"favicon": "<string>",
"publishedTime": "<string>",
"modifiedTime": "<string>",
"robots": "<string>",
"openGraph": {},
"twitter": {},
"alternates": [
{
"href": "<string>",
"hreflang": "<string>",
"type": "<string>",
"title": "<string>"
}
],
"headings": [
{
"level": 3,
"text": "<string>"
}
],
"jsonLd": [
{}
],
"additionalMeta": {}
},
"cache_metadata": {
"status": "hit",
"age_ms": 1
},
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
},
"actionsApplied": [
{
"instruction": "<string>",
"status": "applied",
"method": "<string>",
"targetDescription": "<string>",
"completionEvidence": "<string>",
"error": "<string>",
"durationMs": 123
}
],
"actionsHtmlStale": true
}{
"message": "<string>",
"error_code": "INPUT_VALIDATION_ERROR",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "UNAUTHORIZED",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "FORBIDDEN",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "NOT_FOUND",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "REQUEST_TIMEOUT",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "CONTENT_TOO_LARGE",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "UNSUPPORTED_CONTENT",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "RATE_LIMITED",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "INTERNAL_ERROR",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}Scrape HTML
Fetch raw page HTML for extraction, archiving, QA, and custom parsing workflows.
curl --request GET \
--url https://api.context.dev/v1/web/scrape/html \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.context.dev/v1/web/scrape/html"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.context.dev/v1/web/scrape/html', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.context.dev/v1/web/scrape/html",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.context.dev/v1/web/scrape/html"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.context.dev/v1/web/scrape/html")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.context.dev/v1/web/scrape/html")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"html": "<string>",
"url": "<string>",
"type": "html",
"metadata": {
"sourceUrl": "<string>",
"finalUrl": "<string>",
"title": "<string>",
"description": "<string>",
"language": "<string>",
"keywords": [
"<string>"
],
"canonicalUrl": "<string>",
"author": "<string>",
"siteName": "<string>",
"image": "<string>",
"favicon": "<string>",
"publishedTime": "<string>",
"modifiedTime": "<string>",
"robots": "<string>",
"openGraph": {},
"twitter": {},
"alternates": [
{
"href": "<string>",
"hreflang": "<string>",
"type": "<string>",
"title": "<string>"
}
],
"headings": [
{
"level": 3,
"text": "<string>"
}
],
"jsonLd": [
{}
],
"additionalMeta": {}
},
"cache_metadata": {
"status": "hit",
"age_ms": 1
},
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
},
"actionsApplied": [
{
"instruction": "<string>",
"status": "applied",
"method": "<string>",
"targetDescription": "<string>",
"completionEvidence": "<string>",
"error": "<string>",
"durationMs": 123
}
],
"actionsHtmlStale": true
}{
"message": "<string>",
"error_code": "INPUT_VALIDATION_ERROR",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "UNAUTHORIZED",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "FORBIDDEN",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "NOT_FOUND",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "REQUEST_TIMEOUT",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "CONTENT_TOO_LARGE",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "UNSUPPORTED_CONTENT",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"message": "<string>",
"error_code": "RATE_LIMITED",
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}{
"request_id": "3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91",
"message": "<string>",
"error_code": "INTERNAL_ERROR",
"key_metadata": {
"credits_consumed": 123,
"credits_remaining": 123
}
}Authorizations
Bearer authentication header of the form Bearer <API_KEY>, where <API_KEY> is your api key.
Query Parameters
Full URL to scrape (must include http:// or https:// protocol)
1PDF parsing controls. Use start/end to limit text extraction and embedded-image detection/OCR to an inclusive 1-based page range.
Show child attributes
Show child attributes
When true, iframes are rendered inline into the returned HTML.
When true, return only the page's main content in the HTML response, excluding headers, footers, sidebars, and navigation when detectable.
CSS selectors. When provided, only matching subtrees (and their descendants) are kept and everything else is dropped. When omitted, the entire document is kept. Examples: "article.main", "#content", "[role=main]".
501 - 2048CSS selectors to remove from the result. Applied after includeSelectors. Exclusion takes precedence: an element matching both is removed. Examples: "nav", "footer", ".ad-banner", "[aria-hidden=true]".
501 - 2048Return a cached result if a prior scrape for the same parameters exists and is younger than this many milliseconds. Defaults to 1 day (86400000 ms) when omitted. Max is 30 days (2592000000 ms). Set to 0 to always scrape fresh.
0 <= x <= 2592000000Optional browser wait time in milliseconds after initial page load. Min: 0. Max: 30000 (30 seconds). When combined with timeoutMS, timeoutMS must be at least waitForMs + 10000 ms; a shorter deadline is rejected with 400 TIMEOUT_TOO_SHORT_FOR_WAIT.
0 <= x <= 30000When true, waits briefly for CSS and transition animations to settle before extracting HTML. Defaults to false. This adds a bit of latency in exchange for more stable output on animated pages.
Optional browser actions executed in array order after the page loads and before content is captured. Requires a paid plan. Send a JSON array in the query parameter. Maximum: 5 actions.
5Browser action discriminated by do. Each variant exposes only its applicable fields.
- Wait
- Perform
- Scroll
Show child attributes
Show child attributes
Optional outbound HTTP headers forwarded only to the target URL, sent as deep-object query params such as headers[X-Custom]=value. When provided, caching is bypassed: the result is neither read from nor written to cache.
Show child attributes
Show child attributes
Fetch the target page through a residential proxy in this country (ISO 3166-1 alpha-2).
ad, ae, af, ag, ai, al, am, ao, ar, at, au, aw, az, ba, bb, bd, be, bf, bg, bh, bi, bj, bm, bn, bo, bq, br, bs, bw, by, bz, ca, cd, cf, cg, ch, ci, cl, cm, cn, co, cr, cv, cw, cy, cz, de, dj, dk, dm, do, dz, ec, ee, eg, es, et, fi, fj, fr, ga, gb, gd, ge, gf, gg, gh, gm, gn, gp, gq, gr, gt, gu, gw, gy, hk, hn, hr, ht, hu, id, ie, il, im, in, iq, ir, is, it, je, jm, jo, jp, ke, kg, kh, kn, kr, kw, ky, kz, la, lb, lc, lk, lr, ls, lt, lu, lv, ly, ma, mc, md, me, mf, mg, mk, ml, mm, mn, mo, mq, mr, mt, mu, mv, mw, mx, my, mz, na, nc, ne, ng, ni, nl, no, np, nz, om, pa, pe, pf, pg, ph, pk, pl, pr, ps, pt, py, qa, re, ro, rs, ru, rw, sa, sc, sd, se, sg, si, sk, sl, sm, sn, so, sr, ss, st, sv, sx, sy, sz, tc, td, tg, th, tj, tl, tm, tn, tr, tt, tw, tz, ua, ug, us, uy, uz, vc, ve, vg, vi, vn, ye, yt, za, zm, zw "de"
Optional timeout in milliseconds for the request. If the request takes longer than this value, it will be aborted with a 408 status code. Maximum allowed value is 300000ms (5 minutes).
1 <= x <= 300000Set to enabled to bypass shared caches and omit request and response content from retained usage logs. Requires zero data retention to be enabled for your organization (contact [email protected]), otherwise the request fails with ZDR_NOT_ENABLED. Successful ZDR responses include X-Context-ZDR: true.
enabled, disabled Comma-separated tags for tracking request usage. Up to 20 tags, each 1-50 characters. Optional tags for tracking usage. Up to 20 tags, each 1 to 50 characters.
201 - 50["production", "team-alpha"]
Response
Successful response
Indicates success
true The scraped content of the page. For normal pages this is the raw HTML. When the page is a sitemap or feed served behind an XSL stylesheet (which browsers render into HTML), this is the underlying XML instead — see the type field.
The URL that was scraped
Detected content type of the returned html field. Sitemaps and feeds are surfaced as xml; ordinary pages are html. Excel workbooks are surfaced as xlsx/xls with the extracted sheets as HTML tables; PowerPoint presentations are surfaced as pptx/ppt with the extracted slides as HTML.
html, xml, json, text, csv, markdown, svg, pdf, docx, doc, xlsx, xls, pptx, ppt Metadata extracted from the scraped page HTML.
Show child attributes
Show child attributes
Cache outcome for this response. Composite responses are hits only when every cache-controlled fetch contributing to the output was a hit; age_ms is the oldest contributing hit.
Show child attributes
Show child attributes
Unique id of this API call, also sent in the X-Request-Id response header. Quote it when contacting support about a failed request.
"3f1c2a6e-8b4d-4c1e-9f0a-2d7b5e6c8a91"
Credit usage, included whenever a valid API key is provided.
Show child attributes
Show child attributes
One verified outcome per requested browser action, in request order.
Show child attributes
Show child attributes
True when an action was applied but the returned content could not be refreshed afterward.
Was this page helpful?