Skip to main content

POST /v1/scrape

The single endpoint that powers Web Unlocker. Send a URL plus options; receive the page content and any extracted data.

POST https://api.omniscrape.io/v1/scrape

Headers

HeaderRequiredValue
X-API-KeyYesYour API key
Content-TypeYesapplication/json

Minimal request

curl -X POST https://api.omniscrape.io/v1/scrape \
-H "X-API-Key: $OMNISCRAPE_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com" }'

Only url is required. Everything else has a sensible default — see Parameters.

{
"url": "https://example.com/listings",
"mode": "js_rendering",
"css_selectors": {
"titles": "h2.card-title",
"prices": ".card-price"
},
"proxy": "residential:us",
"js_wait_selector": ".card-title",
"session_id": "crawl-batch-42",
"enable_solver": true,
"timeout": 60,
"custom_headers": { "Accept-Language": "en-US" }
}

Response

{
"success": true,
"data": {
"content": "<html>...</html>",
"css_extracted": { "...": "..." },
"status_code": 200,
"final_url": "https://example.com/listings"
},
"metadata": {
"method_used": "js_rendering",
"elapsed_time": 5.2,
"solver_used": true,
"challenge_solved": true
},
"billing": { "charged": 0.0035, "balance_after": 49.9, "cost_per_request": 0.0035 }
}

See the Response reference for every field, and Errors for failure cases.

Synchronous vs async

POST /v1/scrape is synchronous: the connection stays open until the page is fetched and returns the result directly. For large batches or very slow targets, use the async jobs API so you don't hold connections open.