Skip to main content
Google Hotels, Google News, Ads Transparency, Shopee, Taobao and Upwork plugins; SDKs 0.14.0
Six new plugins: Google Hotels (properties for a place and dates with the price for the stay, and every booking site’s offer and room rates for one property), Google News (a search or a section, with the publisher’s own article URL), Google Ads Transparency (an advertiser’s Google ads with regions, targeting and the ad’s texts, plus advertiser lookup), Shopee (search in 8 markets and one product), Taobao & Tmall (keyword or category listings and one item) and Upwork (job posts, with proposals and client stats on request). The Wish and Smyths Toys plugins, already live, now have their pages too.SDKs 0.14.0 (Python, Node.js, PHP, Ruby) add 16 plugin methods: google_hotels, google_hotels_property, google_news, google_ads_transparency, google_ads_transparency_advertisers, shopee_search, shopee_product, taobao_search, taobao_product, upwork_jobs, smyths_inventory, smyths_details, smyths_search, smyths_category, wish_search and wish_product (camelCase in Node.js and PHP). The Temu methods stay in the SDKs for existing code but are deprecated. The MCP server (0.8.0 on npm) and the hosted connector (0.9.0) have the new plugins in their catalog, so list_plugins lists them and run_plugin runs them./serpApi: aiOverview now also has markdown (headings, lists and formulas as LaTeX) and references, the pages the overview cites, each with title, the real page url (null when Google exposes none), source, domain and snippet. text no longer carries Google’s interface labels and citation chips, and sources is filled again: Google started linking cited pages through a redirect, which had left it empty. See SERP scraping.Google Shopping: every product now carries currencyCode (ISO 4217) next to the currency symbol, and Google’s own ids productId, catalogId and offerId, which stay the same across searches. A product Google repeats on the page is listed once./getPageSource: URLs with non-ASCII characters in the path or query (Thai, Arabic, Korean, Hindi and so on) no longer fail with 500; they are percent-encoded the way a browser sends them. Challenge, deny and region-lock pages that some sites answer with a 200 (“Client Challenge”, “Verifying your browser”, “not available in your country”, an empty app shell) are now recognised as blocks: the call goes on to a path that gets the page, or ends as a free 403 instead of a billed 200. For a few sites whose regular page cannot be fetched but whose alternate rendering can, the answer comes from that rendering and names it in the new X-SU-Served-Url header - see Served variant.
Markdown for LLMs: markdown=true
/getPageSource returns any page as clean Markdown with markdown=true: headings, lists, tables, absolute links and images with alt text, without scripts, styles, navigation or footer, so an LLM reads the content instead of paying tokens for markup. By default you get only the main content; main_content_only=false keeps the whole page. It works on the same protected and JavaScript-rendered pages as an HTML call and is billed the same. See Markdown for LLMs. The SDKs (0.13.0) have a method for it: get_markdown() in Python and Ruby, getMarkdown() in Node.js and PHP.
get_cookies: fixed, first-party cookies, proxy country
get_cookies=true answered 403 (or 503) for many ordinary sites since early September; it now returns the page and its cookies again. The cookies list holds only the target site’s cookies (its domain and subdomains), and the response’s proxy field is the ISO country code of the exit that served the request, as described in cookies and sessions. The undocumented proxy_address field is gone; the official SDKs already read proxy.
MCP: browser steps have their own tool
Browser steps moved from fetch_html to a new MCP tool, browse_page (MCP server 0.6.0 on npm, hosted connector 0.7.0). Steps click, type and submit on the target website, so the tool that runs them is the one tool annotated as not read-only, and assistants that ask before such actions now ask before it; fetch_html and every other tool stay read-only. Pass the same steps to browse_page that you passed to fetch_html.
MCP: read pages as Markdown, search and read in one call
The MCP server (0.5.0 on npm) and the hosted connector (mcp.scrapeunblocker.com, 0.6.0) have two new tools. fetch_markdown returns a page as clean Markdown: the main content with absolute links and tables, without scripts, styles, navigation or footer. It is usually 2-25% the size of the HTML, so an assistant can read far more pages in the same context. search_and_read runs a Google search and reads the top 1-5 results as Markdown in one call, with Google’s AI Overview when there is one; it is billed as one search plus one request per page read. The MCP page now also shows how to install the server in Cursor and VS Code.
MCP: popular plugins as their own tools
The MCP server (0.4.0 on npm) and the hosted connector (mcp.scrapeunblocker.com, 0.5.0) expose the 15 most-used site plugins as tools of their own: Amazon search, product and reviews, Walmart, eBay, Google Shopping, Google Local, Google Maps place details, Google Images, YouTube search and transcripts, Zillow, Indeed, Trustpilot and Booking.com. Their parameters are part of the tool schema, so an assistant calls them in one step instead of looking them up with list_plugins first. Every plugin, these included, still runs through run_plugin. The hosted connector is also listed on Smithery.
Scrapy middleware 0.1.0
The Scrapy middleware is now open source on GitHub: add one line to DOWNLOADER_MIDDLEWARES and your existing spiders fetch every page through /getPageSource. response.url, response.follow() and relative links keep pointing at the target site, a dead URL reaches your spider as a normal 404 / 410, and 429 / 5xx go through Scrapy’s own retries. The guide now lists every setting, the options you can pass per request and the recommended concurrency and timeout settings.
Google Images: time filter
Google Images takes Google’s own time filter: time_range (hour, day, week, month, year) returns only the images Google found in that recent period, and date_from / date_to (YYYY-MM-DD) set a fixed window. A query you scan on a schedule now returns what is new since the last run instead of the same top results. Calls without these parameters are unchanged.
getPageSource: slow and apex-only sites, the target's own 204 / 401 / 451 / 500
/getPageSource no longer reports a live site as down when it is only slow: a target that takes longer than a few seconds to answer used to come back as 523 Origin unreachable, and now gets more time within the call’s 60 s cap.A URL on a domain that only exists without www (for example httpbingo.org) used to get a billed 400 Hostname cannot be resolved; it is now fetched on the domain as you sent it. Only a domain that does not resolve at all still gets that 400.The target’s own 204 comes back as an empty 200, and its own 401, 451 or empty 500 as a 200 with the target’s body and X-Origin-Status (see Dead URLs). These used to come back as 403, as if bot protection had blocked the page.
getImage returns the original image
/getImage now returns the image’s bytes exactly as the image host serves them, with the image’s own Content-Type (JPEG, PNG, WebP, AVIF, GIF with its animation, SVG, ICO, …). Until now every image was re-encoded to PNG, which made JPEG and WebP files several times larger and kept only the first frame of a GIF. Typical latency drops to 1-3 s; a real browser still steps in when the image host answers with a bot challenge.Errors now say what happened: a missing image is the host’s own 404 / 410 with X-Origin-Status (billed, like a dead page on /getPageSource), a URL that is not an image returns 415, an unreachable image host 523, and a file over 50 MB 413 - none of these billed. A missing image used to come back as a 200. 408 is no longer returned. Pass the image URL itself: a page URL now returns 415 instead of the page’s first image.
parsed_data: full spec sheet and Schema.org facts on detail pages
parsed_data=true detail pages (listing_detail, product_detail, recipe_detail, …) now carry the page’s whole spec sheet as specifications ("label": "value", as the page prints it) and the facts the page publishes as Schema.org data - price, brand, mileage, rating, recipe ingredients and steps, job salary, film cast, … - as English snake_case fields. article_detail pages gain content, the article’s main text. The same site served in another language (a German and an English mobile.de page) no longer loses most of its fields. List pages return a link for every result. Existing fields keep their names.
429 responses carry Retry-After
A request over your concurrent requests limit still returns 429 Concurrency limit exceeded with X-SU-Deny-Reason: concurrency, and now also the header Retry-After: 1 - the number of seconds to wait before retrying. Nothing else changes; clients that already back off on 429 keep working.
Every plugin documented, in all four SDKs and the MCP server
51 new plugin pages - the plugins overview now lists every public plugin in 14 categories: e-commerce (Walmart, Target, Best Buy, Home Depot, SHEIN, AliExpress, Alibaba, 1688, TikTok Shop, Amazon Best Sellers and reviews), groceries (Woolworths, Coles, ALDI Australia), travel (Booking.com reviews, Airbnb listings and reviews, Tripadvisor), Google (Trends, Shopping, Jobs, Maps place details), Bing, DuckDuckGo, Yahoo and Brave, real estate (Zillow, Redfin, Rightmove, Idealista, ImmobilienScout24), AutoScout24, jobs (Glassdoor, Naukri, Wellfound, company career sites), reviews and companies (Trustpilot, G2, Capterra, Product Hunt, Crunchbase), Yelp, Naver Place, Google Play, the App Store, YouTube, Spotify, Similarweb, Ahrefs and Semrush.SDKs 0.11.0 (Python, Node.js, PHP, Ruby) have a method for every plugin plus a generic plugin(path, params); each plugin page shows the call in all four languages. MCP server 0.3.2 and the hosted connector add list_plugins and run_plugin, so an AI assistant can find and run any plugin (MCP).
Skyscanner: a failed place lookup is a 502; oopbuy: Taobao page size
  • Skyscanner flights and hotels: when the place lookup for origin, dest or destination fails on our side, the call now returns 502 (Could not look up ... - please retry.) instead of 404 No airport/city match. A 404 now always means Skyscanner has no such place. Not billed; retry with backoff.
  • oopbuy search: page_size is capped to what the source serves - at most 50 for 1688 and 20 for taobao. A Taobao search with a larger page_size used to return 502 No listings collected.
