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,destordestinationfails on our side, the call now returns502(Could not look up ... - please retry.) instead of404 No airport/city match. A404now always means Skyscanner has no such place. Not billed; retry with backoff. - oopbuy search:
page_sizeis capped to what the source serves - at most 50 for1688and 20 fortaobao. A Taobao search with a largerpage_sizeused to return502 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
502with a plain-text... timed out.message. Some plugins (for example Walmart search) used to answer a timeout with a500. Not billed; retry with backoff./getPageSourceand/serpApikeep their504. - Skyscanner car hire:
market,locale,currencyanddriver_ageare optional, with the defaultsUK,en-GB,GBPand30(the same as flights and hotels). A request without dates or a pickup gets an immediate400naming the missing parameters. - Amazon:
exitProvidernow reports the proxy type (isp,residentialordatacenter) 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_countrythat is not an ISO 3166-1 alpha-2 code (for exampleZZorgermany) now returns400right away.ukkeeps working asGB. - 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
400with the list of countries we can serve, in seconds. Before, both cases could wait up to 3 minutes and end in500/504. 400responses are not billed.
Plugin fixes: Amazon product, mobile.de, Etsy
- Amazon product: an ASIN Amazon does not have on that
marketplace now returns
404in a few seconds. Before, it failed after about a minute with502(“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=trueto get them back (markedsponsored: 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).
currencyis now the ISO code (USD,EUR); the symbol moved to the newcurrencySymbol. Newsponsoredflag marks Etsy’s ads. Price-sorted searches that Etsy rate-limits are retried instead of failing. - Indeed: new
datePostedandsponsoredper job;sort=datereturns jobs newest first;totalResultsis 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_keyandscroll. 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 withstep_index,action,reason,selectorand the pagehtmlat 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 carryingtag,text,id,name,type,placeholder,aria_label,hrefand a ready-to-useselectoryou can drop straight into astepsaction. List the elements, build the steps, run them - a clean loop for AI agents. Read-only and idempotent.
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_countryfalls 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) andnote(a human-readable explanation of the fallback).getPageSourcenow redirects Google search URLs. Agoogle.<tld>/searchpath, or agoogle.<tld>homepage with aq=query, returns HTTP 400 pointing you toPOST /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-reviewratinganddate. 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, elsenull.variantGroupId- the Temu product-group ID that ties variants of the same item together.itemCondition- schema.org condition URL, e.g..../NewCondition.
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-cloudCLI:deploy,run,jobs,logs,items,download,stats,schedule-add,destination-addand more.SpiderCloudClientlibrary: projects, deploys, jobs, schedules and destinations, plusjob.items()to stream data by cursor andjob.download()for a full.jsonl.gzexport.- 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. Thedetailsparameter 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,reviewCountandimages.POST /goods/temu-search?keyword=...returns product URLs taken straight from Temu’s own search page (no third-party search in the loop). Withdetails=trueit also resolves the top results to full product objects.
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¤cy=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: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: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: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 upCredit limit exceeded- the unpaid balance has grown past the account’s credit limitPayment failed - update payment method- a card payment for an open invoice has been declined three times
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
415naming the content type. For images, usegetImage. - A Skyscanner flights / hotels / car-hire search URL now returns
400pointing at the plugin that serves it, with the endpoint in theX-Recommended-Endpointheader. Other Skyscanner pages are unaffected.
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
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
v1.0.0
Public documentation launched at
developers.scrapeunblocker.com.Three endpoints documented:POST /getPageSourcePOST /serpApiPOST /getImage

