Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Production-grade web scraping with automatic anti-bot bypass, structured JSON parsing for 40+ targets, and geo-targeting. Use when the user needs to scrape web pages, extract product data, get search results, or collect structured data from supported e-commerce and search platforms without worrying about getting blocked and when geo targeting is required.
.claude/skills/oxylabs-web-scraper-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 158% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 157% | 0% |
Requires HTTP Basic Auth with credentials from environment variables:
bashcurl -u "$OXY_WSA_USERNAME:$OXY_WSA_PASSWORD" ...
POST https://realtime.oxylabs.io/v1/queries # immediate response
POST https://data.oxylabs.io/v1/queries # Push-Pull jobs, callbacks, storage
Content-Type: application/json| Parameter | Required | Description | |-----------|----------|-------------| | source | Yes | Target scraper (e.g., universal, amazon_product, google_search) | | url | Conditional | URL to scrape (for universal and *_url sources) | | query | Conditional | Search query or product ID (for *_search and *_product sources) | | parse | No | Enable structured data parsing (recommended for supported sources) | | render | No | JavaScript rendering: html or png | | geo_location | No | Geographic targeting: country/state/city, ZIP/postcode, coordinates, or Criteria ID where supported | | session_id | No | Reuse the same proxy IP across multiple jobs | | content_encoding | No | Set to base64 when downloading image files via Realtime or Push-Pull | | user_agent_type | No | Device/browser preset, e.g., desktop_chrome, mobile_ios, tablet_android | | locale | No | Interface language / Accept-Language, e.g., de-DE | | callback_url | No | Push-Pull callback endpoint | | storage_type, storage_url | No | Push-Pull cloud upload target (gcs, s3, tos, s3_compatible) | | markdown, xhr | No | Enable markdown or captured XHR result types | | browser_instructions | No | Rendered browser actions; requires render: "html" | | parsing_instructions, parser_preset | No | Custom parser rules or saved preset; pair with parse: true | | client_notes | No | Client-side job tag saved with the job metadata | | domain, subdomain, start_page, pages, limit, store_id, delivery_zip, fulfillment_type | Source-specific | Marketplace/search/store localization and pagination fields |
user_agent_type values: desktop, desktop_chrome, desktop_edge, desktop_firefox, desktop_opera, desktop_safari, mobile, mobile_android, mobile_ios, tablet, tablet_android, tablet_ios.
Add these as { "key": "...", "value": ... } objects in context:
| Key | Use | |-----|-----| | force_headers, headers | Merge custom headers with managed headers | | force_cookies, cookies | Merge custom cookies with managed cookies | | http_method, content | Use post with Base64-encoded body content | | follow_redirects | Follow 3xx redirect chains | | successful_status_codes | Treat specific non-standard HTTP codes as successful |
For multi-format output, enable types in the payload (parse, markdown, xhr, render: "png") and request them with ?type=raw,parsed,png,markdown,xhr.
For batch Push-Pull jobs, use POST /v1/queries/batch with arrays only for query or url; keep all other parameters singular. Maximum batch size is 5,000 values.
Scrape any URL:
bashcurl -X POST 'https://realtime.oxylabs.io/v1/queries' \ -u "$OXY_WSA_USERNAME:$OXY_WSA_PASSWORD" \ -H 'Content-Type: application/json' \ -d '{"source": "universal", "url": "https://example.com"}'
Google search with parsing:
bashcurl -X POST 'https://realtime.oxylabs.io/v1/queries' \ -u "$OXY_WSA_USERNAME:$OXY_WSA_PASSWORD" \ -H 'Content-Type: application/json' \ -d '{"source": "google_search", "query": "best laptops", "parse": true}'
Amazon product by ASIN:
bashcurl -X POST 'https://realtime.oxylabs.io/v1/queries' \ -u "$OXY_WSA_USERNAME:$OXY_WSA_PASSWORD" \ -H 'Content-Type: application/json' \ -d '{"source": "amazon_product", "query": "B07FZ8S74R", "parse": true}'
amazon_product, google_search) - better parsing and reliabilityuniversal for unsupported sites - works with any URLparse: true for structured JSON output on supported sourcesjson{ "results": [{ "content": "...", "status_code": 200, "url": "https://..." }] }
With parse: true, content contains structured data (title, price, reviews, etc.) instead of raw HTML.
For the complete list of 40+ supported sources organized by category, see sources.md.
For detailed request/response examples including geo-location, JavaScript rendering, and custom headers, see examples.md.
| Code | Meaning | |------|---------| | 200 | Success | | 400 | Invalid parameters | | 401 | Authentication failed | | 403 | Access denied | | 429 | Rate limit exceeded |
parse: true for supported sources to get structured data"90210")"California,United States")render: "html" for JavaScript-heavy pagesrender: "" only to disable automatic forced rendering for force-rendered pages; set client timeouts near 180 seconds for rendered Realtime or Proxy Endpoint requestscontent_encoding: "base64" when scraping image URLs, then decode results[0].content before saving the file| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 16,788 | 29,924 | +78% | 1 | 1 | 0% | 1,849 | 2,551 | +38% | 0 | 0 | — |
case-01 | fail→pass | 21,891 | 10,157 | -54% | 1 | 1 | 0% | 944 | 2,437 | +158% | 0 | 0 | — |
case-02 | fail→pass | 13,466 | 9,544 | -29% | 1 | 1 | 0% | 1,477 | 2,281 | +54% | 0 | 0 | — |
case-03 | pass→pass | 12,459 | 10,708 | -14% | 1 | 1 | 0% | 1,081 | 2,438 | +126% | 0 | 0 | — |
case-04 | fail→pass | 12,761 | 10,388 | -19% | 1 | 1 | 0% | 1,885 | 2,470 | +31% | 0 | 0 | — |
case-06 | fail→pass | 11,424 | 9,861 | -14% | 1 | 1 | 0% | 918 | 2,359 | +157% | 0 | 0 | — |
case-07 | fail→pass | 11,549 | 5,379 | -53% | 1 | 1 | 0% | 1,070 | 2,363 | +121% | 0 | 0 | — |
case-08 | fail→pass | 9,729 | 9,382 | -4% | 1 | 1 | 0% | 1,555 | 2,307 | +48% | 0 | 0 | — |
case-09 | fail→pass | 19,519 | 9,802 | -50% | 1 | 1 | 0% | 2,949 | 2,170 | -26% | 0 | 0 | — |
case-10 | pass→pass | 9,358 | 6,351 | -32% | 1 | 1 | 0% | 1,639 | 2,628 | +60% | 0 | 0 | — |
case-11 | fail→pass | 10,192 | 10,732 | +5% | 1 | 1 | 0% | 1,941 | 2,709 | +40% | 0 | 0 | — |
case-12 | pass→pass | 15,657 | 10,207 | -35% | 1 | 1 | 0% | 1,707 | 2,304 | +35% | 0 | 0 | — |
case-13 | fail→pass | 15,412 | 10,816 | -30% | 1 | 1 | 0% | 1,802 | 2,680 | +49% | 0 | 0 | — |
case-14 | pass→pass | 16,887 | 8,713 | -48% | 1 | 1 | 0% | 1,723 | 2,142 | +24% | 0 | 0 | — |
case-15 | fail→pass | 14,977 | 10,126 | -32% | 1 | 1 | 0% | 2,176 | 2,177 | +0% | 0 | 0 | — |
case-16 | fail→pass | 17,263 | 9,581 | -44% | 1 | 1 | 0% | 1,852 | 2,249 | +21% | 0 | 0 | — |
case-17 | fail→pass | 8,232 | 8,620 | +5% | 1 | 1 | 0% | 1,270 | 2,178 | +71% | 0 | 0 | — |
case-18 | fail→pass | 12,839 | 10,036 | -22% | 1 | 1 | 0% | 1,134 | 2,245 | +98% | 0 | 0 | — |
case-19 | fail→pass | 15,084 | 7,667 | -49% | 1 | 1 | 0% | 1,519 | 1,844 | +21% | 0 | 0 | — |
case-20 | pass→pass | 10,507 | 9,065 | -14% | 1 | 1 | 0% | 787 | 2,222 | +182% | 0 | 0 | — |
case-21 | pass→pass | 11,104 | 9,562 | -14% | 1 | 1 | 0% | 922 | 2,280 | +147% | 0 | 0 | — |
case-22 | pass→pass | 12,922 | 22,155 | +71% | 1 | 1 | 0% | 1,193 | 2,487 | +108% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +68 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.