Monthly budget limit: a new 402 User set budget exceeded
You can now set a monthly budget limit (EUR, excluding VAT) in your profile. Once this billing period’s spend - your plan’s fixed fee, if any, plus billed usage - reaches it, API calls return 402 with the plain-text body User set budget exceeded until the next billing period or until you raise or remove the limit. Empty or 0 means no limit; on a plan with a fixed monthly fee the limit cannot be lower than that fee. Not billed. See 402 payment required.
Plugins: timeouts are a 502, Skyscanner car hire defaults, Amazon exitProvider is a proxy type
  • Plugin timeouts: a dedicated plugin call that does not finish within its time limit now returns 502 with a plain-text ... timed out. message. Some plugins (for example Walmart search) used to answer a timeout with a 500. Not billed; retry with backoff. /getPageSource and /serpApi keep their 504.
  • Skyscanner car hire: market, locale, currency and driver_age are optional, with the defaults UK, en-GB, GBP and 30 (the same as flights and hotels). A request without dates or a pickup gets an immediate 400 naming the missing parameters.
  • Amazon: exitProvider now reports the proxy type (isp, residential or datacenter) instead of a provider name.
parsed_data: a page with nothing to extract is a 200 again, now with its HTML
With parsed_data=true, a page that exists and renders now always comes back as 200, also when no structured data can be extracted from it. Instead of the 422 no_data_extracted introduced on 2026-09-30, the body is {"data": {"page_type": "unknown", "data": {}}, "data_extracted": false, "detail": "...", "html": "..."} - it says that nothing was extracted and carries the rendered HTML, so you can parse the page yourself without a second call. It is billed like a call without parsed_data. A parser error on our side now gives the same 200 instead of a 500. Successful parses and dead URLs (404 / 410 with page_type: "not_found") are unchanged. See parsed data.
parsed_data: an empty result is no longer billed
With parsed_data=true, a page that rendered but gave no structured data used to come back as a billed 200 with {"page_type": "unknown", "data": {}}. It now returns 422 with {"error": "no_data_extracted"} and is not billed; the response carries no HTML - call without parsed_data to get the page. We also fixed the cause of most of these empty results: a field mapping could break on product specs whose labels contain quotation marks, so the same URL sometimes parsed and sometimes did not. A dead URL with parsed_data=true returns 404 / 410 with {"data": {"page_type": "not_found", "data": {}}}.
A target's 404 / 410 now comes back as 404 / 410
When the target site says the page does not exist, getPageSource now returns the target’s own 404 or 410 with its page as the body and X-Origin-Status set. Before, the same answer came back as a 200 with the header. Billing is unchanged: these calls are billed, and retrying them returns the same answer. A 404 without X-Origin-Status is ours (a wrong API path, or /getImage finding no image). A dead origin’s own 5xx error page still comes back as a 200 with X-Origin-Status. If your code treats every non-200 as a failure to retry, handle 404 / 410 with the header as a dead URL instead. The SDKs (0.7.0 and later) raise TargetNotFoundError for it (TargetNotFoundException in PHP). See Errors.
proxy_country: a country we cannot serve fails fast
  • A proxy_country that is not an ISO 3166-1 alpha-2 code (for example ZZ or germany) now returns 400 right away. uk keeps working as GB.
  • A real country we hold no exits in: plain pages are still fetched through a residential exit in that country; a page that needs a browser now returns 400 with the list of countries we can serve, in seconds. Before, both cases could wait up to 3 minutes and end in 500 / 504.
  • 400 responses are not billed.
