Anthropologie Scraper — products, prices, images
Pricing
Pay per event
Anthropologie Scraper — products, prices, images
Scrape anthropologie.com past DataDome: product names, prices, images and SKUs from search and category pages, about 70 products per page. No browser. Powered by xhr.dev.
Pricing
Pay per event
Rating
0.0
(0)
Developer
xhrdev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape Anthropologie products past DataDome — names, prices, images, SKUs, colours, categories and availability. Search by keyword, or point it at any category page and get roughly 70 products per page.
No browser is launched. The DataDome challenge is solved as plain HTTP by xhr.dev, so a page costs a few hundred milliseconds of compute instead of the several seconds and gigabyte of RAM a stealth browser needs.
Quickstart
Paste this into the input and press Run.
{"queries": ["dress"],"maxPagesPerQuery": 1}
Category pages work as well as search
Anthropologie renders the same structured product list on /search, on category paths like /shop-all-dresses, and on filtered category URLs. So you can filter in your browser, copy the URL into startUrls, and get exactly the assortment you were looking at — no need to reverse-engineer their query parameters.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | ["dress"] | Keywords to search. Each runs as its own search. |
startUrls | array | [] | Category and search URLs are read as listings; /shop/ URLs are read as single products. |
scrapeDetails | boolean | false | On, every product found is opened for its SKU, colour, category, availability, description and full image set — one fetch per product, billed at the product rate. Off, you get the listing fields for a fifth of the price. |
maxPagesPerQuery | integer | 1 | How deep to page each search or category, 1–50. Roughly 70 products per page. |
maxItems | integer | 200 | Stop once this many products have been scraped. |
proxyConfiguration | object | Apify RESIDENTIAL | Which proxy to route through. Leave it on residential — see Proxies. |
maxRetries | integer | 3 | Attempts per page before giving up on it, 1–5. Each attempt takes a fresh proxy session. |
timeoutSecs | integer | 120 | How long one page — challenge, solve and all — may take before the attempt fails. 10–300. |
maxConcurrency | integer | 4 | Pages worked on at once, 1–10. |
Nothing is required — the defaults run a real search out of the box.
Output — with scrapeDetails: false (the default)
One item per product in the listing, read from the page's structured data.
| Field | Type | Description |
|---|---|---|
name | string | Product name. |
url | string | Product page URL, including the colour variant. |
image | string | Product image URL. |
price | number | Current price. |
currency | string | ISO currency code, e.g. USD. |
position | number | Rank within the listing — 1 is first on the page. Useful for merchandising analysis. |
Output — with scrapeDetails: true
One item per product, read from the product page.
| Field | Type | Description |
|---|---|---|
name | string | Product name. |
url | string | Product page URL. |
sku / mpn | string | Product identifiers. |
brand | string | House brand, e.g. Maeve, Pilcro. |
category | string | Category, e.g. Dresses. |
description | string | Full product description. |
color | string | Colourway name, e.g. Blue Surf. |
price | number | Current price. |
currency | string | ISO currency code. |
availability | string | InStock, OutOfStock, etc. |
images | string[] | Full image set for the colourway. |
Example record
Taken verbatim from a live run. Long text and image lists are trimmed here for readability; the real record carries them in full.
{"name": "Yukiko Noritake x Anthropologie Asymmetric Floral Midi Dress","url": "https://www.anthropologie.com/shop/yukiko-noritake-x-anthropologie-asymmetrical-floral-midi-dress?color=029","image": "https://images.urbndata.com/is/image/Anthropologie/4130089540123_029_b?$an-category$&qlt=80&fit=constrain","price": 248,"currency": "USD","position": 1}
A record from the same search with scrapeDetails: true
{"name": "Maeve Jamie Satin Halter Maxi Dress","url": "https://www.anthropologie.com/shop/maeve-jamie-satin-halter-maxi-dress2?color=040","sku": "4130647160331","mpn": "4130647160331","brand": "Maeve","category": "Dresses","description": "Designed with a fluid, body-skimming silhouette, the Jamie Dress features a halter neckline and open back. The low cowl back and slim strap detail create a graceful fit that moves with ease.","color": "Blue Surf","price": 168,"currency": "USD","availability": "InStock","images": ["https://images.urbndata.com/is/image/Anthropologie/4130647160331_040_b?$a15-pdp-detail-shot$&fit=constrain&qlt=80&wid=640","https://images.urbndata.com/is/image/Anthropologie/4130647160331_040_b2?$a15-pdp-detail-shot$&fit=constrain&qlt=80&wid=640","https://images.urbndata.com/is/image/Anthropologie/4130647160331_040_b3?$a15-pdp-detail-shot$&fit=constrain&qlt=80&wid=640","… 1 more"]}
Pricing
Two rates, and which one you pay depends on scrapeDetails:
| Event | Price | When |
|---|---|---|
listing-item | $3.00 / 1,000 ($0.003 each) | A row from a listing or category page — scrapeDetails: false. |
product-detail | $15.00 / 1,000 ($0.015 each) | A product page was fetched and parsed — scrapeDetails: true. |
Charged on delivered rows only; failed pages cost nothing. scrapeDetails is off by default here, because one category fetch yields ~70 rows with name, price, image and link — enough for price tracking and assortment monitoring without opening anything.
Turn it on when you need SKUs, colourways or stock status.
Proxies: read this before changing anything
Set this to Apify RESIDENTIAL and leave it there. It is not a style preference, and it is the single most common reason a run comes back empty.
DataDome decides which challenge to serve based on the exit IP. We measured this from Apify against twelve DataDome-protected sites, same code, minutes apart:
| Exit IP | Challenge served | Result |
|---|---|---|
| Datacenter (Apify default, or no proxy) | The hard captcha | 3 of 12 sites passed |
| Residential | Interstitial, or no challenge at all | 12 of 12 sites passed, 2–5s each |
A datacenter address does not make Anthropologie slower. It changes the problem into a different, much harder one. Every attempt already pins a fresh residential session automatically, so a burnt exit node gets a genuinely new IP rather than a retry down the same dead pipe.
If a run fails wholesale, check the proxy group before anything else.
Run it from the API or CLI
Replace <TOKEN> with your Apify API token.
Run and get the results back in one call:
curl -X POST "https://api.apify.com/v2/acts/xhrdev~anthropologie-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"queries":["dress"],"maxPagesPerQuery":1}'
Start a run without waiting:
curl -X POST "https://api.apify.com/v2/acts/xhrdev~anthropologie-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"queries":["dress"],"maxPagesPerQuery":1}'
With the Apify CLI:
$apify call xhrdev/anthropologie-scraper --input '{"queries":["dress"],"maxPagesPerQuery":1}'
Fetching results
Every run writes to a dataset. Change format for JSON, CSV, or Excel:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Page through a large datasetcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> comes back as defaultDatasetId on the run object.
Limits and failure behaviour
100 pages per run, hard. Not configurable. It is a guard against a typo in maxPagesPerQuery turning into a bill and a hammering of Anthropologie. For more than that, split the work across runs.
Failures never enter the dataset. A page that could not be fetched is not written as a half-empty row — that would corrupt the clean table you are paying for. Instead every run writes a RUN_SUMMARY record to the key-value store:
{"site": "anthropologie","itemsScraped": 72,"pagesFetched": 1,"pagesFailed": 0,"failures": [],"solverHost": "https://trial.xhr.dev"}
Read it at https://api.apify.com/v2/key-value-stores/<STORE_ID>/records/RUN_SUMMARY. failures holds up to 50 entries, each with the URL and why it failed.
A run that scrapes nothing and failed at least one page exits as failed, rather than reporting success over an empty dataset. If everything failed, the message points at the proxy group first, because that is nearly always the cause.
Pagination is never speculative. Page 2 is queued only after page 1 comes back and the site confirms how many pages exist, so you are not billed for fetching past the end of a short result set.
Spend cap. Set maxTotalChargeUsd on the run. The Actor stops fetching once it is reached, mid-run, rather than overshooting.
Questions
A run came back empty. Why?
Check the proxy group first — a datacenter exit is the cause the overwhelming majority of the time. Then read RUN_SUMMARY in the key-value store for the per-page reasons.
Is this affiliated with Anthropologie? No. This is an independent tool with no affiliation with, endorsement by, or connection to Anthropologie or any bot-protection vendor. Names and trademarks belong to their owners.
How does it get past the challenge without a browser? It is solved as HTTP, by xhr.dev. No Chrome is launched, which is why a page costs a few hundred milliseconds of compute instead of the several seconds and ~1 GB of RAM a stealth browser needs.
Can I use the solver directly, on a site that isn't Anthropologie? Yes — that is DataDome Unblocker, which takes any URL and hands back the HTML and the clearance cookies. There is also Akamai Unblocker for Akamai Bot Manager.
Can I run this on my own infrastructure? Yes. The solver these Actors call is a self-hosted Docker container, sold on a flat fee with no per-request pricing. See xhr.dev.
Related Actors
- DataDome Unblocker — any URL behind DataDome, returns HTML plus clearance cookies.
- Akamai Unblocker — the same, for Akamai Bot Manager.
- leboncoin Scraper — French classified ads.
- Etsy Scraper — handmade marketplace listings.
- Grainger Scraper — industrial supply lookups.
Built by xhr.dev. Independent tool, not affiliated with Anthropologie or any bot-protection vendor. Scrape only what you are permitted to access, and check the site's terms before you run anything at scale.