# Product CSV Audit: Duplicate SKUs & Price Checks (`pennymachine42/penny-product-catalog-audit`) Actor

Audit product catalogue CSVs for duplicate SKUs, missing identifiers, conflicting prices and formatting risks. Receive a review report and processed CSV. Up to 500 rows / 128 KB; no store connection required.

- **URL**: https://apify.com/pennymachine42/penny-product-catalog-audit.md
- **Developed by:** [Penny Machine](https://apify.com/pennymachine42) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 completed catalogue audits

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

## Product CSV Audit: Duplicate SKUs & Price Checks

Check product catalogue data before it enters your next workflow step.

Penny flags duplicate SKUs, missing identifiers, conflicting product information, unusual prices and spreadsheet-formatting risks. Receive audit findings and a processed CSV for review—without connecting your online store.

### Who is it for?

- Ecommerce teams reviewing supplier product files.
- Developers adding CSV validation to data pipelines.
- AI agents checking catalogue data before an approved import.

### Quick example

Select JSON input and paste:

```json
{
  "csv": "sku,name,price,currency\nDEMO-1,Example Widget,19.95,AUD\nDEMO-1,Example Widget,20.95,AUD",
  "delimiter": ",",
  "requireBarcode": false
}
```

These fictional rows share a SKU but have different prices. Penny flags the duplicate and conflicting prices for review. It does not choose which price is correct or silently merge the rows.

### Input requirements

| Field | Description |
|---|---|
| `csv` | Required. Product CSV text, up to 500 product rows and 128 KB. |
| `delimiter` | Comma `,`, semicolon `;`, or the string `tab`. Default: comma. |
| `requireBarcode` | Set to `true` when barcode information is required. Default: `false`. |

Your CSV must contain a column named `sku`. Map differently named supplier columns explicitly before submitting.

Only submit product data you have permission to process. Do not include personal information, credentials or confidential documents.

### What Penny checks

- Duplicate product SKUs.
- Missing product identifiers.
- Inconsistent product names and prices.
- Invalid or unusual price values.
- Missing barcode information when required.
- Potential spreadsheet-formatting risks.

### Results

After a successful run, open the Actor’s Dataset or Output view to inspect and download the findings and processed CSV.

A successful run means processing completed—not that the catalogue is approved for import.

Penny does not:

- Update your store or delete products.
- Decide which conflicting record is authoritative.
- Guess missing prices.
- Certify barcode ownership.
- Guarantee Shopify, WooCommerce or other marketplace import compatibility.

Duplicate SKUs can be intentional. Review the business context before changing them.

**The processed CSV is a review copy, not guaranteed import-ready data.** Treat formula-like values as untrusted. Import spreadsheet columns as text or inspect the JSON results first.

### API and AI-agent integration

Actor identifier:

`pennymachine42/penny-product-catalog-audit`

Apify API identifier:

`pennymachine42~penny-product-catalog-audit`

Use this Actor’s **API** tab for generated integration examples. Supply the JSON input shown above and keep your Apify token private.

For asynchronous integrations:

1. Start an authorized Actor run.
2. Wait for the run to finish successfully.
3. Retrieve its dataset.
4. Inspect findings before performing any downstream update.

Apify MCP supports retrieving this Actor’s details by its exact identifier. Agents should inspect the input schema and current pricing before requesting execution.

Discovery alone does not authorize a paid run. Execution requires the customer’s authorized Apify account or a supported agent-payment arrangement.

### Pricing

The current published price is:

- **US$0.05 per completed catalogue audit**, up to 500 product rows.
- **US$0.00005 per Actor-start event**, with a minimum of one event and additional events depending on allocated memory.

At 1 GB of allocated memory, one start event plus one completed audit totals **US$0.05005**.

Check the live Pricing tab for current prices and any applicable account charges or taxes. Free-plan usage does not generate creator revenue.

### Repeatable workflow

Use Penny after a supplier CSV arrives and before an approved catalogue import:

**Receive CSV → audit → review findings → approve any changes → import.**

This Actor audits one supplied file. It does not provide live inventory monitoring or compare successive catalogue versions.

### Support

Use the Actor’s **Issues** tab with a small fictional example, the observed result and the expected behaviour.

Never post customer files, credentials or API tokens publicly.

# Actor input Schema

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

Paste your product CSV data here. Maximum 128 KB.

## `delimiter` (type: `string`):

Choose how columns are separated in your CSV.

## `requireBarcode` (type: `boolean`):

Check whether a barcode is required for every product.

## Actor input object example

```json
{
  "csv": "sku,name,price,currency\nDEMO-1,Example Widget,19.95,AUD\nDEMO-1,Example Widget,20.95,AUD",
  "delimiter": ",",
  "requireBarcode": false
}
```

# Actor output Schema

## `results` (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 = {
    "csv": `sku,name,price,currency
DEMO-1,Example Widget,19.95,AUD
DEMO-1,Example Widget,20.95,AUD`
};

// Run the Actor and wait for it to finish
const run = await client.actor("pennymachine42/penny-product-catalog-audit").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 = { "csv": """sku,name,price,currency
DEMO-1,Example Widget,19.95,AUD
DEMO-1,Example Widget,20.95,AUD""" }

# Run the Actor and wait for it to finish
run = client.actor("pennymachine42/penny-product-catalog-audit").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 '{
  "csv": "sku,name,price,currency\\nDEMO-1,Example Widget,19.95,AUD\\nDEMO-1,Example Widget,20.95,AUD"
}' |
apify call pennymachine42/penny-product-catalog-audit --silent --output-dataset

```

## MCP server setup

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

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/VaGq3bTrZc8cszSEc/builds/nmNyJiF1Dqa5Zd1jT/openapi.json
