# VTEX Store API — products, SKUs, EAN barcodes, seller prices and stock from any public VTEX store (Latin America's leading e-commerce platform)

> Search or browse any VTEX store's catalog: keyword, category, brand, price range and sort, with every SKU's EAN, each seller's sale/list price, stock flag and the exact total result count.
> ReefAPI engine `vtex` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/vtex/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/vtex/v1/search — 3 credits
Search or browse any VTEX store's catalog: keyword, category, brand, price range and sort, with every SKU's EAN, each seller's sale/list price, stock flag and the exact total result count.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `query` (string, optional) — Full-text search term in the store's language (e.g. leche, dipirona, zapatillas). Omit to browse a category or brand.
- `category_id` (string, optional) — Category filter: the category path of ids exactly as the categories action and search rows return it in `category_path_ids` (e.g. /1/105/10501/), or a single top-level department id (e.g. 1). Catalog search only.
- `brand_id` (integer, optional) — Brand filter by VTEX brand id (from search rows' `brand_id` or the brands action). An unknown id returns an honest empty result. Catalog search only.
- `min_price` (number, optional) — Lowest selling price, in the store's currency.
- `max_price` (number, optional) — Highest selling price, in the store's currency.
- `sort` (enum, optional, default "relevance") — Result order. Intelligent Search supports relevance, price_asc and price_desc only; it ranks a multi-SKU product by the store's own price key, which can differ from the row's `price`. [one of: relevance, price_asc, price_desc, top_sellers, newest, best_discount, name_asc, name_desc]
- `page` (integer, optional, default 1) — Page number (1, 2, 3…). VTEX serves only the first 2,550 rows of any one search; narrow the query with filters to go deeper.
- `page_size` (integer, optional, default 20) — Products per page (1–50).
- `sales_channel` (integer, optional) — VTEX sales channel (trade policy) id. Omit for the store's default channel (1). A channel can change the assortment; a channel the store does not expose is rejected.
- `search_api` (enum, optional, default "catalog") — Which VTEX search to use. 'catalog' (default) supports every filter and sort and returns the exact total. 'intelligent_search' is the store's newer relevance search and also returns the cash/PIX `spot_price`; it supports query, price range and price sort only. [one of: catalog, intelligent_search]

**Returns:** products[]{product_id, name, brand, brand_id, link_text, url, category_path, category_path_ids, categories[], release_date, description, specifications{}, clusters[], price, list_price, spot_price, currency, in_stock, discount_pct, items[]{sku_id, name, ean, ref_id, measurement_unit, unit_multiplier, variations{}, images[], sellers[]{seller_id, seller_name, is_default, price, list_price, price_without_discount, spot_price, available_quantity, stock_quantity_capped, in_stock, installments_best{}, price_valid_until, promotions[]}}} + meta.total / page / has_more / last_page

**Example request body:**
```json
{
  "store": "www.chedraui.com.mx",
  "query": "leche",
  "page_size": 10
}
```

### POST https://api.reefapi.com/vtex/v1/product — 2 credits
Full detail of one VTEX product by product id, slug/URL, SKU id or EAN: every SKU with EAN and variations, every seller's offer (sale, list and pre-discount price, stock, best interest-free instalment), specifications, categories and images.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `product_id` (string, optional) — VTEX product id, exactly as search rows return it in `product_id`.
- `link_text` (string, optional) — Product slug (`link_text` in search rows) or the full product page URL (…/<slug>/p).
- `sku_id` (string, optional) — VTEX SKU id (`items[].sku_id`).
- `ean` (string, optional) — EAN / GTIN barcode of one SKU.
- `sales_channel` (integer, optional) — VTEX sales channel (trade policy) id. Omit for the store's default channel (1). A channel can change the assortment; a channel the store does not expose is rejected.

**Returns:** product{product_id, name, brand, brand_id, link_text, url, category_path, category_path_ids, categories[], release_date, description, specifications{}, clusters[], price, list_price, spot_price, currency, in_stock, discount_pct, items[]{sku_id, name, ean, ref_id, measurement_unit, unit_multiplier, variations{}, images[], sellers[]{seller_id, seller_name, is_default, price, list_price, price_without_discount, spot_price, available_quantity, stock_quantity_capped, in_stock, installments_best{}, price_valid_until, promotions[]}}} — pass exactly one of product_id, link_text, sku_id, ean

**Example request body:**
```json
{
  "store": "www.chedraui.com.mx"
}
```

### POST https://api.reefapi.com/vtex/v1/products — 3 credits
Up to 50 VTEX products in ONE upstream request, by product ids or by EAN barcodes — same full shape as product, plus the list of ids/EANs the store did not return.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `product_ids` (array, optional) — Up to 50 VTEX product ids, comma-separated or a list — fetched in ONE upstream request.
- `eans` (array, optional) — Up to 50 EAN / GTIN barcodes, comma-separated or a list — fetched in ONE upstream request.
- `sales_channel` (integer, optional) — VTEX sales channel (trade policy) id. Omit for the store's default channel (1). A channel can change the assortment; a channel the store does not expose is rejected.

**Returns:** products[]{product_id, name, brand, brand_id, link_text, url, category_path, category_path_ids, categories[], release_date, description, specifications{}, clusters[], price, list_price, spot_price, currency, in_stock, discount_pct, items[]{sku_id, name, ean, ref_id, measurement_unit, unit_multiplier, variations{}, images[], sellers[]{seller_id, seller_name, is_default, price, list_price, price_without_discount, spot_price, available_quantity, stock_quantity_capped, in_stock, installments_best{}, price_valid_until, promotions[]}}} + not_found[] — pass product_ids OR eans

**Example request body:**
```json
{
  "store": "www.chedraui.com.mx"
}
```

### POST https://api.reefapi.com/vtex/v1/categories — 2 credits
The store's category tree, flattened: id, name, depth, parent, full name path and the id path you pass to search as category_id.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `depth` (integer, optional, default 2) — How many category levels to return (1 = departments only).

**Returns:** categories[]{id, name, depth, parent_id, path, category_path_ids, has_children, url}

**Example request body:**
```json
{
  "store": "www.olimpica.com",
  "depth": 1
}
```

### POST https://api.reefapi.com/vtex/v1/facets — 2 credits
Filter vocabulary and counts for a search term: departments, categories (with ids and counts), brands with counts, price ranges and specification filters.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `query` (string, required) — Search term to compute the facets for.

**Returns:** departments[]{name, count}, categories[]{id, name, depth, count}, brands[]{name, count}, price_ranges[]{name, slug, count}, specifications[]{name, values[]{name, count}}

**Example request body:**
```json
{
  "store": "www.chedraui.com.mx",
  "query": "leche"
}
```

### POST https://api.reefapi.com/vtex/v1/brands — 3 credits
Every brand registered in the store with its VTEX brand id (the id search accepts as brand_id), optionally filtered by name.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `name_contains` (string, optional) — Only brands whose name contains this text (case- and accent-insensitive).
- `page` (integer, optional, default 1) — Page number (1, 2, 3…).
- `limit` (integer, optional, default 100) — Brands per page (1–1000).

**Returns:** brands[]{id, name, is_active} + meta.total

**Example request body:**
```json
{
  "store": "www.chedraui.com.mx"
}
```

### POST https://api.reefapi.com/vtex/v1/store_info — 3 credits
Confirms a domain is a VTEX store and returns its currency, locale, country, time zone, default sales channel, total catalog size and which search APIs are open.

**Parameters:**
- `store` (string, required) — The VTEX store's public domain or any URL on it (e.g. www.chedraui.com.mx, https://www.plazavea.com.pe/leche). Works for any store running on VTEX whose public catalog API is open. IP addresses, ports and internal hostnames are rejected.
- `sales_channel` (integer, optional) — VTEX sales channel (trade policy) id. Omit for the store's default channel (1). A channel can change the assortment; a channel the store does not expose is rejected.

**Returns:** platform, store, currency, currency_symbol, culture, country, time_zone, sales_channel{id, name}, catalog_api_open, total_products, intelligent_search_open

**Example request body:**
```json
{
  "store": "www.farmacity.com"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=vtex
- Human docs page: https://reefapi.com/docs/vtex
- Overview page: https://reefapi.com/vtex-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