Plugin fixes: Amazon product, mobile.de, Etsy
  • Amazon product: an ASIN Amazon does not have on that marketplace now returns 404 in a few seconds. Before, it failed after about a minute with 502 (“bot wall”) and asked you to retry.
  • mobile.de: searches work again. Since 2026-09-23 every call failed with 502.
  • Etsy: paid ad placements are left out by default. Pass include_sponsored=true to get them back (marked sponsored: true).
Plans are limited by concurrent requests only
Plans no longer have a per-second limit. The only limit on your key is concurrent requests - how many of your requests can be in flight at once: Pay as you go 20, Starter 25, Pro 100, Business 200, Scale 300, Ultimate 400. A request over it gets 429 Too Many Requests right away (header X-SU-Deny-Reason: concurrency), and 429 responses are not billed. See Concurrency limits.
Plugin fixes: Etsy, Indeed, Target, Booking, Skyscanner
  • Etsy: each listing comes back once (before, most came back twice). currency is now the ISO code (USD, EUR); the symbol moved to the new currencySymbol. New sponsored flag marks Etsy’s ads. Price-sorted searches that Etsy rate-limits are retried instead of failing.
  • Indeed: new datePosted and sponsored per job; sort=date returns jobs newest first; totalResults is filled again.
  • Target: sort (price_low, price_high, …) is applied again.
  • Booking: prices are rounded to cents.
  • Skyscanner flights: an exact airport code (JFK) searches that airport, not the whole city.
