# Liverpool Mexico Products & Prices Scraper (`bovi/liverpool-scraper`) Actor

Collect Liverpool Mexico product records with prices, ratings, sellers, categories, variants, and links. Pricing: $0.0032/result on Free plan plus $0.00005/actor start. Run with search terms or Liverpool Mexico URLs; no Liverpool account required.

- **URL**: https://apify.com/bovi/liverpool-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 liverpool mexico products & prices scrapers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Liverpool Mexico Products & Prices Scraper

Extract product records from the Liverpool Mexico storefront at `liverpool.com.mx`, including catalog prices, ratings, sellers, categories, variants, images, and Liverpool links. The Actor reads embedded catalog data and does not need a Liverpool account.

- Compare current and original MXN prices, discounts, and sale flags across listings.
- Build repeatable price-monitoring datasets from search terms and observed records.
- Analyze marketplace, seller, cross-border, category, and variant information.
- Collect ratings, review counts, brands, images, and product links for catalog analysis.
- Repeat collections through Apify Schedules for listing or price monitoring.

### What you get

The Actor reads embedded catalog data from Liverpool Mexico search pages. A field is omitted from the record when the source does not provide the value, so expect missing keys rather than `null` values.

| Field family | Fields | Type | What it contains |
| --- | --- | --- | --- |
| Identity | `productName`, `sku`, `productUrl` | string | Product name, Liverpool product identifier, and generated product-page URL. These required identity fields are present for emitted records. |
| Provenance | `source`, `keyword`, `observedAt` | string, ISO 8601 string | Storefront source, search term associated with the record, and UTC collection time. `keyword` and `observedAt` are omitted when the source does not provide the value. For a Liverpool URL input, `keyword` can contain its `s` or `q` query value. |
| Pricing | `priceAmount`, `originalPrice`, `currency` | number, number, string | Current and original catalog prices; `currency` is `MXN` when a current price is available. These fields are omitted from the record when the source does not provide the value. |
| Discounts | `discountPct`, `onSale` | number, boolean | Discount percentage shown or calculated from current and original prices, and whether the current price is below the original price. These fields are omitted from the record when the source does not provide the value. |
| Catalog | `brand`, `category`, `productType` | string | Brand, category or breadcrumb path, and Liverpool product type when provided. These fields are omitted from the record when the source does not provide the value. |
| Ratings | `rating`, `reviewCount` | number, integer | Average product rating and number of product ratings or reviews when available. These fields are omitted from the record when the source does not provide the value. |
| Offer details | `seller`, `isMarketplace`, `crossBorder` | string, boolean, boolean | Seller name, marketplace flag, and cross-border flag when the catalog provides them. These fields are omitted from the record when the source does not provide the value. |
| Variants | `variantSkuIds`, `variantColors`, `variantCount` | array of strings, array of strings, integer | Variant SKU identifiers, available color names, and the number of listed variants. These fields are omitted from the record when the source does not provide the value. |
| Media | `imageUrl` | string | HTTPS product image URL when present in the page data. This field is omitted from the record when the source does not provide the value. |

### Sample output

Example record:

```json
{
  "productName": "iPhone Duo 7.6 pulgadas Super Retina XDR",
  "sku": "1209379861", "productUrl": "https://www.liverpool.com.mx/tienda/pdp/producto/1209379861",
  "source": "Liverpool Mexico", "brand": "APPLE",
  "priceAmount": 47998.75, "currency": "MXN", "originalPrice": 50525,
  "onSale": true, "discountPct": 5, "rating": 5, "reviewCount": 2,
  "category": "Electrónica > Celulares y Telefonía > Celulares", "productType": "Soft Line",
  "seller": "liverpool", "isMarketplace": false, "crossBorder": false,
  "imageUrl": "https://sp632.liverpool.com.mx/i/1209313487.jpg",
  "variantSkuIds": ["1209314351", "1209313509"], "variantColors": ["Negro", "Blanco"],
  "variantCount": 2, "keyword": "iphone",
  "observedAt": "2026-10-28T08:54:26.872133+00:00"
}
```

### Pricing

The current billing model charges per event. You pay only for the events listed below. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately.

On the Free plan the Actor charges these events:

- `apify-default-dataset-item`: one scraped result with all fields, priced at **$0.0032 per result on the Free plan**.
- `apify-actor-start`: **$0.00005 per event on the Free plan**. It is charged once per GB of run memory, with a minimum of one event.

On the Free plan, **1,000 results = $3.20 for result events (1,000 × $0.0032), plus the `apify-actor-start` charge**. On the Free plan, **10,000 results = $32.00 for result events (10,000 × $0.0032), plus the `apify-actor-start` charge**.

The Free plan includes **$5 of monthly platform usage credit**. On the Free plan, **1,562 results plus one `apify-actor-start` event cost $4.99845 in total**, which is below that credit.

### How to use

