# Trusted Shops Reviews Scraper (`memo23/trusted-shops-reviews-scraper`) Actor

Scrape Trusted Shops reviews and shop ratings — review text, stars, review and order dates, verified-purchase status and merchant replies, plus certification, star distribution, per-criteria marks and lifetime review totals. Enter a shop domain, any locale profile URL, or a TSID.

- **URL**: https://apify.com/memo23/trusted-shops-reviews-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce, Business, Lead generation
- **Stats:** 3 total users, 2 monthly users, 85.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reviews

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?

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

## Trusted Shops Reviews Scraper — Reviews, Ratings & Shop Info

Extract customer reviews and shop rating data from **Trusted Shops** — full review texts, titles, star ratings, review + order dates, shop replies, verified-purchase status, and per-shop rating summaries with star distributions and per-criteria marks (delivery, goods, service). Works with profile URLs from **any Trusted Shops locale** (trustedshops.de, .com, .fr, .nl, .pl, .it, .es, .at, .ch) or with just the shop's own website domain. Export as JSON, CSV, or Excel.

![How the Trusted Shops Reviews Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-trustedshops.png)

### Why use this scraper?

- **Every Trusted Shops locale, one actor** — paste a profile URL from any trustedshops.\* domain (or a bare TSID); the actor auto-routes to the shop's home locale. Europe's largest shop-review pool, covered end to end.
- **Complete review records** — stable review UUID, star rating, title, full text, publication date AND order date (both ISO-formatted), verified-purchase status, the shop's official reply with its date, attachments, the reviewer's platform review count, and — for reviewers with a public profile — their name, city and consumer profile URL.
- **Automatic shop lookup** — skip the URL hunt entirely: list shop website domains (e.g. `outdoor-renner.de`) and each is resolved to its Trusted Shops profile via the platform's official public API.
- **Server-side star filter you don't pay for** — pull only 1–2★ complaints (or only 5★ praise) before scraping. You're never charged for filtered-out reviews.
- **Shop-info mode** — one row per shop with average rating, active + all-time review counts, full star distribution, per-criteria marks (DELIVERY / GOODS / SERVICE), organization name, and membership date. Ideal for monitoring hundreds of shops cheaply.
- **Fast** — reviews come from the platform's own bulk endpoint at 500 per request, not 20 per page load. A 4,500-review merchant is about ten calls; runs finish in seconds, not minutes.
- **Fair charging** — shops not on the platform are skipped and never charged. Exact `maxItems` accounting: you get precisely the number of rows you asked for.

### Overview

Trusted Shops is the trustmark behind the certification seal on a large share of German and EU online retail, and the review site where those merchants' customers rate them. This actor reads both halves of a shop's public profile: the certification and rating summary, and the individual customer reviews behind it.

| | |
|---|---|
| **Entities** | Shops (certified merchants) and their customer reviews |
| **Coverage** | Every Trusted Shops locale — `.de`, `.com`, `.fr`, `.nl`, `.pl`, `.it`, `.es`, `.at`, `.ch` |
| **Lookup** | Shop website domain, profile URL on any locale, or a bare TSID |
| **Filters** | Star rating (1–5), applied server-side before you are charged |
| **Proxy** | Not required |
| **Output** | One row per review, plus an optional summary row per shop |

### How it works

Give the actor a shop domain and it resolves the rest for you:

1. **Domain → shop** via the official Trusted Shops public API, which returns every market variant of the merchant (a single domain can have separate German, Belgian-Dutch and Belgian-French shops, each with its own TSID and rating).
2. **Shop → quality data**, also from the official API: the overall mark, the rolling-12-month review count, the all-time total, and separate marks for delivery, goods and service.
3. **Profile page** for the certification status, star distribution, organization name and website.
4. **Reviews** in bulk from the platform's own reviews endpoint, 500 per request, so a shop with thousands of reviews costs a handful of calls rather than hundreds of page loads.

Skip step 1 by passing profile URLs or TSIDs directly.

### What you can scrape

| Input | Example |
|---|---|
| German profile URL | `https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html` |
| English profile URL | `https://www.trustedshops.com/buyerrating/info_X8B4BF6371C245F95B3BD70755FE286F2.html` |
| Any other locale URL | `trustedshops.fr/evaluation/…`, `.nl`, `.pl`, `.it`, `.es`, `.at`, `.ch` |
| Bare TSID | `X8B4BF6371C245F95B3BD70755FE286F2` |
| Shop website domain | `outdoor-renner.de` — resolved automatically via the official lookup API |

### Use cases

