# ABC Fine Wine & Spirits Scraper (`crawlerbros/abc-fine-wine-spirits-scraper`) Actor

Scrape ABC Fine Wine & Spirits (abcfws.com). Search by keyword or browse wine/spirits/beer/RTD, filter by varietal, country, price. Get price, brand, ABV, region, size, rating, images.

- **URL**: https://apify.com/crawlerbros/abc-fine-wine-spirits-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ABC Fine Wine & Spirits Scraper

Scrape [ABC Fine Wine & Spirits](https://www.abcfws.com) — Florida's oldest and largest family-owned wine, spirits, and beer retailer, with 150+ stores across Florida, Alabama, Georgia, South Carolina, and North Carolina. Search by keyword, browse the full wine/spirits/beer/ready-to-drink taxonomy, or pull specific products by URL. Get price, brand, varietal, country/region of origin, size, ABV, rating, images, and more. No login, no cookies, no paid proxy required.

### What this actor does

- **Three modes:** `search` (keyword), `byCategory` (browse the real wine/spirits/beer/ready-to-drink/for-the-bar taxonomy, or a wine varietal), `byProductUrls` (fetch specific product pages)
- **Filters:** varietal, country of origin, region, brand, price range, in-stock only, "Sourced & Certified" only, organic only, additive-free only, new arrivals only, on sale only, minimum rating, sort order
- **Optional deep enrichment:** turn on `fetchFullDetails` to also pull ABV, sweetness, closure type, food pairings, and a description from each product's detail page
- **Empty fields are omitted** — every record only contains fields ABC actually returned

### Output per product

- `sku`, `title`, `brand`
- `price`, `msrp`, `currency`, `onSale`, `discountPercent`
- `category`, `categoryPath`, `type` (e.g. Red, White, Bourbon)
- `varietal` (e.g. Cabernet Sauvignon, Chardonnay)
- `size` (bottle/can size), `packSize`
- `country`, `region`, `subRegion`
- `sourcedAndCertified`, `organic`, `additiveFree`, `isNew`, `flavor`
- `rating`, `reviewCount`
- `popularityScore` (relative popularity rank on ABC's own site — higher is more popular)
- `priceRangeMin` / `priceRangeMax` (when the product's price varies by store location)
- `inStock`, `onlineAvailable`, `storeAvailabilityCount`
- `imageUrl`, `thumbnailImageUrl`
- `productUrl`, `sourceUrl`
- When `fetchFullDetails` is on (or always for `byProductUrls`): `description`, `sweetness`, `abv`, `proof`, `closureType`, `state`, `appellation`, `foodPairings[]`
- `recordType: "product"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `byProductUrls` |
| `searchQuery` | string | `cabernet sauvignon` | Free-text query (mode=search) |
| `category` | string | – | A real ABC category/sub-category or wine varietal path (mode=byCategory; optional refine on mode=search) |
| `varietal` | string | – | Restrict to a specific wine varietal |
| `country` | string | – | Restrict to a specific country of origin |
| `region` | string | – | Only products whose region/sub-region contains this text |
| `brand` | string | – | Only products whose brand contains this text |
| `productUrls` | array | – | Product URLs or bare SKUs (mode=byProductUrls) |
| `priceMin` / `priceMax` | int | – | Price range (USD) |
| `inStockOnly` | bool | `false` | Only in-stock products |
| `sourcedCertifiedOnly` | bool | `false` | Only ABC "Sourced & Certified" products |
| `organicOnly` | bool | `false` | Only organic-labeled products |
| `additiveFreeOnly` | bool | `false` | Only products in ABC's "Additive Free" program |
| `newOnly` | bool | `false` | Only products flagged as new arrivals |
| `onSaleOnly` | bool | `false` | Only products currently discounted below MSRP |
| `ratingMin` | int | – | Minimum customer star rating (1–5) |
| `sortBy` | string | `relevance` | `relevance` / `featured` / `newest` / `mostPopular` / `highestRated` / `priceAsc` / `priceDesc` / `nameAsc` / `nameDesc` |
| `fetchFullDetails` | bool | `false` | Fetch each product's detail page for ABV, sweetness, closure type, food pairings, description |
| `maxItems` | int | `20` | Hard cap on emitted records (1–1000) |

#### Example: search with a price cap

```json
{
  "mode": "search",
  "searchQuery": "chardonnay",
  "priceMax": 30,
  "inStockOnly": true,
  "maxItems": 50
}
````

#### Example: browse a category with full details

```json
{
  "mode": "byCategory",
  "category": "Spirits>Shop By Type>Bourbon",
  "fetchFullDetails": true,
  "maxItems": 30
}
```

#### Example: fetch specific products

```json
{
  "mode": "byProductUrls",
  "productUrls": [
    "https://www.abcfws.com/bota-box-nighthawk-bourbon-barrel-cabernet/314709",
    "314709"
  ]
}
```

### Use cases

- **Price monitoring** — track pricing and discounts across wine, spirits, and beer categories over time
- **Competitor research** — compare a category's product range and pricing against other retailers
- **Assortment tracking** — monitor new arrivals and "Sourced & Certified"/organic/additive-free product listings
- **Deal discovery** — surface currently on-sale products within a category or search
- **Regional retail research** — study product availability and pricing across ABC's Southeastern US store footprint

### Data source

ABC Fine Wine & Spirits' storefront uses a public Searchspring search/facets API (the same endpoint the site's own product-grid widget calls) that returns full structured product data — no auth, no cookies, no proxy needed. Product detail pages are server-rendered and used only for optional enrichment fields not present in the search index (ABV, sweetness, closure type, food pairings).

**Why ABC Fine Wine & Spirits instead of TotalWine:** this actor was originally built to target totalwine.com. TotalWine is protected by PerimeterX bot management at the IP-reputation layer — confirmed blocked across every zero-cost tier with live evidence from Apify's cloud infrastructure: plain `httpx` (with and without Apify's free AUTO proxy set to `country=US`), four different `curl_cffi` browser TLS impersonations (chrome131, chrome124, safari17\_0, edge101), and a full headless-Chromium Playwright run — all returned an identical "press & hold" CAPTCHA challenge page regardless of TLS fingerprint or JS execution, indicating the block operates on IP reputation rather than fingerprinting. Since residential proxies are not used in this project, TotalWine cannot be reliably scraped at zero cost. ABC Fine Wine & Spirits is a comparable large US wine/spirits/beer retailer where both products and pricing are fully visible without login, and access is fully reliable at zero cost.

### Limitations

- ABC Fine Wine & Spirits primarily serves Florida, Alabama, Georgia, South Carolina, and North Carolina; store-level availability (`storeAvailabilityCount`) reflects that footprint.
- ABV, sweetness, closure type, and food pairings are only available with `fetchFullDetails: true` (or always for `byProductUrls`) since they live on the product detail page, not the search index.
- `varietal`, `country`, `region`, `subRegion`, `organic`, `additiveFree`, `flavor`, and `packSize` come from the same search index attributes that back the `varietal`/`country`/`region`/`brand`/`organicOnly`/`additiveFreeOnly` input filters, but ABC's search index only returns those attributes on a subset of listings; when absent, turn on `fetchFullDetails` to fill in whichever of them the product's detail page carries (not every product has every attribute, e.g. spirits rarely have a wine varietal).
- `priceRangeMin`/`priceRangeMax` only appear for products whose price varies by store location; most products have a single flat `price` instead.
- Age-restricted alcohol products — this actor scrapes only publicly listed catalog/pricing data; it does not process orders and involves no age verification.

### FAQ

**Do I need a proxy or cookies?**
No. This actor works with no configuration beyond the input fields above, and runs on the Apify free plan.

**Can I search across wine, spirits, and beer at once?**
Yes — leave `category` empty and just use `searchQuery`, or pick a top-level category like `Wine`, `Spirits`, or `Beer` to browse everything within it.

**Why don't all products have a `varietal` or `region`?**
Not every product category (e.g. spirits, beer, bar accessories) carries a varietal or wine-region attribute — those fields are only included when ABC's catalog actually populates them for that product.

**Can I get only new arrivals, on-sale items, or additive-free wines?**
Yes — set `newOnly`, `onSaleOnly`, or `additiveFreeOnly` to `true`, individually or combined with any other filter.

**Can I filter by customer rating?**
Yes — set `ratingMin` to a value from 1 to 5 to only include products rated at least that many stars.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text product search, e.g. `cabernet`, `bourbon`, `ipa`, `tito's vodka`.

## `category` (type: `string`):

A category/sub-category from ABC's real navigation taxonomy. Required for mode=byCategory; optional as an additional filter on mode=search.

## `varietal` (type: `string`):

Restrict to a specific wine varietal/style. Optional, combinable with searchQuery or category.

## `country` (type: `string`):

Restrict to products from a specific country. Optional.

## `region` (type: `string`):

Only include products whose region/sub-region contains this text (case-insensitive), e.g. `Napa`, `Bordeaux`, `Rioja`, `Tuscany`.

## `brand` (type: `string`):

Only include products whose brand contains this text (case-insensitive), e.g. `Barefoot`, `Jack Daniel's`, `Tito's`. ABC carries hundreds of brands so this is free-text rather than a fixed dropdown.

## `productUrls` (type: `array`):

abcfws.com product page URLs (e.g. `https://www.abcfws.com/bota-box-nighthawk-bourbon-barrel-cabernet/314709`) or bare numeric SKUs (e.g. `314709`).

## `priceMin` (type: `integer`):

Drop products priced below this amount.

## `priceMax` (type: `integer`):

Drop products priced above this amount.

## `inStockOnly` (type: `boolean`):

Only include products currently in stock (online or in at least one store).

## `sourcedCertifiedOnly` (type: `boolean`):

Only include products in ABC's own "Sourced & Certified" ethical/sustainable sourcing program.

## `organicOnly` (type: `boolean`):

Only include products labeled organic.

## `additiveFreeOnly` (type: `boolean`):

Only include products in ABC's "Additive Free" program (wines made without common winemaking additives).

## `newOnly` (type: `boolean`):

Only include products flagged as new arrivals in ABC's catalog.

## `onSaleOnly` (type: `boolean`):

Only include products currently discounted below their list price (MSRP).

## `ratingMin` (type: `integer`):

Only include products with a customer rating of at least this many stars (1-5). Leave unset for no minimum.

## `sortBy` (type: `string`):

Result ordering (mode=search / mode=byCategory).

## `fetchFullDetails` (type: `boolean`):

For search/category results, also fetch each product's detail page for ABV, sweetness, closure type, food pairings, and a description. Slower (one extra request per product) but more complete. Always on for mode=byProductUrls.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "cabernet sauvignon",
  "category": "",
  "varietal": "",
  "country": "",
  "productUrls": [],
  "inStockOnly": false,
  "sourcedCertifiedOnly": false,
  "organicOnly": false,
  "additiveFreeOnly": false,
  "newOnly": false,
  "onSaleOnly": false,
  "sortBy": "relevance",
  "fetchFullDetails": false,
  "maxItems": 20
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped products.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "searchQuery": "cabernet sauvignon",
    "category": "",
    "varietal": "",
    "country": "",
    "productUrls": [],
    "inStockOnly": false,
    "sourcedCertifiedOnly": false,
    "organicOnly": false,
    "additiveFreeOnly": false,
    "newOnly": false,
    "onSaleOnly": false,
    "sortBy": "relevance",
    "fetchFullDetails": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/abc-fine-wine-spirits-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "searchQuery": "cabernet sauvignon",
    "category": "",
    "varietal": "",
    "country": "",
    "productUrls": [],
    "inStockOnly": False,
    "sourcedCertifiedOnly": False,
    "organicOnly": False,
    "additiveFreeOnly": False,
    "newOnly": False,
    "onSaleOnly": False,
    "sortBy": "relevance",
    "fetchFullDetails": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/abc-fine-wine-spirits-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "cabernet sauvignon",
  "category": "",
  "varietal": "",
  "country": "",
  "productUrls": [],
  "inStockOnly": false,
  "sourcedCertifiedOnly": false,
  "organicOnly": false,
  "additiveFreeOnly": false,
  "newOnly": false,
  "onSaleOnly": false,
  "sortBy": "relevance",
  "fetchFullDetails": false,
  "maxItems": 20
}' |
apify call crawlerbros/abc-fine-wine-spirits-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/abc-fine-wine-spirits-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ABC Fine Wine & Spirits Scraper",
        "description": "Scrape ABC Fine Wine & Spirits (abcfws.com). Search by keyword or browse wine/spirits/beer/RTD, filter by varietal, country, price. Get price, brand, ABV, region, size, rating, images.",
        "version": "1.0",
        "x-build-id": "L8hpeSwKXZz3q75JI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~abc-fine-wine-spirits-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-abc-fine-wine-spirits-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~abc-fine-wine-spirits-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-abc-fine-wine-spirits-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~abc-fine-wine-spirits-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-abc-fine-wine-spirits-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "byCategory",
                            "byProductUrls"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text product search, e.g. `cabernet`, `bourbon`, `ipa`, `tito's vodka`."
                    },
                    "category": {
                        "title": "Category (mode=byCategory, or optional refine for mode=search)",
                        "enum": [
                            "",
                            "Wine",
                            "Wine>Shop By Type>Shop All Wine",
                            "Wine>Shop By Type>Red Wine",
                            "Wine>Shop By Type>White Wine",
                            "Wine>Shop By Type>Sparkling Wine",
                            "Wine>Shop By Type>Fortified Wine",
                            "Wine>Shop By Type>Rose Wine",
                            "Wine>Shop By Type>Sake",
                            "Wine>Shop By Type>Non-Alcoholic Wine",
                            "Wine>Shop By Varietal>Cabernet Sauvignon",
                            "Wine>Shop By Varietal>Red Blends",
                            "Wine>Shop By Varietal>Chardonnay",
                            "Wine>Shop By Varietal>Pinot Noir",
                            "Wine>Shop By Varietal>Sauvignon Blanc",
                            "Wine>Shop By Varietal>Bordeaux",
                            "Wine>Shop By Varietal>Pinot Grigio",
                            "Wine>Shop By Varietal>Merlot",
                            "Wine>Shop By Varietal>White Blends",
                            "Wine>Shop By Varietal>Malbec",
                            "Wine>Shop By Varietal>Moscato",
                            "Wine>Shop By Varietal>Zinfandel",
                            "Wine>Shop By Varietal>Riesling",
                            "Wine>Shop By Varietal>Champagne",
                            "Spirits",
                            "Spirits>Shop By Type>Shop All Spirits",
                            "Spirits>Shop By Type>Whiskey",
                            "Spirits>Shop By Type>Tequila",
                            "Spirits>Shop By Type>Bourbon",
                            "Spirits>Shop By Type>Cordials & Liqueurs",
                            "Spirits>Shop By Type>Vodka",
                            "Spirits>Shop By Type>Rum",
                            "Spirits>Shop By Type>Scotch",
                            "Spirits>Shop By Type>Brandy & Cognac",
                            "Spirits>Shop By Type>Gin",
                            "Spirits>Shop By Type>Non-Alcoholic Spirits",
                            "Spirits>Shop By Type>Mezcal",
                            "Beer",
                            "Beer>Shop By Type>Shop All Beer",
                            "Beer>Shop By Type>Craft Beer",
                            "Beer>Shop By Type>Imported Beer",
                            "Beer>Shop By Type>Malt Beverages",
                            "Beer>Shop By Type>Domestic Beer",
                            "Beer>Shop By Type>Hard Ciders",
                            "Beer>Shop By Type>Hard Seltzers",
                            "Beer>Shop By Type>Non-Alcoholic Beer",
                            "Ready To Drink",
                            "Ready To Drink>Shop By Type>Shop All Ready to Drink",
                            "Ready To Drink>Shop By Type>Ready to Drink Vodka Cocktails",
                            "Ready To Drink>Shop By Type>Ready to Drink Tequila Cocktails",
                            "Ready To Drink>Shop By Type>Ready to Drink Rum Cocktails",
                            "Ready To Drink>Shop By Type>Ready to Drink Wine Cocktails",
                            "Ready To Drink>Shop By Type>Ready to Drink Whiskey Cocktails",
                            "Ready To Drink>Shop By Type>Non-Alcoholic Cocktails",
                            "Ready To Drink>Shop By Type>Ready to Drink Gin Cocktails",
                            "For The Bar",
                            "For The Bar>Accessories & More",
                            "For The Bar>Mixers & Other Beverages",
                            "For The Bar>Food & Snacks",
                            "For The Bar>Cups & Glassware",
                            "For The Bar>Bitters"
                        ],
                        "type": "string",
                        "description": "A category/sub-category from ABC's real navigation taxonomy. Required for mode=byCategory; optional as an additional filter on mode=search.",
                        "default": ""
                    },
                    "varietal": {
                        "title": "Varietal filter",
                        "enum": [
                            "",
                            "Cabernet Sauvignon",
                            "Red Blend",
                            "Chardonnay",
                            "Pinot Noir",
                            "Sauvignon Blanc",
                            "Bordeaux Blend",
                            "Pinot Grigio/Pinot Gris",
                            "Merlot",
                            "Rose Blend",
                            "White Blend",
                            "Sangiovese",
                            "Tempranillo",
                            "Malbec",
                            "Sake",
                            "Moscato",
                            "Zinfandel",
                            "Riesling",
                            "Porto",
                            "Sparkling White",
                            "Champagne",
                            "Glera",
                            "Champagne White",
                            "Other Whites",
                            "Sparkling Rose",
                            "Shiraz/Syrah",
                            "Vermouth",
                            "Grenache",
                            "Champagne Blend",
                            "Nebbiolo",
                            "Sangria",
                            "Chenin Blanc",
                            "Sparkling Wine",
                            "Sherry",
                            "Sparkling Cava",
                            "Port",
                            "White Zinfandel",
                            "Albarino",
                            "Cabernet Franc",
                            "Chianti",
                            "Dessert"
                        ],
                        "type": "string",
                        "description": "Restrict to a specific wine varietal/style. Optional, combinable with searchQuery or category.",
                        "default": ""
                    },
                    "country": {
                        "title": "Country of origin filter",
                        "enum": [
                            "",
                            "Argentina",
                            "Australia",
                            "Austria",
                            "Brazil",
                            "Bulgaria",
                            "Canada",
                            "Chile",
                            "Denmark",
                            "France",
                            "Georgia",
                            "Germany",
                            "Greece",
                            "Holland",
                            "Hungary",
                            "Israel",
                            "Italy",
                            "Japan",
                            "Mexico",
                            "New Zealand",
                            "Portugal",
                            "Romania",
                            "South Africa",
                            "South Korea",
                            "Spain",
                            "United States",
                            "Uruguay"
                        ],
                        "type": "string",
                        "description": "Restrict to products from a specific country. Optional.",
                        "default": ""
                    },
                    "region": {
                        "title": "Region filter",
                        "type": "string",
                        "description": "Only include products whose region/sub-region contains this text (case-insensitive), e.g. `Napa`, `Bordeaux`, `Rioja`, `Tuscany`."
                    },
                    "brand": {
                        "title": "Brand filter",
                        "type": "string",
                        "description": "Only include products whose brand contains this text (case-insensitive), e.g. `Barefoot`, `Jack Daniel's`, `Tito's`. ABC carries hundreds of brands so this is free-text rather than a fixed dropdown."
                    },
                    "productUrls": {
                        "title": "Product URLs (mode=byProductUrls)",
                        "type": "array",
                        "description": "abcfws.com product page URLs (e.g. `https://www.abcfws.com/bota-box-nighthawk-bourbon-barrel-cabernet/314709`) or bare numeric SKUs (e.g. `314709`).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceMin": {
                        "title": "Min price (USD)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Drop products priced below this amount."
                    },
                    "priceMax": {
                        "title": "Max price (USD)",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Drop products priced above this amount."
                    },
                    "inStockOnly": {
                        "title": "In-stock only",
                        "type": "boolean",
                        "description": "Only include products currently in stock (online or in at least one store).",
                        "default": false
                    },
                    "sourcedCertifiedOnly": {
                        "title": "\"Sourced & Certified\" only",
                        "type": "boolean",
                        "description": "Only include products in ABC's own \"Sourced & Certified\" ethical/sustainable sourcing program.",
                        "default": false
                    },
                    "organicOnly": {
                        "title": "Organic only",
                        "type": "boolean",
                        "description": "Only include products labeled organic.",
                        "default": false
                    },
                    "additiveFreeOnly": {
                        "title": "Additive-free only",
                        "type": "boolean",
                        "description": "Only include products in ABC's \"Additive Free\" program (wines made without common winemaking additives).",
                        "default": false
                    },
                    "newOnly": {
                        "title": "New arrivals only",
                        "type": "boolean",
                        "description": "Only include products flagged as new arrivals in ABC's catalog.",
                        "default": false
                    },
                    "onSaleOnly": {
                        "title": "On sale only",
                        "type": "boolean",
                        "description": "Only include products currently discounted below their list price (MSRP).",
                        "default": false
                    },
                    "ratingMin": {
                        "title": "Minimum rating",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Only include products with a customer rating of at least this many stars (1-5). Leave unset for no minimum."
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "featured",
                            "newest",
                            "mostPopular",
                            "highestRated",
                            "priceAsc",
                            "priceDesc",
                            "nameAsc",
                            "nameDesc"
                        ],
                        "type": "string",
                        "description": "Result ordering (mode=search / mode=byCategory).",
                        "default": "relevance"
                    },
                    "fetchFullDetails": {
                        "title": "Fetch full product details",
                        "type": "boolean",
                        "description": "For search/category results, also fetch each product's detail page for ABV, sweetness, closure type, food pairings, and a description. Slower (one extra request per product) but more complete. Always on for mode=byProductUrls.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