Concurrent requests limit per plan, clearer 429s
Every plan now has a concurrent requests limit next to its rate limit: how many of your requests can be in flight at once (Pay as you go 10, Starter 25, Pro 50, Business 100, Scale 200, Ultimate 400). Both limits apply together; the plan card in the dashboard shows the ones on your key. A request over either limit gets 429 Too Many Requests right away, and the new X-SU-Deny-Reason header says which limit it hit: rate or concurrency. 429 responses are not billed. See Rate limits for the table and the recommended retry loop.
Google Images: up to 5 result pages, market follows proxy_country
POST /images/google-search takes a new pages parameter (1-5, ~100 results per page, Google stops at roughly 400-500 per query). Each page fetched is billed as one request; the response reports it in pagesFetched. The Google market now follows proxy_country automatically - gl is an optional override and empty by default (before, it defaulted to us even when another proxy_country was set). max_results is now an optional cap up to 500. One-page calls behave exactly as before.
Dead URLs: X-Origin-Status, billing and a complete error reference
When the target site answers that a page does not exist (404 / 410), getPageSource now always returns it as a 200 with the page as served and an X-Origin-Status header carrying the target’s status - the same header a dead origin’s own 5xx page already had. Previously some of these came back as 403 Blocked by bot protection., which read as a block. These calls are billed like any delivered page; a URL whose domain does not exist returns 400 Hostname cannot be resolved and is billed too. Responses our gateway generates itself (502 / 503 / 504) are never billed. Errors now lists every status with whether it is billed, and explains how to tell a target problem from an outage on our side; Handling failures covers 503, 504, 523 and dead URLs.
Mobile.de plugin
New plugin page: POST /vehicles/mobile-de. Search mobile.de, Germany’s largest used-car marketplace, by make and get clean, parsed JSON with pagination to max_results: title, make and model, price (EUR), first registration, mileage, power (kW/PS), fuel and a direct listing URL. Filter by price_min/price_max, year_min, mileage_max and fuel; pass a friendly make name or a raw make_id. It runs on the same anti-bot fetch chain as getPageSource - no per-site API key, account or CAPTCHA setup.
Three marketplace plugins: Target, Vinted and Zalando
New plugin pages: POST /marketplace/target-search, POST /marketplace/vinted-search and POST /marketplace/zalando-search. Each returns clean, parsed JSON with pagination to max_results: Target US retail search (tcin, title, brand, price, image, URL) via Target’s own Redsky API; Vinted EU resale listings on any regional marketplace (title, price and currency, brand, size, condition, image); and Zalando EU fashion search on any storefront (sku, brand, name, price and currency, image). All run on the same anti-bot fetch chain as getPageSource - no per-site API key, account or CAPTCHA setup.
Google Images: googleImagesUrl (/imgres viewer link) per result
POST /images/google-search now returns a googleImagesUrl on every result - the Google Images viewer link (the /imgres?... URL a browser copies from a result tile), reconstructed from the result data. Existing fields are unchanged; this is purely additive.
Five marketplace, travel and jobs plugins documented
New plugin pages: POST /marketplace/walmart-search, POST /marketplace/etsy-search, POST /travel/booking, POST /travel/airbnb and POST /jobs/indeed. Each returns clean, parsed JSON with pagination to max_results: Walmart and Etsy product search (title, price, rating, shop/seller, image, URL); Booking.com hotels (name, price for your dates, review score, address, coordinates); Airbnb stays (name, room type, nightly price, rating, coordinates, badges); and Indeed jobs (title, company, parsed salary min/max, job types, company rating, snippet). All run on the same anti-bot fetch chain as getPageSource - no per-site API key, account or CAPTCHA setup.
Car Hire: target a location by ID + clearer resolution
POST /carhire/skyscanner-quotes now takes pickup_entity / dropoff_entity - Skyscanner’s own location IDs. Pass one to skip the name lookup and search that exact place, useful for a town the autosuggest can’t reach or a name that resolves ambiguously. A place name that can’t be resolved now returns an error instead of silently searching a different location, and the X-Pickup-Entity / X-Pickup-Name (and X-Dropoff-*) response headers report the location that was actually searched.
Google Images plugin
New plugin: POST /images/google-search. Google Images results for a keyword as clean JSON - the full-resolution original image URL and source domain for every result, plus the source page URL, title, site name, thumbnail and dimensions. The current Google Images page carries every result’s origin image URL inline, so imageUrl is the real image on the publisher’s site, not a Google thumbnail. Runs on the same warm, anti-bot-cleared Google sessions as our SERP endpoint. Pass q, and optionally proxy_country / gl / max_results (1-100).
HTTP 523 for an unreachable origin (not a block)
getPageSource now answers 523 when the target origin itself is unreachable - down, refusing connections, or flapping (brief outages, then fine) - instead of a 403 Blocked by bot protection.. A 523 is not a bot block and is never billed; it means the site did not answer over any of our exits, so the right move is to retry later. 403 stays reserved for a real anti-bot block we could not clear. If your client keyed retries on 403 only, treat 523 the same way (retry after a short pause).
YouTube channel endpoint returns exact counts, duration and channel stats
POST /content/youtube-channel now returns richer data. The endpoint reads a channel’s uploads through the YouTube Data API, so each video now carries exact viewCount, likeCount and commentCount, duration (ISO-8601 and durationSeconds), description and a publishedAt timestamp, alongside the existing views / published text. The channel summary gains subscriberCount, videoCount, total viewCount and the handle. A new limit parameter (1-200) pages past the first batch of videos. If the Data API is unavailable the endpoint falls back to the previous scrape, so responses stay compatible.
getPageSource redirects Temu search and product URLs to the plugins
getPageSource now redirects Temu search and product URLs. A POST /getPageSource for a Temu search page (/search_result.html) or a product page (a -g-<id>.html URL) returns 400 with the endpoint that actually works - the Temu plugin (/goods/temu-search, /goods/temu-product) - in the body and the X-Recommended-Endpoint header. Those pages hydrate client-side and the generic browser path renders them slowly and hands back an empty shell, while the plugin reads Temu’s ld+json directly. Every other Temu page (homepage, category pages) still works through getPageSource.
Documentation moved to docs.scrapeunblocker.com
This site now lives at docs.scrapeunblocker.com. Every page keeps its path: links to developers.scrapeunblocker.com redirect permanently (301) to the same page here, so old bookmarks, SDK READMEs and search results keep working. The API Reference is part of this site, and the raw OpenAPI 3.1 file is served at /api-reference/openapi.json and, as before on this hostname, at /openapi.json.
ChatGPT setup guide for the MCP server
ChatGPT can now use the hosted MCP server as a custom connector - there’s a dedicated, screenshot-by-screenshot ChatGPT setup guide. It connects with your API key in the URL (No Auth) from chatgpt.com (web, not the desktop app), under Settings → Plugins → Developer mode.The MCP server exposes four tools: fetch_html, fetch_parsed, google_search and list_elements.
New Meta Ad Library plugin - a competitor's live Facebook & Instagram ads as JSON
Meta Ad Library plugin. A new endpoint, POST /ads/meta-ad-library, returns a Facebook/Instagram advertiser’s ads from Meta’s public Ad Library as structured JSON: ad_text, title, cta_text/cta_type, display_format (image/video/DCO/carousel), creatives (image and video URLs), link_url (the landing page), platforms, and started_running/ended dates.Give it an advertiser - a Page name or a numeric Page ID - and a country; filter with active_status and media_type, and bound the result with max_ads. Unlike Meta’s official Ad Library API - which returns full data only for political and social-issue ads - this reads the same public library anyone can open, so it covers ordinary commercial advertisers. A competitor-ads tool.Available in the Python, Node.js, PHP and Ruby clients.
Browser steps and element discovery on getPageSource
Drive a real browser after the page loads. getPageSource takes two new parameters, documented in browser steps and element discovery:
  • steps - a JSON array of actions the API runs in a real browser once the page has loaded, before returning the resulting HTML: wait_for, wait_for_text, wait, click, type (human-like keystrokes), select, press_key and scroll. Fill a search form and read the results, click a “load more” button, scroll an infinite list. Bounded to ~10 steps and a ~30-second total budget; a failed step returns HTTP 422 with step_index, action, reason, selector and the page html at the point of failure. Steps have side effects and are not idempotent - treat the call like a POST.
  • list_elements=true - the discovery half. Returns the page’s interactive elements as JSON ({ url, count, elements }) instead of HTML, each element carrying tag, text, id, name, type, placeholder, aria_label, href and a ready-to-use selector you can drop straight into a steps action. List the elements, build the steps, run them - a clean loop for AI agents. Read-only and idempotent.
