# MAP Violation Monitor: Find Unauthorized Sellers & Price Cuts (`fayoussef/map-violation-monitor`) Actor

Enter your products and MAP prices and get every public offer advertised below them on Amazon, eBay, Best Buy and Newegg. AI verifies each listing is your exact product, so accessories and variants never trigger a false violation. Graded severity, seller identity and a direct evidence link per row.

- **URL**: https://apify.com/fayoussef/map-violation-monitor.md
- **Developed by:** [youssef farhan](https://apify.com/fayoussef) (community)
- **Categories:** E-commerce, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.50 / 1,000 product checkeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does MAP Violation Monitor do?

MAP Violation Monitor finds **every public offer of your products that is advertised below your MAP (minimum advertised price)** across [Amazon](https://www.amazon.com), [eBay](https://www.ebay.com), [Best Buy](https://www.bestbuy.com) and [Newegg](https://www.newegg.com). You supply your products and the price you enforce; it returns **one row per offending listing, with the advertised price, the shortfall, a graded severity, the seller where disclosed, and a direct link to the listing as evidence**.

Every offer is put through an **AI exact-match check against your product** before it is flagged. This is what stops the false violations that make cheap MAP tools unusable: a $19 replacement cable, a refurbished unit, or a different colourway of your SKU will never be reported as someone breaking MAP on your $199 product.

Enterprise MAP platforms start around $300/month, require onboarding calls and multi-month contracts, and are built for brands with hundreds of retail partners. This runs on Apify with **no contract, no minimum, and no catalogue upload**: paste your products, run it, schedule it.

### Why use this MAP monitoring and unauthorized seller tool?

- **Catch MAP violations across channels you do not control.** Your distributors' customers resell on eBay and Amazon; this is where MAP erosion actually happens.
- **Identify unauthorized sellers.** Supply your approved reseller list and any seller outside it is flagged.
- **Build an enforcement evidence trail.** Every row carries the listing URL, the advertised price and a UTC timestamp, which is what a notice needs.
- **Get a new-violations digest on a schedule.** Run it daily and the `isNewViolation` flag tells you what appeared since last time, instead of re-reading the same list.
- **Protect channel relationships.** Show a compliant partner the data proving the undercutting came from somewhere else.
- **Price intelligence for distributors.** See the real advertised floor for products you supply.

### How to use MAP Violation Monitor

1. Click **Try for free**.
2. In **Products and MAP prices**, paste one product per line as `IDENTIFIER, MAP_PRICE`, for example `B09HM94VDS, 99.99`. The identifier can be an ASIN, UPC, model number or product name. It pastes straight from a spreadsheet.
3. Optionally add your **Authorized sellers**, one per line.
4. Tick **Only output violations** if you want just the offenders.
5. Click **Start**, then open the **Output** tab and export as JSON, CSV, Excel or HTML.
6. Set a **Schedule** to run it daily and use the `isNewViolation` flag as your alert.

No proxy setup is required. AI matching uses Apify's built-in access; if your Apify plan cannot start public Actors, supply your own OpenRouter key instead.

### Input

| Field | What it does |
|---|---|
| `products` | One product per line as `IDENTIFIER, MAP_PRICE`. Required. |
| `defaultMapPrice` | MAP used for any line that carries no price of its own. |
| `authorizedSellers` | Your approved resellers. Anyone else is flagged as unauthorized. |
| `onlyViolations` | Return only offers below MAP, instead of every offer found. |
| `marketplaces` | Which of Amazon, eBay, Best Buy and Newegg to monitor. |
| `model` | The AI model that verifies each offer is your exact product. |
| `zipCode` | US delivery ZIP. Amazon advertises different prices by location. |
| `concurrency` | How many products to check at once. |
| `openrouterApiKey` | Optional. Use your own OpenRouter key instead of Apify's built-in access. |
| `proxyConfiguration` | Optional override. Paid runs already include a US residential network. |

```json
{
    "products": ["B0DGHMNQ5Z, 129.99", "Sony WH-1000XM5, 349.99"],
    "authorizedSellers": ["Best Buy", "B&H Photo"],
    "onlyViolations": true,
    "marketplaces": ["Amazon", "eBay", "BestBuy", "Newegg"]
}
```

### Output

One row per offer. Download as JSON, HTML, CSV or Excel, or read it from the API.

```json
{
    "input": "B09HM94VDS",
    "mapPrice": 99.99,
    "productTitle": "Logitech MX Master 3S Wireless Performance Mouse",
    "brand": "Logitech",
    "model": "910-006557",
    "upc": "097855174789",
    "marketplace": "eBay",
    "offerTitle": "Logitech MX Master 3S Wireless Mouse - Graphite - NEW SEALED",
    "offerUrl": "https://www.ebay.com/itm/298540509421",
    "offerPrice": 78.99,
    "seller": null,
    "isViolation": true,
    "shortfall": 21.0,
    "shortfallPercent": 21.0,
    "severity": "severe",
    "unauthorizedSeller": null,
    "isNewViolation": true,
    "checkedAt": "2026-07-31T14:02:11+00:00",
    "notes": null
}
```

### Data fields

| Field | Description |
|---|---|
| `input` | The product identifier you supplied. |
| `mapPrice` | The MAP you are enforcing for it. |
| `productTitle`, `brand`, `model`, `upc` | Resolved product identity used as the match reference. |
| `marketplace` | Where the offer was found. |
| `offerTitle`, `offerUrl`, `offerPrice` | The listing as advertised, and your evidence link. |
| `seller` | Seller name where the marketplace discloses it on the search page. |
| `isViolation` | True when advertised below your MAP. |
| `shortfall`, `shortfallPercent` | How far below MAP, in dollars and percent. |
| `severity` | `none`, `minor` (under 5%), `moderate` (5 to 15%), `severe` (over 15%). |
| `unauthorizedSeller` | True when the named seller is not on your authorized list. |
| `isNewViolation` | True the first time this listing is seen below MAP across runs. |
| `checkedAt` | UTC timestamp, for your audit trail. |
| `notes` | Coverage warnings, such as a marketplace that could not be reached. |

**Two null values mean something specific, and both are deliberate.**

A `seller` of `null` means the marketplace did not disclose one on the search page. It never means the offer is first-party, and `unauthorizedSeller` stays `null` alongside it rather than guessing. Accusing a named reseller on data you do not have is the one error a brand cannot walk back.

A `notes` value naming an unreachable marketplace means **that product was not fully checked**. A product with a note is not a clean bill of health, and the Actor emits a row saying so rather than letting silence read as compliance.

### How much does MAP monitoring cost?

You are charged per product checked, per offer found, and per violation flagged. A catalogue that is fully compliant costs only the checks and the offers; you pay the premium rate only when the Actor finds you something to act on.

AI model usage is billed separately by Apify's OpenRouter integration, not by this Actor, so you are never charged twice for the same call. Supply your own `openrouterApiKey` to move that usage to your own OpenRouter account.

**Free plan** runs are capped at **2 products per run** and use Apify Proxy residential on your own account. Paid runs lift the cap and include a bundled US residential network at no extra cost. [Upgrade your Apify plan](https://apify.com/pricing?fpr=youssef) to monitor a full catalogue.

### Tips for MAP enforcement

- **Use ASINs or UPCs, not product names.** They resolve to exactly one SKU, so your MAP is compared against the right product.
- **Run it on a daily schedule and filter on `isNewViolation`.** That turns a full listing dump into a short actionable digest.
- **Leave `onlyViolations` off for your first run.** Seeing every offer tells you whether the matching is finding your product before you trust the violation count.
- **Add your authorized sellers early.** Without the list, `unauthorizedSeller` stays null on every row and you lose half the signal.
- **Check `notes` before reporting "zero violations".** A marketplace that could not be reached is a gap in coverage, not a clean result.
- **A product reported as not found is confirmed, not assumed.** Amazon serves 404s to exits it is throttling, so several separate exits must agree before a product in your catalogue is reported missing.
- **Interrupted runs resume.** Progress and the seen-violations history are checkpointed, so a migrated run continues where it stopped.

### FAQ

#### What counts as a MAP violation here?

Any offer whose advertised price is below the MAP price you set for that product. The shortfall is reported in both dollars and percent, and graded minor, moderate or severe so you can triage.

#### How do you avoid false MAP violations?

Every candidate listing is checked by an AI model against your reference product and must match on brand, model and variant. Bundles, accessories, different variants and refurbished or open-box units are explicitly excluded. If that check cannot run for a marketplace, that marketplace reports nothing rather than a guess.

#### Which AI model should I pick?

The default, **GPT-4o mini**, was chosen by benchmarking candidates against real eBay result sets. It was the most precise at rejecting listings that are not your exact product, which is what keeps false violations out of your enforcement list. Cheaper models let noticeably more junk through, and a false violation is worse than a missed one.

#### Can it identify unauthorized sellers?

Yes, where the marketplace discloses the seller on its search page. Supply your authorized reseller list and any other named seller is flagged. Sellers that are not disclosed are left blank rather than accused.

#### How is this different from enterprise MAP software?

Same core job, without the $300 to $2,000 monthly floor, the multi-month contract, the onboarding call or the catalogue upload. You pay per check and per violation found, and you can run it once to see if you have a problem at all.

#### Does it monitor Amazon and eBay?

Yes, and that matters: those are where most MAP erosion actually happens, and several cheaper MAP tools cover only first-party retailers and miss them entirely.

#### Why are all my results empty with an "AI access unavailable" error?

Your Apify plan cannot start the public Actor that provides the built-in AI matching. Either upgrade your Apify plan, or fill the **OpenRouter API key** input to use your own OpenRouter account. Without one of the two, no offer can be verified and nothing can be flagged.

#### Can I run this on a schedule?

Yes. Use Apify's scheduler for daily or weekly runs and connect a webhook or integration to push new violations into Slack, Sheets, or your enforcement system.

#### Can an AI agent call this Actor?

Yes. It is callable from any AI agent through the Apify MCP server, with published input and output schemas so an agent can use it without documentation.

#### Is monitoring competitor and reseller prices legal?

This Actor collects only publicly available listing data, with no login and no personal information. Collecting public price data is generally considered legal, and MAP policies themselves are a matter of your own agreements. You are responsible for how you use the data and should seek your own legal advice.

### Support

Found a bug or a marketplace that stopped parsing? Open a ticket on the **Issues** tab.

💼 Need more marketplaces, a different violation rule, or an integration into your enforcement system? Email **youssefarhan24@gmail.com**
🌐 Got a site you want monitored? [Suggest it here](https://automationbyexperts.com/apify)
⚡ [Upgrade your Apify plan](https://apify.com/pricing?fpr=youssef) to monitor your full catalogue.

# Actor input Schema

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

One product per line, as IDENTIFIER, MAP\_PRICE. The identifier can be an Amazon ASIN, a UPC or EAN, a model number or the product name. Example: B0DGHMNQ5Z, 129.99. Paste straight from a spreadsheet. A line with no price falls back to the default MAP price below.

## `defaultMapPrice` (type: `integer`):

Used for any product line that does not carry its own price. Leave empty when every line has one. Products with neither are still checked, but nothing can be flagged for them.

## `authorizedSellers` (type: `array`):

Your approved reseller names, one per line. Any offer from a seller not on this list is flagged as unauthorized. Sellers the marketplace does not disclose are left blank rather than accused.

## `onlyViolations` (type: `boolean`):

Return only offers priced below MAP. Turn this off to get the full picture of every offer found, compliant ones included.

## `marketplaces` (type: `array`):

Which marketplaces to search for offers on your products.

## `model` (type: `string`):

The model that verifies each offer is your exact product, so a cheaper accessory or a different variant is never reported as a violation. The cheap fast models are plenty; the price shown is per million tokens.

## `zipCode` (type: `string`):

Delivery ZIP used for Amazon pricing. Amazon advertises different prices by location, so set this to the market your MAP policy covers.

## `concurrency` (type: `integer`):

How many products to check at once. Raise it for large catalogues; lower it if marketplaces start refusing requests.

## `openrouterApiKey` (type: `string`):

Optional. Bring your own OpenRouter key and calls go straight to OpenRouter, billed by them on your own OpenRouter account instead of through Apify. Leave empty to use the built-in access, which needs no key at all.

## `apifyToken` (type: `string`):

Optional. Only needed when running this Actor outside the Apify platform. On the platform it is supplied automatically.

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

Optional override. Paid runs already include a US residential network and need nothing here. Free runs use Apify Proxy residential on your own account.

## Actor input object example

```json
{
  "products": [
    "B0DGHMNQ5Z, 129.99",
    "Sony WH-1000XM5, 349.99"
  ],
  "onlyViolations": false,
  "marketplaces": [
    "Amazon",
    "eBay",
    "BestBuy",
    "Newegg"
  ],
  "model": "openai/gpt-4o-mini",
  "zipCode": "10001",
  "concurrency": 5,
  "proxyConfiguration": {}
}
```

# Actor output Schema

## `violations` (type: `string`):

Every verified offer for your products, with its shortfall against MAP, graded severity, seller and a direct link to the listing as evidence. Switch between the MAP violations and Sellers views in the table.

# 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 = {
    "products": [
        "B0DGHMNQ5Z, 129.99",
        "Sony WH-1000XM5, 349.99"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/map-violation-monitor").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 = { "products": [
        "B0DGHMNQ5Z, 129.99",
        "Sony WH-1000XM5, 349.99",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/map-violation-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "products": [
    "B0DGHMNQ5Z, 129.99",
    "Sony WH-1000XM5, 349.99"
  ]
}' |
apify call fayoussef/map-violation-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fayoussef/map-violation-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PUGrW77yo27qumcEJ/builds/zPiHhJ6EGf6F8wXLK/openapi.json
