# Catalog Check — Supplier Price List Comparison (`iwins/catalog-check`) Actor

Compare supplier CSV catalogs by product code. Detect price changes per item, smaller packs, new and missing products, duplicates and currency or unit mismatches. Export JSON and CSV reports.

- **URL**: https://apify.com/iwins/catalog-check.md
- **Developed by:** [Ahmed Firas](https://apify.com/iwins) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / catalog comparison

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

## Catalog Check — Supplier Price List Comparison

Compare two supplier CSV catalogs and get a report of price changes, smaller packs, new products, missing products and rows that need human review. Use it before updating a shop catalog, purchasing spreadsheet or inventory system.

**Example:** a pack still costs EUR 18, but the supplier reduces its contents from 12 items to 6. Catalog Check reports a **100% increase per item**, even though the pack price is unchanged.

### What you get

- Unit-price increases and decreases, with percentage changes.
- Pack changes, including repacked products whose unit price stays the same.
- New products and products absent from the updated file.
- Review flags for duplicate product codes, invalid values, mismatched currencies and incompatible units.
- Source line numbers and complete JSON and CSV exports.

Calculations are deterministic. No AI model, external scraping, supplier credentials or third-party API key is required. The Actor does not modify your shop or supplier files.

### Quick start

1. Open **Input**. The supplied example is fictional and ready to run.
2. In **Current catalog** and **Updated catalog**, provide CSV text, its delimiter and decimal mark, and the column names to use.
3. Click **Start**. After the run succeeds, open **Output → Report files**, or **Storage → Key-value store**.
4. Download **CHANGES.csv** for a spreadsheet or **OUTPUT** for a JSON workflow. The dataset contains one summary entry for the entire comparison; full product rows are in the report files.

This hosted Actor accepts CSV text in its input form or API. It does not host the separate local dashboard or provide a native XLSX/PDF file-upload interface.

#### Complete example input

```json
{
  "currency": "EUR",
  "unit": "item",
  "previous": {
    "csv": "sku,name,price,pack\n001,Notebook,18.00,12",
    "delimiter": ",",
    "decimal": ".",
    "columns": {"sku":"sku","name":"name","price":"price","pack":"pack"}
  },
  "updated": {
    "csv": "sku,name,price,pack\n001,Notebook,18.00,6",
    "delimiter": ",",
    "decimal": ".",
    "columns": {"sku":"sku","name":"name","price":"price","pack":"pack"}
  }
}
```

### Input options

Each catalog has its own `csv`, `delimiter`, `decimal` and `columns` values. Supported delimiters are comma, semicolon and tab. Use `.` or `,` as the decimal mark. Set column mappings to the exact header text.

| Mapping | Required | Meaning |
| --- | --- | --- |
| `sku` | Yes | Product code; leading zeroes are preserved. |
| `price` | Yes | Price for the entire pack. |
| `name` | No | Product description. |
| `pack` | No | Whole-number quantity per pack; defaults to 1 when unmapped. |
| `currency` | No | Currency code; defaults to the top-level currency when unmapped. |
| `unit` | No | Base unit; defaults to the top-level unit when unmapped. |

Top-level defaults are `EUR` and `item`. Blank values in mapped columns are reviewed rather than silently replaced with defaults. Input files may have different column names and separators.

### Report statuses

`increased`, `decreased`, `unchanged`, `repacked`, `new`, `missing`, and `review`. The JSON report contains `sourceRows`, `summary`, and `rows`; the CSV includes all report rows. A missing product means absent from this update, **not confirmed discontinued**.

### Limits and interpretation

- Maximum 2 MiB and 10,000 data rows per catalog; maximum 8 MiB per output report.
- Exact, case-sensitive product-code matching after trimming surrounding spaces. No fuzzy matching.
- Non-negative prices, up to four decimal places, without currency symbols or thousands separators.
- Whole-number pack quantities from 1 to 999999. Unit-price display uses up to six decimals.
- No currency conversion, unit conversion or tax conversion. Both files must use the same tax basis.
- CSV/TSV only; no native Excel, PDF or image parsing.
- Formula-leading values in CSV output are protected as text. Review flagged rows before importing results into another system.

### Data and pricing

Your input and reports are stored in your Apify run storage under Apify's retention and access settings. This is cloud processing, not local-only processing. Only submit catalogs you are authorized to process. No catalog contents are written to the application log or sent to AI providers.

The configured price is **USD 1 per completed comparison**, covering both catalogs and both report files, with platform usage included. This is one charge for the whole comparison, not one charge per product. There is no startup charge or AI API fee. Consult the current **Pricing** tab before running and set the maximum run cost to at least USD 1.

Reports are saved before the single chargeable summary entry is written. Invalid inputs do not create that entry. If a run fails during the final write, inspect its dataset and saved reports before starting another run: a network interruption can occur after a write has reached Apify. Resurrecting a run with an existing summary is refused to avoid a duplicate charge. A new run is a new comparison and can be charged again.

### Support

Open an issue on this Actor's **Issues** tab with the error message and a small fictional example. Do not post confidential catalogs, credentials or personal data in public issues.

# Actor input Schema

## `previous` (type: `object`):

CSV text, delimiter, decimal mark and column mapping. Max 2 MiB / 10000 rows. Example: {"csv":"sku,price\n001,12.50","delimiter":",","decimal":".","columns":{"sku":"sku","price":"price"}}

## `updated` (type: `object`):

Same shape as the current catalog; each file can have a different column mapping and decimal mark.

## `currency` (type: `string`):

Used only when no currency column is mapped. Three-letter currency code.

## `unit` (type: `string`):

Used only when no unit column is mapped. Both catalogs must use the same tax basis.

## Actor input object example

```json
{
  "previous": {
    "csv": "sku,price\n001,12.50",
    "delimiter": ",",
    "decimal": ".",
    "columns": {
      "sku": "sku",
      "price": "price"
    }
  },
  "updated": {
    "csv": "sku,price\n001,13.75",
    "delimiter": ",",
    "decimal": ".",
    "columns": {
      "sku": "sku",
      "price": "price"
    }
  },
  "currency": "EUR",
  "unit": "item"
}
```

# Actor output Schema

## `comparison` (type: `string`):

No description

## `files` (type: `string`):

No description

## `report` (type: `string`):

No description

## `csv` (type: `string`):

No description

# 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 = {
    "previous": {
        "csv": "sku,price\n001,12.50",
        "delimiter": ",",
        "decimal": ".",
        "columns": {
            "sku": "sku",
            "price": "price"
        }
    },
    "updated": {
        "csv": "sku,price\n001,13.75",
        "delimiter": ",",
        "decimal": ".",
        "columns": {
            "sku": "sku",
            "price": "price"
        }
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("iwins/catalog-check").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 = {
    "previous": {
        "csv": """sku,price
001,12.50""",
        "delimiter": ",",
        "decimal": ".",
        "columns": {
            "sku": "sku",
            "price": "price",
        },
    },
    "updated": {
        "csv": """sku,price
001,13.75""",
        "delimiter": ",",
        "decimal": ".",
        "columns": {
            "sku": "sku",
            "price": "price",
        },
    },
}

# Run the Actor and wait for it to finish
run = client.actor("iwins/catalog-check").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 '{
  "previous": {
    "csv": "sku,price\\n001,12.50",
    "delimiter": ",",
    "decimal": ".",
    "columns": {
      "sku": "sku",
      "price": "price"
    }
  },
  "updated": {
    "csv": "sku,price\\n001,13.75",
    "delimiter": ",",
    "decimal": ".",
    "columns": {
      "sku": "sku",
      "price": "price"
    }
  }
}' |
apify call iwins/catalog-check --silent --output-dataset

```

## MCP server setup

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

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/1H6dZe8oO7ufZbiBp/builds/6rBx6Eiyj7sdJ1KYh/openapi.json