Both land in the official Python, Node.js, PHP and Ruby clients: pass a native array/list for steps and a boolean for list_elements.
New Amazon plugin - product + search, prices in the right currency
Amazon plugin. Two new endpoints: POST /marketplace/amazon-product returns one product by ASIN or URL (title, brand, price + currency, list price and savings, availability, rating, review count, seller, feature bullets, categories and images), and POST /marketplace/amazon-search returns a keyword search’s result cards (ASIN, title, price, rating, review count, clean product URL, sponsored / Prime flags) on any of 20 regional marketplaces.Prices come back in the right currency automatically: proxy_country defaults to the marketplace’s home country (amazon.com -> US, amazon.de -> DE, …) and the request is routed through ISP proxies in that country, so amazon.com returns USD and amazon.de returns EUR with no configuration. No Selling Partner / Product Advertising API account needed.
API v3 - Google SERP on su_browser, proxy_country fallback, getPageSource redirects Google search
API v3 - Google SERP overhaul. /serpApi is now served by our own su_browser engine over the ISP proxy pool. Callers use it exactly as before, with two user-facing changes:
  • proxy_country falls back instead of erroring. It is matched against the countries we can serve (BE, CA, CH, CN, DE, DK, ES, FR, GB, HK, HR, IE, IT, JP, KR, LT, NL, NO, PL, RO, SE, SG, TW, US). Ask for a country we do not have an exit for and the request still succeeds from an available exit, with two extra response fields: requestedCountry (the ISO2 you asked for) and note (a human-readable explanation of the fallback).
  • getPageSource now redirects Google search URLs. A google.<tld>/search path, or a google.<tld> homepage with a q= query, returns HTTP 400 pointing you to POST /serpApi?keyword=<term>. Other Google URLs (Maps, etc.) are unaffected.
