Minimum Advertised Price Monitoring with Mrscraper
Article

Minimum Advertised Price Monitoring with Mrscraper

Article

Learn how to automate Minimum Advertised Price (MAP) monitoring using Mrscraper. Detect pricing violations at scale with Python-based scraping, price normalization, and scheduled compliance checks.

In the digital era, price competition among online sellers has become increasingly intense. Many brands implement a Minimum Advertised Price (MAP) policy to protect product value, maintain profit margins, and ensure consistent pricing across the market.

However, manually monitoring hundreds or even thousands of product pages is clearly inefficient.

This is where MAP Monitoring plays a critical role, and Mrscraper can serve as an effective automation solution.

What Is Minimum Advertised Price (MAP)?

Minimum Advertised Price (MAP) is the lowest price that resellers or retailers are allowed to advertise publicly, whether on websites, marketplaces, or digital advertisements.

The primary objectives of MAP include:

  • Preserving brand image and perceived value
  • Preventing price wars among resellers
  • Stabilizing profit margins
  • Promoting healthy and fair competition

It is important to note that MAP does not represent the final selling price, but rather the price that is publicly displayed to consumers.

Role of Mrscraper

Mrscraper acts as the scraping engine with the following capabilities:

  • Fetching public product pages
  • Supporting JavaScript-rendered content
  • Handling dynamic pricing
  • Extracting structured data using flexible selectors

With Mrscraper, there is no need to manually manage browser automation, proxy rotation, or anti-bot mechanisms.

Technical Flow of MAP Monitoring

  1. A scheduler triggers the monitoring job
  2. Mrscraper fetches the product page
  3. The system extracts the advertised price
  4. The price is normalized into a numeric value
  5. The price is compared against the MAP value
  6. If a violation is detected, an alert is triggered

Python Implementation Example

Dependencies

pip install requests python-dotenv

The requests library is used to send HTTP requests to the Mrscraper API, while python-dotenv allows sensitive configuration such as API keys to be stored securely in environment variables.

Environment Variables

The API key is stored as an environment variable to avoid hardcoding sensitive credentials and to support safer deployment in different environments.

Mrscraper Client

import os
import requests

MRSCRAPER_API_KEY = os.getenv("MRSCRAPER_API_KEY")
MRSCRAPER_ENDPOINT = "https://api.mrscraper.com/v1/scrape"

class MrscraperClient:
    def scrape(self, url: str, extract_rules: dict):
        payload = {
            "url": url,
            "render_js": True,
            "extract_rules": extract_rules
        }

        headers = {
            "Authorization": f"Bearer {MRSCRAPER_API_KEY}",
            "Content-Type": "application/json"
        }

        response = requests.post(
            MRSCRAPER_ENDPOINT,
            json=payload,
            headers=headers,
            timeout=60
        )

        response.raise_for_status()
        return response.json()

The MrscraperClient class acts as an abstraction layer between the application and the Mrscraper API.

It encapsulates all scraping-related logic, including JavaScript rendering and structured data extraction. By centralizing this functionality, the code becomes more modular, reusable, and easier to maintain or test.

Price Normalization

def extract_price(scrape_result: dict) -> float | None:
    try:
        raw_price = scrape_result["data"]["price"]
        normalized = (
            raw_price
            .replace("Rp", "")
            .replace(".", "")
            .replace(",", "")
            .strip()
        )
        return float(normalized)
    except Exception:
        return None

The extract_price function converts raw price strings into numeric values.

Product prices often include currency symbols, thousands separators, or locale-specific formatting. Normalizing the price ensures accurate comparisons against the predefined MAP value.

The function safely returns None when parsing fails, allowing the system to handle errors gracefully.

MAP Monitoring Logic

from datetime import datetime

class MAPMonitor:
    def __init__(self, client: MrscraperClient):
        self.client = client

    def check_price(self, product_name: str, product_url: str, map_price: float):
        extract_rules = {
            "price": {
                "selector": ".product-price, .price, [data-price]",
                "type": "text"
            }
        }

        result = self.client.scrape(product_url, extract_rules)
        price = extract_price(result)

        if price is None:
            return {
                "product": product_name,
                "status": "PRICE_NOT_FOUND",
                "checked_at": datetime.utcnow().isoformat()
            }

        return {
            "product": product_name,
            "scraped_price": price,
            "map_price": map_price,
            "violation": price < map_price,
            "checked_at": datetime.utcnow().isoformat()
        }

The MAPMonitor class contains the core business logic for MAP Monitoring.

It coordinates the scraping process, price normalization, and comparison against the defined MAP threshold. Separating this logic from the scraping client improves clarity and supports easier future extensions.

Main Execution

if __name__ == "__main__":
    client = MrscraperClient()
    monitor = MAPMonitor(client)

    product = {
        "name": "Wireless Headphone XYZ",
        "url": "https://example.com/product/xyz",
        "map_price": 1_000_000
    }

    result = monitor.check_price(
        product_name=product["name"],
        product_url=product["url"],
        map_price=product["map_price"]
    )

    if result.get("violation"):
        send_alert(result)
    else:
        print("✅ Price compliant")

This section serves as the application’s entry point and demonstrates how all components are connected.

It can easily be extended to support multiple products, batch processing, or integration with alerting and reporting systems.

Scheduling

*/10 * * * * python map_monitor.py

A cron job runs the MAP Monitoring script automatically at regular intervals.

Scheduled execution ensures continuous enforcement of MAP compliance without manual intervention. The monitoring frequency can be adjusted based on product volume and violation risk.

Conclusion

Minimum Advertised Price (MAP) Monitoring is a critical practice for brands operating in highly competitive digital marketplaces. As online sellers continuously adjust prices, relying on manual checks is no longer practical or reliable.

By leveraging Mrscraper as the scraping engine, MAP Monitoring becomes significantly more efficient and resilient. Mrscraper’s ability to handle JavaScript-rendered pages, dynamic pricing, and structured data extraction allows brands to monitor advertised prices exactly as consumers see them.

Combined with a Python-based monitoring workflow, this approach provides a scalable foundation for enforcing MAP policies consistently, efficiently, and at scale in an increasingly dynamic digital market.

Table of Contents

    Take a Taste of Easy Scraping!