1. **Open** the Actor in Apify and choose Start.
2. **Enter** `keywords` as an array of product search terms or Liverpool Mexico search URLs. Values are processed in the order you list them.
3. **Set** `maxResults` to the maximum number of unique products you want across all search terms.
4. **Optionally adjust** `proxyConfiguration`. The Apify console pre-fills Apify RESIDENTIAL proxy; if the object is omitted from the input (for example via the API), the run works without a proxy.
5. **Start** the run and inspect the default dataset as records arrive. Duplicate products identified by SKU are emitted once.
6. **Repeat** the run through Apify Schedules; as a starting point, try daily runs for listing or price collection.

Example input:

```json
{
  "keywords": [
    "iphone",
    "https://www.liverpool.com.mx/tienda?s=macbook"
  ],
  "maxResults": 50
}
```

Export the default dataset as JSON or CSV, or read it through the Apify dataset API.

### Input parameters

| Parameter | What it does | Default |
| --- | --- | --- |
| `keywords` | Required array of non-empty search terms or Liverpool Mexico URLs. String values are trimmed and processed in order. | None; an omitted or empty array produces no records. |
| `maxResults` | Integer upper limit (schema minimum `1`) for unique product records the run emits while processing the search terms. It may not be reached, because each search term fetches a single search page. Zero or negative values stop the run without output. | `50` |
| `proxyConfiguration` | Optional Apify proxy settings object. | Apify RESIDENTIAL proxy in the console; no proxy when the object is omitted from the input. |

### Limits and edge cases

| Condition | What the buyer sees | What to do |
| --- | --- | --- |
| `keywords` is omitted, empty, or contains no usable strings | The run finishes as Succeeded without records. | Provide at least one non-empty search term or accepted Liverpool Mexico URL. |
| `maxResults` is zero or negative | The run finishes as Succeeded without records. | Use a positive integer. |
| `maxResults` cannot be converted to an integer | The Actor falls back to `50`. | Provide an integer explicitly when you need a different limit. |
| A source product has no product identifier or usable product name | That product is not emitted. | Use a search term that returns catalog records with a product identifier and name. |
| A product field is absent from the storefront data | That field is omitted from the record. | Expect missing keys when importing the dataset and treat absent fields as unknown. |
| The same SKU appears for multiple search terms | The product is emitted once, and the overall result count still uses the unique-product limit. | Use `keyword` to see which search term returned an emitted record. |
| Each search term or URL fetches a single search page (no pagination) | `maxResults` is an upper bound and may not be reached. | Add more search terms or URLs to collect more products. |
| A URL is outside `liverpool.com.mx`, `www.liverpool.com.mx` or `m.liverpool.com.mx` | The URL is skipped. | Use a search term or a Liverpool Mexico URL on those hosts. |
| The unique-product limit is reached | The Actor stops adding records when the limit is reached. | — |
| A search request raises an exception | The failed search is skipped, later search terms can continue, and the run can finish as Succeeded with an empty or short dataset; records already pushed remain in the dataset. | Check the search value and run logs, then retry the run if needed. |
| A fetched page contains no parseable product records | No records are added for that search. | Check the search term or URL and try another catalog query. |

### FAQ

#### How much does it cost to scrape Liverpool Mexico?

On the Free plan, the result event costs **$0.0032 per result** and the `apify-actor-start` event costs **$0.00005 per event** (once per GB of run memory, minimum one event). **On the Free plan, 1,000 results cost $3.20 for result events (1,000 × $0.0032), plus the `apify-actor-start` charge**.

#### Why is my Liverpool Mexico dataset empty?

The Actor returns no records when `keywords` is missing or empty, when `maxResults` is zero or negative, when a request fails, or when the fetched page contains no parseable catalog products. Check that the search term or URL is valid, use a positive `maxResults` value, and review the run log for warnings.

#### What should I check if a search does not work?

The Actor skips a failed search while later search terms can continue. Correct the input and run it again.

#### Is it legal to use public data from Liverpool Mexico?

The Actor collects public storefront data from `liverpool.com.mx` without a Liverpool account. Whether a particular use is allowed depends on the source terms and applicable law for your use case, so review those requirements before using the data.

### Related actors

- [Competitor Price Monitor – Price Drop Alerts, Any Store URL](https://apify.com/bovi/competitor-price-monitor) — related to price-monitoring workflows and store URL collection.
- [91mobiles Scraper — India Phone Prices, Specs & Scores](https://apify.com/bovi/91mobiles-scraper) — related to phone-price and product-specification collection.
- [ALDI AU Scraper - Groceries, Special Buys & Prices](https://apify.com/bovi/aldi-scraper) — related to ecommerce product and price extraction.

# Actor input Schema

## `keywords` (type: `array`):

Product search terms or Liverpool Mexico search URLs. Results are collected in the supplied order.

## `maxResults` (type: `integer`):

Maximum number of unique product records to return across all search terms.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy configuration. Disabled by default.

## Actor input object example

```json
{
  "keywords": [
    "iphone"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with the collected product records.

# 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 = {
    "keywords": [
        "iphone"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/liverpool-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 = {
    "keywords": ["iphone"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/liverpool-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "iphone"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call bovi/liverpool-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bovi/liverpool-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/pa2488Dgg7dOjPMn0/builds/A7xWX1d1PrM0Tl7bZ/openapi.json
