# Webshop EU Consumer Law Checker (Impressum, Withdrawal, ODR) (`mrdexter4/webshop-consumer-law-checker`) Actor

Check webshops for the information EU consumer law asks for: trader identity (address, email, phone, KvK/Handelsregister, VAT ID), 14-day withdrawal info, the new withdrawal button, outdated ODR link, delivery costs, VAT-inclusive prices. NL/DE/FR/EN. Pay per shop.

- **URL**: https://apify.com/mrdexter4/webshop-consumer-law-checker.md
- **Developed by:** [Mateus Correia](https://apify.com/mrdexter4) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $35.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Webshop EU Consumer Law Checker do?

**Webshop EU Consumer Law Checker** scans a webshop's homepage and legal pages (contact/imprint, terms, returns, shipping, privacy) and checks whether the information **EU consumer law** asks for is visible:

- 🏢 **Trader identity:** geographic address, email address, telephone number, trade register number (KvK, Handelsregister, SIREN, KBO, …), VAT ID
- ↩️ **Right of withdrawal:** the 14-day withdrawal period and the model withdrawal form
- 🔘 **Online withdrawal function:** the "withdraw from contract here" button that EU webshops need since June 2026 ("hier de overeenkomst herroepen", "Vertrag widerrufen", « renoncer au contrat ici »)
- 🗑️ **Outdated ODR link:** links to the EU Online Dispute Resolution platform, which closed in July 2025
- 🚚 **Delivery costs and times** before ordering
- 💶 **Prices including VAT**, and price reductions (the reference price must be the lowest price of the previous 30 days)
- 🧾 **Order button wording** ("order with obligation to pay" / "bestelling met betalingsverplichting" / "zahlungspflichtig bestellen"), if you provide a checkout URL. Generic labels such as "Bestelling plaatsen" or "Weiter" are flagged.
- 🔐 **Privacy notice** available, and terms and conditions linked (optional, reported as info)

It understands Dutch, German, French and English wording, and gives a 0–100 score, a prioritised fix list and an HTML report per shop.

### Who is it for?

- 🛒 **Webshop owners:** a quick check after launching, migrating platforms or rewriting the legal pages.
- 🏢 **E-commerce agencies:** audit all client shops in one run.
- 🤖 **AI agents:** one URL in, structured findings out (works through the Apify MCP server).

### What does it return?

| Field | Description |
|---|---|
| `domain`, `looksLikeShop` | Shop checked; whether it looks like a webshop (non-shops get softer findings) |
| `score`, `failCount`, `warnCount` | 0–100 score and number of findings |
| `emailFound`, `phoneFound`, `addressFound`, `tradeRegisterFound`, `vatIdFound` | Trader identity details detected |
| `withdrawalPeriodMentioned`, `modelWithdrawalForm`, `withdrawalFunctionFound` | Withdrawal information detected |
| `odrLinkFound`, `shippingInfo`, `pricesInclVat` | Other findings |
| `legalPages` | The legal pages that were found and scanned |
| `topFixes` | Plain-language fix list |
| `checks` | Every check with status, finding, suggested fix and legal reference |
| `disclaimer` | Included in every result, so single findings forwarded to others keep their context |

### How to check a webshop

1. Click **Try for free** and enter one or more shop homepages.
2. Optional: add a checkout or order page URL to check the order button wording.
3. Click **Start**. Each shop takes a few seconds.
4. Open the **Overview** table or download `report.html`.

### How much does it cost?

Pay per event: you pay **per shop checked** (see the Pricing tab). Platform usage is included. Shops whose homepage can't be loaded are free. It uses plain HTTP requests (no browser), so runs are fast.

### Limitations

- It reads the **public pages it can find via links on the homepage**. Information shown only inside the checkout, in emails or in PDFs isn't seen.
- Detection uses text patterns. A "warn" means "we couldn't find it automatically, please check", not "it is missing for sure".
- It checks for **information**, not whether the shop actually honours withdrawals or prices correctly.
- A "pass" means **nothing problematic was found**, not that the shop is compliant.
- Most rules apply to **consumer (B2C) sales** only. Sites that don't look like a webshop get softer findings.

### FAQ

**Is this legal advice?** No. It's an automated, indicative check of publicly visible information. Requirements depend on your business, country and products; consult a lawyer for a legal assessment.

**Does it collect personal data?** No. It analyses the shop's own published pages.

Questions or a false result? Open an issue on the **Issues** tab.

# Actor input Schema

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

Homepage URLs or domains, one per line.

## `orderPageUrls` (type: `array`):

Pages that show the final order button, if reachable without logging in. Used to check the order button wording. Matched to shops by domain.

## `maxPagesPerSite` (type: `integer`):

Legal pages fetched per shop (the homepage is extra).

## `generateReport` (type: `boolean`):

Save report.html to the key-value store.

## `maxConcurrency` (type: `integer`):

How many shops to check at the same time.

## `timeoutSecs` (type: `integer`):

Timeout per page request.

## Actor input object example

```json
{
  "websites": [
    "https://www.coolblue.nl"
  ],
  "maxPagesPerSite": 6,
  "generateReport": true,
  "maxConcurrency": 2,
  "timeoutSecs": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `checks` (type: `string`):

No description

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

No description

## `summary` (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 = {
    "websites": [
        "https://www.coolblue.nl"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdexter4/webshop-consumer-law-checker").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.coolblue.nl"] }

# Run the Actor and wait for it to finish
run = client.actor("mrdexter4/webshop-consumer-law-checker").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.coolblue.nl"
  ]
}' |
apify call mrdexter4/webshop-consumer-law-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdexter4/webshop-consumer-law-checker"
        }
    }
}
```

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/pgiWbc5jRl8Sfeshv/builds/1yGf6fmqvCxZyYRct/openapi.json