Temu search sort - relevance, sales, recent, price
Temu search takes a sort. POST /goods/temu-search?keyword=...&sort=... now orders results using Temu’s own sort: relevance (default), best_selling, recent, price_asc (price low to high) or price_desc (price high to low). It is server-side, so the whole result set comes back sorted, not just a re-order of the page. The chosen sort is echoed in the response.
Temu product returns reviews, video and variant group
Temu product returns more fields - all from the same document, at no extra request. POST /goods/temu-product now also includes:
  • reviews - per-review rating and date. Temu masks the review author and text in the crawler document (they come back as ****); the rating and date are real.
  • video - { contentUrl, thumbnailUrl, uploadDate } when the product ships a video, else null.
  • variantGroupId - the Temu product-group ID that ties variants of the same item together.
  • itemCondition - schema.org condition URL, e.g. .../NewCondition.
All additive - existing fields are unchanged. The image list still carries the 1-2 images Temu puts in the crawler document, not the full gallery.
Spider Cloud SDK and su-cloud CLI
Spider Cloud has a Python client and a command line. Everything the dashboard does - deploy a project, run and watch jobs, schedule them, pull the scraped items - now works from a script.
  • su-cloud CLI: deploy, run, jobs, logs, items, download, stats, schedule-add, destination-add and more.
  • SpiderCloudClient library: projects, deploys, jobs, schedules and destinations, plus job.items() to stream data by cursor and job.download() for a full .jsonl.gz export.
  • Authenticates with a per-account API token, created in the dashboard under Spider Cloud → API tokens. Pure standard library, no runtime dependencies. See SDK & CLI.
Temu search returns ~40 product URLs, ~2s
Temu search is faster and wider. POST /goods/temu-search now returns about 40 product URLs per keyword in ~2s (up from ~14, and no third-party search in the loop). Search is discovery only
  • fetch each URL’s data through POST /goods/temu-product. The details parameter has been removed.
New Temu plugin - product data and keyword search
New plugin: Temu. Two endpoints for Temu, which never serves product data to a browser (the page hydrates through a call that refuses automation). The plugin reads the ld+json document Temu serves to search crawlers instead - the only view that carries the real fields.
  • POST /goods/temu-product?url=... returns a single product as JSON: name, description, brand, price, priceCurrency, availability, rating, reviewCount and images.
  • POST /goods/temu-search?keyword=... returns product URLs taken straight from Temu’s own search page (no third-party search in the loop). With details=true it also resolves the top results to full product objects.