- **Reputation monitoring** — track your own (or competitors') average rating, star distribution, and fresh complaints over time.
- **Complaint mining** — pull only 1–2★ reviews to find operational weak spots, and read how the shop responded (replies included).
- **Market research** — compare rating distributions and per-criteria marks (delivery vs goods vs service) across all shops in a category.
- **E-commerce due diligence** — verified-purchase flags, order-to-review time (orderDate vs reviewDate), and reply behaviour reveal how a shop actually operates.
- **AI / NLP pipelines** — clean, deduplicated review texts with titles, dates, and ratings, ready for sentiment analysis.

### Input configuration

Example — all 1–2 star reviews for one shop, with the shop summary row included:

```json
{
    "mode": "reviews",
    "shopDomains": ["outdoor-renner.de"],
    "starRatings": ["1", "2"],
    "includeShopInfo": true,
    "maxItems": 500
}
```

Example — rating summaries for a portfolio of shops:

```json
{
    "mode": "shop",
    "startUrls": [
        { "url": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html" }
    ],
    "shopDomains": ["shop-two.de", "shop-three.com"]
}
```

| Field | Type | Description |
|---|---|---|
| `mode` | string | `reviews` (default) — full review data. `shop` — one rating-summary row per shop. |
| `startUrls` | array | Profile URLs on any trustedshops.\* locale, or bare TSIDs. |
| `shopDomains` | array | Shop website domains to look up (alternative to URLs). |
| `starRatings` | array | Only reviews with these ratings (1–5). Server-side. |
| `includeShopInfo` | boolean | Reviews mode: also push one shop-info row per shop. |
| `maxItems` | integer | Maximum rows returned (default 1000). |
| `maxConcurrency` | integer | Parallel page fetches per shop (1–10, default 5). |

### Output overview

The dataset holds two row types, told apart by `rowType`:

| `rowType` | One per | Carries |
|---|---|---|
| `review` | Customer review | Rating, title, text, review + order dates, verified-purchase status, merchant reply, attachments, reviewer details |
| `shop` | Shop | Certification, average rating, star distribution, 12-month and all-time review counts, per-criteria marks, organization, website |

Review rows always carry `shopName`, `tsId` and `profileUrl`, so a multi-shop run stays joinable after export.

### Output samples

Review row:

```json
{
    "rowType": "review",
    "reviewId": "rev-72999306-bdee-4f19-81be-dec9bb636bee",
    "rating": 5,
    "title": "Sehr schöne Regenjacke",
    "text": "Sehr schöne Regenjacke. Zum Glück eine Nummer größer bestellt da sie etwas klein ausfällt...",
    "authorName": "Judith W.",
    "reviewDate": "2026-05-04T16:54:48.000Z",
    "updatedDate": "2026-05-04T16:54:48.000Z",
    "orderDate": "2026-04-24T20:17:16.000Z",
    "verificationStatus": "MEMBER_VERIFIED",
    "isVerified": true,
    "reply": {
        "text": "Danke für dein ausführliches Feedback - und gut, dass du gleich eine Nummer größer bestellt hast...",
        "date": "2026-05-05T09:12:00.000Z"
    },
    "attachmentUrls": [],
    "reviewerTotalReviews": 5,
    "reviewerCity": null,
    "reviewerProfileUrl": "https://www.trstd.com/user/5338d91d-7fc7-4a64-8a25-80e8f9807fc2",
    "inModeration": false,
    "tsId": "X8B4BF6371C245F95B3BD70755FE286F2",
    "shopName": "RennerXXL - Outdoor- und Sportbekleidung in Übergrößen",
    "shopWebsiteUrl": "www.outdoor-renner.de/",
    "profileUrl": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html",
    "page": 1
}
```

Shop row:

```json
{
    "rowType": "shop",
    "tsId": "X8B4BF6371C245F95B3BD70755FE286F2",
    "shopName": "RennerXXL - Outdoor- und Sportbekleidung in Übergrößen",
    "websiteUrl": "www.outdoor-renner.de/",
    "organizationName": "RennerXXL GmbH & Co. KG",
    "memberSince": "2010-04-12",
    "language": "de",
    "targetMarket": "DEU",
    "averageRating": 4.8,
    "activeReviewCount": 2022,
    "ratingDistribution": { "1": 17, "2": 11, "3": 37, "4": 225, "5": 1732 },
    "totalReviewCount": 44301,
    "reviewsCountedSince": "2010-04-12",
    "overallMarkDescription": "EXCELLENT",
    "criteriaRatings": { "DELIVERY": 4.8, "GOODS": 4.8, "SERVICE": 4.8 }
}
```

### Key output fields

- **`reviewId`** — the platform's stable UUID for the review (deduplication-safe across runs).
- **`reviewDate` / `orderDate`** — publication datetime vs the datetime of the underlying purchase, both ISO 8601. The gap between them tells you order-to-review time.
- **`isVerified` / `verificationStatus`** — whether Trusted Shops verified the reviewer (e.g. `MEMBER_VERIFIED`), straight from the platform.
- **`reply`** — the shop's official response (text + date), `null` when the shop hasn't replied.
- **`authorName` / `reviewerCity` / `reviewerProfileUrl`** — present for reviewers who made their Trusted Shops profile public (roughly a quarter of them in sampling); `null` for the rest, who post without a public identity.
- **`ratingDistribution`** — absolute review counts per star band over the active 12-month window.
- **`criteriaRatings`** — the platform's per-criteria marks (DELIVERY, GOODS, SERVICE) from the official API.
- **`activeReviewCount` vs `totalReviewCount`** — reviews in the browsable 12-month window vs all-time total since the shop joined.

### FAQ

**Which Trusted Shops sites are covered?**
All of them — a shop's profile is the same everywhere, and any locale URL (`.de/bewertung`, `.com/buyerrating`, `.fr/evaluation`, `.nl`, `.pl`, `.it`, `.es`, `.at`, `.ch`) auto-routes to the shop's home locale. You can even paste just the TSID.

**How far back do reviews go?**
Trusted Shops only publishes the **active 12-month review window** — the same limit as on the website itself. Older reviews are counted in `totalReviewCount` but are not browsable anywhere, including this scraper. Run the actor periodically (e.g. monthly) to build a complete archive over time.

**Are shop replies included?**
Yes — the shop's official reply text and date ship with every review that has one.

**Why is `authorName` empty on many reviews?**
Trusted Shops only exposes a reviewer's name when that person has made their consumer profile public — about a quarter of reviews in sampling. The website shows "Community Member" for everyone else; this actor returns `null` instead, so you can filter on the field directly rather than string-matching a placeholder. Public reviewers also carry `reviewerCity` and a `reviewerProfileUrl`.

**What about product reviews?**
This actor scrapes **shop-level** reviews (the merchant's overall profile). Product-level review widgets embedded on merchant sites are a different system and out of scope.

**What happens with shops that aren't on the platform?**
They're logged as skipped and you are not charged anything for them.

**How fast is a large shop?**
Reviews are pulled 500 per request from the platform's own endpoint, so a shop with 4,500 reviews takes about ten calls plus one page load. Runs of a few thousand reviews finish in well under a minute.

**Do I need a proxy?**
No. Trusted Shops works without one. A proxy option exists for very large pulls if you ever hit rate limits.

### Support & feature requests

Found an issue or need an extra field? Open an issue on the actor's **Issues** tab in the Apify Console — issues are typically answered within 24 hours.

### Additional services

Need this on a schedule, delivered somewhere specific, or joined with review data from another platform? Apify schedules runs, pushes results to webhooks, S3, Google Sheets or your own API, and keeps every run's dataset addressable over the API. For a custom variant — extra fields, a different row shape, or a bundle across several review platforms — open an issue on the actor and describe the output you want.

### Explore more scrapers

- **[Trustpilot Scraper](https://apify.com/memo23/trustpilot-scraper-ppe)** — the same job on the English-language review platform.
- **[Google Maps Reviews Scraper](https://apify.com/memo23/google-maps-reviews-scraper)** — local business reviews and ratings.
- **[G2 Scraper](https://apify.com/memo23/g2-scraper)** — software product reviews.
- **[Judge.me Reviews Scraper](https://apify.com/memo23/judge-me-reviews-scraper)** — product reviews on Shopify storefronts.
- **[ReclameAQUI Scraper](https://apify.com/memo23/reclameaqui-scraper)** — Brazilian consumer complaints and company reputation.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/trusted-shops-reviews-scraper`).

**Purpose:** Scrape customer reviews and shop rating summaries from Trusted Shops — review text, star rating, review and order dates, verified-purchase status, merchant replies, plus per-shop certification, star distribution, 12-month and all-time review counts, and per-criteria marks.

**Minimal input:**

```json
{ "mode": "reviews", "shopDomains": ["otto-office.com"], "maxItems": 200 }
```

Instead of `shopDomains`, pass `startUrls` with a profile URL on any Trusted Shops locale (`https://www.trustedshops.de/bewertung/info_<TSID>.html`) or a bare TSID. Other fields: `starRatings` (1–5, server-side), `includeShopInfo`, `maxItems`, `maxConcurrency`, `proxy`.

**Output:** two row types keyed by `rowType`. A `review` row carries reviewId, rating, title, text, authorName, reviewDate, updatedDate, orderDate, verificationStatus, isVerified, reply, attachmentUrls, reviewerTotalReviews, reviewerCity, reviewerProfileUrl, inModeration, plus tsId, shopName, shopWebsiteUrl and profileUrl. A `shop` row carries tsId, shopName, websiteUrl, organizationName, description, memberSince, language, targetMarket, averageRating, activeReviewCount, ratingDistribution, totalReviewCount, reviewsCountedSince, overallMarkDescription and criteriaRatings.

**Behaviors an agent should know:**

- Always set `maxItems`; a large merchant can hold thousands of reviews in the browsable window.
- Only the rolling 12-month review window is browsable on the platform, so that is the ceiling for review rows. `totalReviewCount` reports the all-time figure and is frequently much larger — OTTO Office shows 4,539 browsable against 105,570 lifetime. Do not present `activeReviewCount` as a shop's total.
- One domain can resolve to several shops, one per market (German, Belgian-Dutch, Belgian-French). The first match is used; pass a TSID to pin a specific market.
- `starRatings` filters server-side, so filtered-out reviews are never fetched or charged.
- `authorName`, `reviewerCity` and `reviewerProfileUrl` are `null` unless the reviewer made their profile public — roughly a quarter of reviews.
- Domains that are not Trusted Shops members return nothing and are not charged. A small number of domains resolve to internal test records with zero reviews.
- No proxy is required.
- Pay-per-event billing — see the Pricing tab on the actor page.

### ⚠️ Disclaimer

This actor only collects publicly available data that anyone can see by visiting the Trusted Shops review pages. It does not access private data, bypass authentication, or collect personal information beyond what reviewers chose to publish. You are responsible for how you use the data — ensure your use complies with applicable laws (GDPR, CCPA) and the target website's terms of service. This actor is not affiliated with or endorsed by Trusted Shops AG or eTrusted.

### SEO Keywords

trusted shops scraper, trusted shops reviews scraper, trustedshops.de scraper, scrape trusted shops reviews, trusted shops API, trusted shops bewertungen scraper, shop review scraper, e-commerce review scraper, German review platform scraper, trusted shops rating export, verified purchase reviews, shop reputation data, review monitoring tool, customer feedback scraper, star rating scraper, trustmark shop reviews

# Actor input Schema

## `mode` (type: `string`):

Reviews: full review texts with ratings, titles, dates, shop replies, and verification status. Shop info: one summary row per shop (average rating, review counts, star distribution, per-criteria marks) — no review pagination.

## `startUrls` (type: `array`):

Trusted Shops review-profile pages on any locale domain — German: trustedshops.de/bewertung/info\_{TSID}.html, English: trustedshops.com/buyerrating/info\_{TSID}.html, French: trustedshops.fr/evaluation/info\_{TSID}.html. Bare TSIDs (X + 32 hex chars) also work.

## `shopDomains` (type: `array`):

Alternative to URLs: the shop's own website domain, e.g. outdoor-renner.de. Each is resolved to its Trusted Shops profile via the public lookup API. Shops not on the platform are skipped and never charged.

## `starRatings` (type: `array`):

Reviews mode: only return reviews with these star ratings. Applied server-side, so you never pay for filtered-out reviews. Empty = all ratings.

## `includeShopInfo` (type: `boolean`):

Reviews mode: additionally push one shop-info row per shop (average rating, active + all-time review counts, star distribution, per-criteria marks).

## `maxItems` (type: `integer`):

Maximum rows to return (reviews and/or shop rows). You are only charged for rows actually pushed.

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

Parallel review-page fetches per shop. Keep moderate to stay polite.

## `proxy` (type: `object`):

Optional. Trusted Shops works without a proxy. Only set this if you hit rate limits on very large pulls.

## Actor input object example

```json
{
  "mode": "reviews",
  "startUrls": [
    {
      "url": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html"
    }
  ],
  "includeShopInfo": false,
  "maxItems": 100,
  "maxConcurrency": 5
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html"
        }
    ],
    "maxItems": 100,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/trusted-shops-reviews-scraper").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 = {
    "startUrls": [{ "url": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html" }],
    "maxItems": 100,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/trusted-shops-reviews-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html"
    }
  ],
  "maxItems": 100,
  "maxConcurrency": 5
}' |
apify call memo23/trusted-shops-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/trusted-shops-reviews-scraper"
        }
    }
}

```

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/zihefoCIgS4J0DIJb/builds/WMjyWehFlENGKo6A0/openapi.json
