# Catalog Normalizer — ES/EN product feeds (MXN/USD) (`armando_scram/mx-catalog-normalizer`) Actor

Clean messy Spanish/English product catalogs: titles, brands, price+currency (MXN/USD), stock, attributes. For MercadoLibre, Shopify, B2B feeds and AI agents.

- **URL**: https://apify.com/armando\_scram/mx-catalog-normalizer.md
- **Developed by:** [Armando Cortés](https://apify.com/armando_scram) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 normalized products

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

## MX Catalog Normalizer

Normalize messy product catalogs into a consistent ecommerce-ready dataset for Mexico and international workflows. The Actor accepts product objects in Spanish or English and returns standardized titles, brands, prices, currencies, availability, attributes, and quality anomalies.

### What it does

- Maps Spanish and English aliases such as `nombre`/`name`, `marca`/`brand`, and `precio`/`price`.
- Parses common MXN, USD, and EUR price formats.
- Standardizes availability to `in_stock`, `out_of_stock`, `preorder`, or `unknown`.
- Preserves unknown source fields inside `attributes`.
- Flags missing or invalid values instead of inventing data.
- Processes up to 10,000 products per run.
- Makes no network requests and uses no paid third-party APIs.

### Input

```json
{
  "products": [
    {
      "nombre": "Laptop Profesional 14 pulgadas",
      "marca": "EjemploMX",
      "precio": "$18,499.90 MXN",
      "availability": "disponible",
      "sku": "DEMO-001"
    }
  ]
}
```

### Output

```json
{
  "title": "Laptop Profesional 14 pulgadas",
  "brand": "EjemploMX",
  "price": 18499.9,
  "currency": "MXN",
  "availability": "in_stock",
  "attributes": {
    "sku": "DEMO-001"
  },
  "anomalies": [],
  "normalized_at": "2026-09-30T01:09:42.935Z"
}
```

Results are written to the run's default Dataset and can be downloaded as JSON, CSV, Excel, XML, RSS, or JSONL using Apify's standard exports.

### Limits

- Maximum 10,000 products per run.
- Maximum 64 KiB serialized per product.
- Maximum nesting depth: 6.
- Maximum 80 keys per product.
- Maximum string length: 4,096 characters.
- Maximum `attributes` size: 32 KiB.

The Actor rejects oversized or malformed payloads before copying attributes or writing results.

### Data quality behavior

This Actor normalizes supplied values; it does not verify whether commercial claims are true. Missing fields remain `null` and appear in `anomalies`. Review results before importing them into a production store or ERP.

### Privacy

Do not submit personal data, credentials, payment details, or confidential information. The Actor does not transmit input to third parties. Input and Dataset retention follow your Apify account and storage settings; delete storages when no longer needed.

### Performance and security

The verified benchmark processed 1,000 items across 20 runs with mean 9.242 ms and approximately 108,205 items/s on the test host. Actual cloud runtime includes container startup and Dataset writes.

Verified release:

- Local tests: 7/7 passed.
- Apify cloud build: successful.
- Remote smoke run: successful.
- Production dependency audit: 0 known vulnerabilities.
- Runtime permission level: `LIMITED_PERMISSIONS`.

### Español

Normaliza catálogos heterogéneos para ecommerce en México. Acepta campos en español o inglés, estandariza títulos, marcas, precios, monedas y disponibilidad, conserva atributos adicionales y reporta anomalías sin inventar información.

La entrada es `{"products":[...]}` y el límite es de 10,000 productos por ejecución. Los resultados quedan disponibles en el Dataset de Apify para descargarse en JSON, CSV, Excel, XML, RSS o JSONL.

No envíes datos personales, credenciales ni información confidencial. El Actor no hace scraping, no llama servicios externos y no usa APIs pagadas.

### Support

For reproducible bugs, include a redacted sample input, the run ID, expected output, and actual output. Never include API tokens or sensitive customer data.

# Actor input Schema

## `products` (type: `array`):

Product objects only; no personal data. Maximum 10,000 items with runtime resource limits.

## Actor input object example

```json
{
  "products": []
}
```

# Actor output Schema

## `normalizedProducts` (type: `string`):

Ecommerce-ready product records with standardized title, brand, price, currency, availability, attributes, anomalies, and normalization timestamp.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("armando_scram/mx-catalog-normalizer").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("armando_scram/mx-catalog-normalizer").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 '{}' |
apify call armando_scram/mx-catalog-normalizer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,armando_scram/mx-catalog-normalizer"
        }
    }
}
```

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/OCY2xGHKCaHFrX1nj/builds/PCveTid7XQHRym556/openapi.json