Temu meters the crawler view, so the plugin is built for targeted use (price checks, monitoring, comparison), enforces its own fleet-wide rate limit, and answers 429 when the budget is spent. Price currency follows the exit region. See the Temu plugin page.
Claude Code plugin
ScrapeUnblocker installs into Claude Code with two commands.
You get the three MCP tools (fetch_html, fetch_parsed, google_search), a /scrape-url command, and reference skills Claude pulls in while writing scraping code for your project. Your API key is prompted for once when the plugin is enabled and stored in your operating system’s keychain - no environment variable to set, no config file to edit. See Claude Code Plugin.
Google Local contacts, Skyscanner markets, SERP retries
Fixes from one round of outside testing.Google Local returns phone and website. The phone used to arrive glued to the end of hours; it is now its own field and hours is clean. website is new. Paid listings are flagged with sponsored and no longer report “Sponsored” as the business name. See Google Local.Skyscanner flights honour market, locale and currency. A request for market=TR&locale=tr-TR&currency=TRY came back priced in GBP with en-GB deep links; it now returns Turkish lira and Turkish place names./serpApi no longer fails a query that has an answer. A search whose results page did not finish rendering was returned as a successful but empty fetch, which surfaced as 502 No SERP results collected on a query that worked on the next call. That page is now discarded and retried. Separately, a search where Google genuinely reports no matches - normal for a narrow site: query - returns 200 with an empty result set instead of a 502.
New plugin - eBay Search
POST /marketplace/ebay-search turns any eBay search into structured JSON on 19 regional marketplaces, from ebay.com to ebay.com.au. Each listing comes back with title, numeric price and currency, condition (plus a normalised conditionCode), seller username and feedback, shipping cost, sold / watcher / bid counts, image and a clean item URL:
Filter with condition, listing_type, min_price/max_price, free_shipping, seller or category; sort with sort; page with page/page_size (60, 120 or 240 per page).When eBay finds no exact match it still serves a page of loosely-related suggestions. Those are never passed off as results: the response sets exactMatches: false and explains it in notice.The plugin is live in the dashboard, in all four SDKs on 0.1.8, and documented at eBay Search.
SERP: every ad, accurate organic counts, AI Overview
/serpApi now returns every paid unit on the page. Google had started serving part of its ad inventory from a wrapper inside the organic column rather than the two containers we read, so those units were missing: a German insurance query carried six ads and came back with four. Ads are now found wherever they sit and sorted into topAds / bottomAds by their position relative to the organic results.organicResultsCount was double the real number. Two of the paths used to collect organic results reached the same entries at different depths, so every result was returned twice - positions 1-9 followed by an identical 10-18. The list is now deduplicated, which means the count you get for an unchanged query will be about half of what it was, and correct. Paid blocks that Google places inside the organic column are excluded from organic as well.New field: aiOverview. Google’s AI-written summary above the results, with the hostnames it cites, or null when the search has none:
It is read from the page we already fetched, never waited for, so it adds no latency. See SERP scraping.Faster, too. The extraction step used to wait a flat 1.2 s for ads that measurement showed arrive within ~0.4 s, and Google’s “unusual traffic” challenge went undetected whenever it was served at the search URL instead of redirecting - so a burnt exit was retried instead of replaced. Both fixed.wait_after_load works again. The engine now serving SERP was ignoring it entirely. It is also no longer something you should need: extraction waits for the ads on its own, so use wait_after_load only when you deliberately want a longer settle.
Spider Cloud documented
Spider Cloud now has its own section: host your own Scrapy project with us, deploy it straight from a git repository, run and schedule spiders, and read the items back - with ScrapeUnblocker routing built in, so a spider that gets blocked elsewhere needs no proxy or fingerprint code here.Eight pages, starting with Getting started, which walks one repository from an empty dashboard to a finished run with data in it. The one to read before your first run is routing modes - the choice between off, marked and all decides what a job costs:
all sends every request through the API, so a spider walking a hundred thousand detail pages makes a hundred thousand paid calls. marked exists so a producer can be unblocked without dragging its consumer onto the paid path.Also covered: projects and settings (including why some projects cannot see environment variables at all), deploys and refs, jobs, schedules and delivery destinations.
All four SDKs on 0.1.6 - typed billing errors
The Node.js, Ruby and PHP SDKs now carry the same typed billing errors released for Python earlier today, and all four are on 0.1.6 so their version numbers line up from here on:
Each one gains PaymentRequired* for 402 (with the quota, credit-limit and failed-payment subclasses), the no-subscription flavour of 401, and typed errors for 404, 408, 415 and 422. Nothing was removed, so existing APIError / ApiException handlers keep working. See the Node.js, Ruby and PHP guides.
Python SDK 0.1.6 - typed billing errors
scrapeunblocker 0.1.6 for Python raises a typed exception for every documented status code. 402 previously arrived as a bare APIError; it now raises PaymentRequiredError, with a subclass per billing block - QuotaExceededError, CreditLimitExceededError and PaymentFailedError - so each can be handled separately:
Also new: NoSubscriptionError (the 401 that means the key is fine but the account has no plan), plus NotFoundError, BrowserTimeoutError, UnsupportedContentError and ValidationError. Nothing was removed and every new class derives from APIError, so existing handlers keep working. See the Python SDK guide.
402 and 401 responses documented
The Errors page now documents HTTP 402, which was missing from the status table entirely. A 402 has three distinct plain-text bodies, each with its own fix:
  • Quota exceeded - the plan’s requests for this billing period are used up
  • Credit limit exceeded - the unpaid balance has grown past the account’s credit limit
  • Payment failed - update payment method - a card payment for an open invoice has been declined three times
