# Shop Compliance Check: Impressum, Widerruf, Grundpreis (`alpine-data/shop-compliance-check`) Actor

No-code shop compliance checker for German and Austrian online shops: paste shop URLs, get Impressum, Widerrufsbelehrung, privacy, terms, cookie banner and unit prices (Grundpreis) as Excel. Not legal advice.

- **URL**: https://apify.com/alpine-data/shop-compliance-check.md
- **Developed by:** [Alpine Data Labs](https://apify.com/alpine-data) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 shop checkeds

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

## German online shop compliance check: Impressum, Widerruf, Datenschutz, Grundpreis

Check a **German or Austrian online shop** for the pages and signals that most often lead to an **Abmahnung**: **Impressum**, **Widerrufsbelehrung** (withdrawal), **Datenschutz** (privacy), **AGB** (terms), a **cookie banner**, and the **Grundpreis** (unit price, €/kg or €/l) on product pages. No code. Paste the website, click **Start**, download **Excel**. The same fields work in the API.

This is a **signal check of public pages**, not a legal opinion and not a guarantee that a shop is compliant.

### How to check a shop in 4 steps (no code)

1. Paste one or more shop websites. The form is already filled with `alternate.de`.
2. Click **Start**. A single shop usually takes under a minute.
3. Open **Output** and click **Export** for **Excel** or **CSV**.
4. Optional: switch on **Only shops whose result changed** and add a weekly **Schedule**. Unchanged shops are free. Send the dataset to email, Slack, Google Sheets, Make, Zapier or n8n under **Integrations**.

### What one row looks like

| Shop | OK | Issues |
|---|---|---|
| https://www.alternate.de | false | Impressum is missing: … ; Unit price (Grundpreis) not found on 2 of 3 sampled product pages |

`issues` is empty when every signal was found. Each row also has the page URLs and yes/no columns for email, phone, legal form, register number (HRB, HRA, FN), VAT ID (USt-IdNr. or UID) and a postal address.

### Auf Deutsch

Der Actor prüft öffentliche Seiten eines Onlineshops auf **Impressum**, **Widerrufsbelehrung**, **Datenschutz**, **AGB**, einen **Cookie-Hinweis** und den **Grundpreis** auf einigen Produktseiten. Das Ergebnis ist eine Excel-Tabelle mit dem, was fehlt. Das ist **keine Rechtsberatung** und kein Freibrief gegen eine Abmahnung.

### Input fields (form and API use the same names)

| Field | What it does | Example |
|---|---|---|
| **websites** | Shop websites, one per line. API: an array, or one comma-separated string. | `https://www.alternate.de` |
| **maxProductPages** | How many product links to open for the Grundpreis check. | `3` |
| **onlyNew** | Skip shops whose issue text did not change. | `false` |
| **alertName** | Separate memory when you run more than one list. | `de-shops` |

Aliases the API also accepts: `shops`, `urls`, `url`, `domains`, `maxProducts`, `onlyChanges`, `stateKey`.

### Pricing

**$0.02 per shop** that could be opened. A shop that does not resolve is not charged. Shops skipped by **onlyNew** are free. Launch price. SILVER pays 10% less, GOLD and above 20% less. Platform usage is included.

### FAQ

**Is this legal advice?** No. It reads public HTML and reports whether typical signals are present. A lawyer still has to read the text.

**Do I need a login on the shop?** No.

**The unit-price column says no product pages.** The homepage had no links containing `/product`, `/produkt` or `/artikel`. Paste a collection URL, or raise nothing: the other checks still run.

**Can I call it from Make, Zapier or my own code?** Yes. The form fields are the JSON input. See below.

### For developers: API

`POST https://api.apify.com/v2/acts/alpine-data~shop-compliance-check/runs?token=YOUR_TOKEN`

```json
{
  "websites": ["https://www.alternate.de"],
  "maxProductPages": 3,
  "onlyNew": false
}
```

Wait for the run, then `GET` the dataset items. Field names match the form. An empty body runs the pre-filled example.

### Limits

- Up to 50 shops per run, up to 20 product pages each.
- A cookie banner is detected from common tools and phrases (Cookiebot, Usercentrics, OneTrust, "alle akzeptieren"). A custom banner can be missed.
- The Grundpreis check only samples linked product pages. It does not crawl the whole catalogue.
- Private, localhost and non-http addresses are rejected and not charged.

### Related tools from Alpine Data Labs

- [Shopify & WooCommerce Price Monitor](https://apify.com/alpine-data/shop-price-monitor)
- [LUCID packaging register check](https://apify.com/alpine-data/lucid-packaging-register)
- [Product recall monitor](https://apify.com/alpine-data/product-recall-monitor)
- [All tools](https://apify.com/alpine-data)

# Actor input Schema

## `websites` (type: `array`):

One website per line (commas also work). With or without https. API: an array of strings, or one string. Up to 50 shops.

## `maxProductPages` (type: `integer`):

How many product links from the homepage to open and scan for a unit price (€/kg, €/l, Grundpreis). 0 skips that check.

## `onlyNew` (type: `boolean`):

For a weekly schedule. Unchanged shops are skipped and free. API: true or false.

## `alertName` (type: `string`):

Only if you run several different lists. Each name remembers its own 'already seen' results. API field: alertName.

## Actor input object example

```json
{
  "websites": [
    "https://www.alternate.de"
  ],
  "maxProductPages": 3,
  "onlyNew": false
}
```

# Actor output Schema

## `shops` (type: `string`):

Impressum, withdrawal, privacy, terms, cookie banner and unit-price signals.

# 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 = {
    "websites": [
        "https://www.alternate.de"
    ],
    "maxProductPages": 3,
    "alertName": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("alpine-data/shop-compliance-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 = {
    "websites": ["https://www.alternate.de"],
    "maxProductPages": 3,
    "alertName": "",
}

# Run the Actor and wait for it to finish
run = client.actor("alpine-data/shop-compliance-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 '{
  "websites": [
    "https://www.alternate.de"
  ],
  "maxProductPages": 3,
  "alertName": ""
}' |
apify call alpine-data/shop-compliance-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alpine-data/shop-compliance-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/dJvnn42amiRuphIAc/builds/MXt9kKiAgg93YwtHP/openapi.json
