# Voilà groceries

> Search the Voilà online grocery catalogue (CAD). Voilà serves Ontario and Quebec; prices and range follow the delivery region (pass latitude/longitude).
> ReefAPI engine `voila` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/voila/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/voila/v1/search — 3 credits
Search the Voilà online grocery catalogue (CAD). Voilà serves Ontario and Quebec; prices and range follow the delivery region (pass latitude/longitude).

**Parameters:**
- `query` (string, required) — Search text, up to 100 characters.
- `limit` (integer, optional, default 24) — Products requested per page, 1-48. The source can return fewer (duplicate rows across its groups are dropped).
- `cursor` (string, optional) — next_cursor from the previous page of the same call (same query, filters and location).
- `sort` (enum, optional, default "favorite") — Source ordering. [one of: favorite, priceAscending, priceDescending, pricePerAscending, pricePerDescending]
- `brand` (string, optional) — Exact brand value from the facets[id=brands] list of a previous answer.
- `latitude` (number, optional) — Delivery location latitude. Prices and assortment on Voilà follow the region that serves this point; give latitude and longitude together. Without them the answer uses the site default region (Default Region 1) and says store_defaulted=true.
- `longitude` (number, optional) — Delivery location longitude (with latitude).
- `postal_code` (string, optional) — Postal code of that location (optional, passed to the site with the coordinates).

**Returns:** Products with CAD shelf price, unit price, promotions, availability, brand, pack size, image and url; facets; next_cursor; location (region used, store_defaulted).

**Example request body:**
```json
{
  "query": "milk",
  "limit": 24
}
```

### POST https://api.reefapi.com/voila/v1/category — 3 credits
Browse one Voilà category by its id from categories.

**Parameters:**
- `category_id` (string, required) — Category UUID from the categories action.
- `limit` (integer, optional, default 24) — Products requested per page, 1-48. The source can return fewer (duplicate rows across its groups are dropped).
- `cursor` (string, optional) — next_cursor from the previous page of the same call (same query, filters and location).
- `sort` (enum, optional, default "favorite") — Source ordering. [one of: favorite, priceAscending, priceDescending, pricePerAscending, pricePerDescending]
- `brand` (string, optional) — Exact brand value from the facets[id=brands] list of a previous answer.
- `latitude` (number, optional) — Delivery location latitude. Prices and assortment on Voilà follow the region that serves this point; give latitude and longitude together. Without them the answer uses the site default region (Default Region 1) and says store_defaulted=true.
- `longitude` (number, optional) — Delivery location longitude (with latitude).
- `postal_code` (string, optional) — Postal code of that location (optional, passed to the site with the coordinates).

**Returns:** Same product rows as search, plus the source category product count.

**Example request body:**
```json
{
  "category_id": "9d083199-36dc-42b2-8793-6bd1cfe5823d"
}
```

### POST https://api.reefapi.com/voila/v1/product — 3 credits
Full Voilà product sheet: description, ingredients, allergens, nutrition table, every label field, all images, promotions with terms.

**Parameters:**
- `id` (string, required) — Product id from search (`id`), or a voila.ca product URL.
- `latitude` (number, optional) — Delivery location latitude. Prices and assortment on Voilà follow the region that serves this point; give latitude and longitude together. Without them the answer uses the site default region (Default Region 1) and says store_defaulted=true.
- `longitude` (number, optional) — Delivery location longitude (with latitude).
- `postal_code` (string, optional) — Postal code of that location (optional, passed to the site with the coordinates).

**Returns:** The search row fields plus description, fields, ingredients, allergens, nutrition, breadcrumbs, images and gtin (only when the label prints an EAN).

**Example request body:**
```json
{
  "id": "243255EA"
}
```

### POST https://api.reefapi.com/voila/v1/categories — 2 credits
Voilà category tree (top level and one child level) with the ids the category action takes.

**Parameters:** none

**Returns:** Category tree: id, name, retailer_category_id, children.

## 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=voila
- Human docs page: https://reefapi.com/docs/voila
- Overview page: https://reefapi.com/voila-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