All three clear on their own once the underlying billing state changes - access returns within about a minute, with no key change needed. Note that subscribing to a new plan does not clear a failed payment: the old unpaid invoice has to be settled. See 402 payment required.HTTP 401 is now documented properly too, with its two bodies - Unauthorized (key not recognised) and No valid subscription (key is fine, account has no active plan) - plus the neighbouring cases: omitting the x-scrapeunblocker-key header entirely returns 400, not 401, and neither 401 nor 402 counts against your quota. See 401 unauthorized.
New oopbuy product-search plugin
A new plugin returns oopbuy.com product-search listings as structured JSON - title (English and Chinese), USD and CNY price, monthly sales count, image and a product-detail link, in about a second:
Pick the source marketplace with channel (1688, taobao, official), order with sort, and page with page / page_size. Note that oopbuy trademark-blocks brand-name keywords (nike, adidas) at its own backend - those come back as a successful 200 with keywordRejected: true and an empty results array (oopbuy’s own genuine response), not an error. Available in the dashboard, the API reference, and all four SDKs. See oopbuy Search plugin.
New Google Local (Maps) plugin
A new plugin returns Google Local (Maps) business listings as structured JSON - name, rating, review count, price level, category, address, opening hours and a top review snippet:
It runs on our warm, anti-bot-cleared Google sessions, so you get the local pack without a Google Places API key or billing project. Available in the dashboard, the API reference, and all four SDKs. See Google Local plugin.
Skyscanner plugins in the API reference
The three Skyscanner plugin endpoints are now part of the public OpenAPI spec, so they show up in the API Reference and in any OpenAPI-aware client (Postman, Insomnia, code generators):
Nothing changed about how they work - they were already documented and available in all four SDKs. See Skyscanner plugins.
Clearer errors for non-HTML URLs and Skyscanner searches
getPageSource no longer reports two cases as 403 Blocked by bot protection when no block was involved:
  • A URL that serves an image or other non-HTML resource now returns 415 naming the content type. For images, use getImage.
  • A Skyscanner flights / hotels / car-hire search URL now returns 400 pointing at the plugin that serves it, with the endpoint in the X-Recommended-Endpoint header. Other Skyscanner pages are unaffected.
Also fixed: getImage returned 404 No image found for every URL. It now returns the PNG.
Hosted MCP connector
Added a hosted MCP connector so you can use ScrapeUnblocker in claude.ai (web and mobile) with no local install - just add a custom connector with your key:
See the MCP server guide.
MCP server for Claude
Released the official MCP server so Claude (Desktop, Code, and the web app) and any other Model Context Protocol client can fetch any web page through ScrapeUnblocker, using your own API key:
Three tools: fetch_html, fetch_parsed, and google_search. See the MCP server guide.
Official SDKs
Released official client libraries for four languages, each wrapping getPageSource (HTML / parsed JSON / cookies), serpApi, getImage, and the Skyscanner plugins - with typed errors and automatic retries:
See the Python, Node.js, PHP and Ruby guides.
Plugins
Introduced Plugins - ready-made scrapers for specific sites that return clean, structured JSON. Available in the dashboard (no code) and via the API for volume.First release covers three Skyscanner plugins:
  • Flights - POST /flights/skyscanner-quotes
  • Hotels - POST /hotels/skyscanner-quotes
  • Car Hire - POST /carhire/skyscanner-quotes
All three share your existing API key and plan quota. See the Plugins overview.
v1.0.0
Public documentation launched at developers.scrapeunblocker.com.Three endpoints documented:
  • POST /getPageSource
  • POST /serpApi
  • POST /getImage
All other paths remain internal and are not part of the public API contract.