Caskers Scraper
Pricing
from $3.00 / 1,000 results
Caskers Scraper
Scrape Caskers (caskers.com) - US craft wine & spirits online retailer. Search by keyword, browse spirit categories, fetch products by ID or URL, and collect product reviews. Includes prices, bottle size, ABV/proof, tasting notes, ratings, images, and availability.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape Caskers (caskers.com) — one of the largest US online retailers of craft wine & spirits — and get product-level data for whiskey, bourbon, scotch, tequila, rum, vodka, gin, cognac, mezcal, champagne, non-alcoholic drinks and more. Search by keyword, browse spirit categories, fetch products by ID or URL, and pull per-product customer reviews. Includes prices, bottle size, proof/ABV, tasting notes, ratings, review counts, images and stock status. HTTP-only via the public website — no login, no API key, no proxy required.
Data Source
Replacement actor: this actor replaces the former Total Wine & More (totalwine.com) slot. Total Wine was hard-blocked from Apify cloud egress (403 on every path — product API, search, homepage, direct and US-proxy requests). The replacement platform is Caskers (caskers.com), a US craft wine & spirits online retailer in the same category (wine/liquor retail). All pages are served as server-side-rendered Magento 2 HTML over plain HTTPS and are reachable from Apify cloud datacenter egress without a proxy.
Data comes from three public HTML surfaces:
- Category pages —
https://www.caskers.com/<category>/(e.g./spirits/,/spirits/whiskey/bourbon/,/non-alcoholic-drinks/). Each page renders 20–80 product cards plus the total result count. Pagination via?p=, sort via?product_list_order=&product_list_dir=, price bands via?price=, brand via?brand_dropdown=. - Search results —
https://www.caskers.com/catalogsearch/result/?q=<keyword>— the same product-card grid, with the same pagination and sort controls. - Product detail pages —
https://www.caskers.com/<product-slug>/— rich SSR markup (bottle size, proof/ABV, description, tasting notes, rating summary) plus aschema.org/ProductJSON-LD block (brand, SKU, GTIN, aggregate rating, offer price/availability, US states the item cannot ship to, and sample reviews). - Reviews endpoint —
https://www.caskers.com/review/product/listAjax/id/<productId>/— per-product customer reviews (title, body, Quality/Value/Price star ratings, author, date).
Caskers has no wine/beer categories (those paths return 404); the catalog is spirits-focused. The REST API (/rest/) is Cloudflare-protected and not used.
What this actor does
- Five modes:
search,byCategory,byProductIds,byUrls,productReviews - Complete catalog coverage: ~11,000 product URLs are exposed via the public sitemap; category totals run to 10,000+ spirits
- Rich product records: price, bottle size, proof/ABV, tasting notes, description, ratings, review counts, gallery images, stock status
- Filters: sort order, price band, brand
- Typed error records: failed lookups surface as
recordType: "error"entries with the reason - Empty fields are omitted
Output per product
productId,sku— Caskers entity ID (use forbyProductIds/productReviews) + SKUname,brand,categoryprice,currency— final USD pricesize— bottle size (e.g.750mL)proof,abv— e.g.80,40.0availability—In stock/Out of stockrating,reviewCount— customer rating (0–5) and countdescription,tastingNotegtinrestrictedStates[]— US states where this item cannot shipimageUrl,imageUrls[]— CDN product images (cdn.caskers.com)badges[]— e.g.Limited-Edition,PREORDER-NOWsourceUrl,recordType: "product",scrapedAt
Output per review
productId,productUrlreviewTitle,reviewContent,reviewAuthor,reviewDateratings— per-dimension star scores (Quality,Value,Price)overallRating— average of the dimensionssourceUrl,recordType: "review",scrapedAt
Output per error
errorType—invalidInput/notFound/blocked/rateLimited/httpError/parseErrorsubject— the input that failedmessage,sourceUrlrecordType: "error",scrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | search | search / byCategory / byProductIds / byUrls / productReviews |
searchQuery | string | whiskey | Free-text keyword (mode=search) |
category | string | spirits | Caskers category path (mode=byCategory) |
sortBy | string | relevance | relevance / nameAsc / nameDesc / priceAsc / priceDesc |
priceRange | string | any | any / 0-50 / 50-100 / 100-200 / 200-500 / 500-plus (mode=byCategory) |
brandId | int | – | Caskers brand_dropdown ID, e.g. 3369 = Hennessy (mode=byCategory) |
productIds | array | – | Numeric product IDs (mode=byProductIds / productReviews) |
productUrls | array | – | Full product URLs (mode=byUrls) |
maxReviewsPerProduct | int | 10 | Cap on review records per product (mode=productReviews) |
maxItems | int | 50 | Hard cap on emitted records (1–1000) |
limit | int | 20 | Products per page (20 / 40 / 80) |
proxyConfiguration | object | off | Optional Apify AUTO proxy; not needed for normal use |
Example: search whiskey, cheapest first
{"mode": "search","searchQuery": "whiskey","sortBy": "priceAsc","maxItems": 20}
Example: browse tequila in a price band
{"mode": "byCategory","category": "spirits/tequila","priceRange": "50-100","sortBy": "nameAsc","maxItems": 40}
Example: fetch specific products by ID
{"mode": "byProductIds","productIds": ["7582", "1023"]}
Product IDs are the numeric
productIdvalues that appear on scraped product records (ordata-product-idon category cards) — not SKUs, which live in a different namespace.
Example: collect reviews for a product
{"mode": "productReviews","productIds": ["1023"],"maxReviewsPerProduct": 10}
Use cases
- Price & product intelligence — track whiskey, bourbon and tequila prices across Caskers' 10,000+ item catalog
- Category benchmarking — compare product counts, price bands and ratings per spirit type
- Market research — analyze tasting notes, ABV distribution and brand presence in the US craft spirits market
- Retail dropship / aggregation — enrich a product feed with prices, sizes, images and availability
- Review mining — pull Quality/Value/Price customer ratings per product for sentiment analysis
FAQ
Is this affiliated with Caskers? No. This is an independent third-party actor that reads publicly served HTML pages from caskers.com.
Do I need a proxy or account? No. All surfaces are public server-rendered HTML. The optional Apify AUTO proxy exists as a fallback only if Caskers starts rate-limiting datacenter IPs.
Why is Total Wine & More mentioned in the README? This actor replaced the Total Wine & More scraper slot: totalwine.com hard-blocks all Apify cloud egress (403 on every endpoint), so the slot was repurposed to Caskers, a US wine & spirits retailer in the same category.
How fresh is the data? Every run fetches pages live — prices, availability and ratings are as of the request moment. Caskers updates its catalog continuously.
Why are some products missing fields?
Fields are only emitted when the page actually contains them (e.g. a product with zero reviews has no rating/reviewCount). Empty fields are always omitted.
What does restrictedStates mean?
Caskers publishes the US states to which an item cannot ship (from the product's schema.org offer data). Products that ship everywhere simply omit the field.
Are there rate limits? No documented API limits — the actor keeps polite delays between requests and retries with backoff on 429/5xx, auto-escalating on 403.
Which categories are available? Whiskey (bourbon, scotch, Irish, rye, Japanese, moonshine, American single malts), vodka, tequila, rum, gin, brandy, cognac, mezcal, absinthe, liqueur, vermouth, non-alcoholic drinks, champagne & sparkling, plus curated lists (best sellers, limited editions, new arrivals, rare finds, gift sets, price-sliced "under $50/100/200" pages).
How reliable is sortBy: priceAsc / priceDesc?
Caskers sometimes prepends a small "featured products" widget to the first category page, which arrives unsorted regardless of the sort parameter. To guarantee the documented sort contract, the actor applies a client-side final sort by price on every listing run — priceAsc/priceDesc output is always price-ordered (records without a visible price sort last).