# Trusted Shops Scraper \[Only $1💰] | Shop Ratings & Reviews (`ahmed_jasarevic/trustedshops-scraper`) Actor

Extract Trusted Shops merchant reviews and shop ratings for e-commerce reputation monitoring. Get verified customer reviews, overall rating, star distribution, certification status and TSID for any shop — no browser, no proxy, $0.001 per result.

- **URL**: https://apify.com/ahmed\_jasarevic/trustedshops-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.97 / 1,000 results

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

## Trusted Shops Scraper — Extract Verified Customer Reviews & Shop Ratings

Extract **Trusted Shops merchant reviews and shop rating data** from trustedshops.de — Europe's leading trust-mark and review platform — for **e-commerce reputation monitoring**, competitor benchmarking, and trust-signal analysis. Returns the **shop name/domain, TSID, overall rating, star distribution, certification status** and every **customer review** (rating, text, date, verified flag) as clean JSON/CSV/Excel rows — no browser, no proxy, no login.

### Main Use Cases

- **E-commerce reputation monitoring** — track your own or any competitor's Trusted Shops rating, star distribution and certification status over time.
- **Competitive review benchmarking** — bulk-compare merchant trust signals across thousands of German and EU online shops.
- **Building structured shop review datasets** — full review history (text, star rating, order date, verified-purchase flag, merchant replies) for analysis or resale.
- **Trust-signal verification** — check Trusted Shops seal (Käuferschutz / buyer protection) status and certification type for any shop.
- **EU market research** — analyze how German-speaking e-commerce merchants are rated across .de, .at, .ch and other locales.

### How It Works

Give the actor a **shop website domain** (e.g. `outdoor-renner.de`), a **Trusted Shops profile URL**, or a bare **TSID** — it resolves the shop to its Trusted Shops profile via the official public REST API, then reads the profile and reviews. The actor is a lightweight **CheerioCrawler (plain HTTP, no browser)** that parses the React Server Components payload embedded in the public profile page and the internal JSON API the frontend uses for review pagination. Runs cost a fraction of a compute unit, finish in seconds, and need **no proxy** — the endpoints are not Cloudflare-walled.

### Extract Trusted Shops Review Data Without an Official API

Trusted Shops has **no public review API** for third parties: `api.trustedshops.com` exposes only shop-search endpoints, and the official review export lives inside a merchant's own dashboard. This actor fills that gap — it reads the **public profile page** and the **public JSON APIs that page itself uses**, so you get the same data the website shows, structured and ready to analyze.

Input is flexible:

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `shopDomains` | array | No\* | `["outdoor-renner.de"]` | Shop website domains, resolved to their Trusted Shops profile via the official public API |
| `profileUrls` | array | No\* | `[]` | Direct profile URLs (e.g. `https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html`) or bare TSIDs (`X` + 32 hex chars). Skips the lookup step. |
| `maxReviewsPerShop` | integer | No | `50` | Max individual reviews per shop (1–10000) |
| `maxResults` | integer | No | `200` | Overall cap on output rows (shop summary + reviews), 1–100000 |
| `includeShopInfo` | boolean | No | `true` | Also push one shop summary row per shop (overall rating, star distribution, certification, address, contact) |
| `proxy` | object | No | `{"useApifyProxy": false}` | Standard Apify proxy picker. Not required — endpoints are not proxy-walled. |

\* At least one of `shopDomains` or `profileUrls` must be provided.

#### Example input

```json
{
  "shopDomains": ["outdoor-renner.de"],
  "maxReviewsPerShop": 50,
  "maxResults": 200,
  "includeShopInfo": true
}
```

### Understand the Output: Shop Ratings, Star Distribution & Reviews

Two row types, keyed by `recordType`:

**Shop summary row** (`recordType: "shop"`) — one per shop:

```json
{
  "recordType": "shop",
  "tsId": "X8B4BF6371C245F95B3BD70755FE286F2",
  "shopName": "RennerXXL - Outdoor- und Sportbekleidung in Übergrößen",
  "shopDomain": "www.outdoor-renner.de/",
  "overallRating": 4.8,
  "yearlyReviewCount": 1921,
  "allTimeReviewCount": 28614,
  "starDistribution": { "1": 19, "2": 10, "3": 34, "4": 210, "5": 1648 },
  "isCertified": true,
  "certificationType": "CLASSIC",
  "certifiedSince": "2010-08-11T22:00:00.000Z",
  "hasBuyerProtection": true,
  "profileType": "member",
  "language": "de",
  "targetMarket": "DEU",
  "address": { "city": "Buch", "countryCode": "DEU" },
  "contactData": { "phone": "+4987099430146", "email": "service@outdoor-renner.de" }
}
```

**Review row** (`recordType: "review"`) — one per customer review:

```json
{
  "recordType": "review",
  "reviewId": "rev-677a8258-f2e5-4f78-b72c-4e36af338c19",
  "tsId": "X8B4BF6371C245F95B3BD70755FE286F2",
  "shopName": "RennerXXL - Outdoor- und Sportbekleidung in Übergrößen",
  "rating": 5,
  "title": "Super Leistung und Ware!",
  "text": "Die Erläuterungen auf der Webseite zu der Ware und die Tipps zur Bemessung sind wirklich hilfreich...",
  "reviewDate": "2026-09-21T16:18:38.000Z",
  "orderDate": "2026-09-11T14:41:59.000Z",
  "verificationStatus": "MEMBER_VERIFIED",
  "isVerified": true,
  "replyText": null,
  "reviewerCity": null,
  "reviewerTotalReviews": 1
}
```

#### Data fields

| Field | Description |
|---|---|
| `tsId` | Trusted Shops ID (`X` + 32 hex chars) |
| `shopName` / `shopDomain` | Merchant display name and website |
| `overallRating` | Average star rating (grade) |
| `starDistribution` | Count of reviews per star (1–5) |
| `isCertified` / `certificationType` / `certifiedSince` | Trusted Shops seal status |
| `hasBuyerProtection` | Käuferschutz (buyer protection) availability |
| `rating` / `title` / `text` | Review score, headline and body |
| `reviewDate` / `orderDate` | Review and order timestamps |
| `verificationStatus` / `isVerified` | Verified flag (`MEMBER_VERIFIED`, `OPEN_PROFILE_VERIFIED`, `EXTERNAL`) |
| `replyText` / `replyDate` | Merchant reply to the review |

Download the dataset as JSON, CSV, HTML, or Excel, or pull it via the Apify API.

### Integrations & Automation — Schedule Trusted Shops Rating Monitoring

The actor runs on the Apify platform, so you get **API access, scheduling, webhooks, Zapier/Make/n8n integrations**, and monitoring out of the box. For **rating monitoring**, schedule a daily or weekly run (e.g. every Monday 08:00 UTC) so you always have a fresh snapshot of your own or competitors' overall rating, star distribution and certification status. For **review-flow alerting**, hook the dataset to a webhook and pipe new low-rating reviews into Slack or email.

### Related Actors

- [Trusted Shops Reviews Scraper (rainminer)](https://apify.com/rainminer/trustedshops-scraper) — the closest existing Trusted Shops actor on the Store (start-URL-based)
- [Trusted Shops & ProvenExpert Reviews Scraper - German Ratings (kamerozkan)](https://apify.com/kamerozkan/provenexpert-reviews-scraper) — multi-platform German reputation data (ProvenExpert, Trusted Shops, eKomi, Google Maps)
- [Trustpilot Review Scraper (loongge)](https://apify.com/loongge/trustpilot-review-scraper) — the dominant review platform for comparison
- [Google Maps Reviews Scraper](https://apify.com/compass/google-maps-reviews-scraper) — the other main review source for local/German businesses

### FAQ

#### Why use this actor instead of the official Trusted Shops API?

Trusted Shops' public API (`api.trustedshops.com`) covers **shop search and basic profile lookups** but exposes **no review data**; the review export offered to merchants lives in their own dashboard and covers only their own shop. This actor reads the same public profile and review data the website shows — for **any shop**, not just your own — at $0.001 per result (review or shop summary row).

#### What are alternatives to this actor / Trusted Shops data?

Trustpilot, ProvenExpert, eKomi and Google Maps all carry German e-commerce reviews. The kamerozkan actor above covers several at once; this actor is specific to Trusted Shops' own trust-mark data (certification, Käuferschutz, star distribution), which those platforms don't have.

#### Is scraping Trusted Shops legal, and what about GDPR?

This actor only reads publicly available profile pages and public API endpoints — no login bypass, no CAPTCHA solving. The data contains review text and, for most reviews, an anonymized reviewer (names are null for most reviews). You are responsible for complying with Trusted Shops' terms of service and applicable law (e.g. GDPR) when processing review data.

#### What is a Trusted Shops "Käuferschutz" / buyer protection?

Trusted Shops' buyer protection refunds customers if their order goes wrong. The `hasBuyerProtection` field tells you whether a shop offers it — a meaningful trust signal for shoppers evaluating an unfamiliar store.

#### How do I get review data for a shop when I only know its website?

Use `shopDomains` with the website URL — the actor resolves it to the Trusted Shops profile automatically via the official public API. Or paste a profile URL / TSID directly into `profileUrls` to skip the lookup.

#### Known limitations

- The internal reviews API returns the 20 most recent reviews per page in `DESC` order; `sortBy=date` exists but isn't exposed as an input yet.
- Reviewer names are anonymized by Trusted Shops for most reviews.

### For AI Agents & LLM Apps

**Purpose:** Returns Trusted Shops shop summaries and verified customer reviews as JSON rows (two `recordType`s: `shop` and `review`).

**Minimal working input:**

```json
{ "shopDomains": ["outdoor-renner.de"], "maxReviewsPerShop": 50, "maxResults": 200, "includeShopInfo": true }
```

**Variant inputs:**

```json
{ "profileUrls": ["https://www.trustedshops.de/bewertung/info_X8B4BF6371C245F95B3BD70755FE286F2.html"], "maxReviewsPerShop": 20 }
```

**Output fields (per row):** `recordType`, `tsId`, `shopName`, `shopDomain`, `overallRating`, `yearlyReviewCount`, `allTimeReviewCount`, `starDistribution`, `isCertified`, `certificationType`, `certifiedSince`, `hasBuyerProtection`, `reviewId`, `rating`, `title`, `text`, `reviewDate`, `orderDate`, `verificationStatus`, `isVerified`, `replyText`, `reviewerCity`, `reviewerTotalReviews`.

**Behaviors an agent should know:**

- `includeShopInfo: true` pushes one `shop` row per shop **in addition to** review rows — both count against `maxResults` (billed at the same $0.001 per row).
- Provide at least one of `shopDomains` or `profileUrls`; `shopDomains` costs one extra lookup request but finds the TSID for you.
- Verified flag values: `MEMBER_VERIFIED`, `OPEN_PROFILE_VERIFIED`, `EXTERNAL` (`isVerified` is derived from it).
- Billing: pay-per-result — **$0.001 per row** (review or shop row), plus a tiny per-run actor start fee.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Trusted Shops GmbH**. It reads only publicly available Trusted Shops profile pages and public API endpoints — no login bypass, no CAPTCHA solving, no access to merchant dashboards. Users are responsible for their own compliance with Trusted Shops' Terms of Service and applicable data-protection law (e.g. GDPR) when processing review data, which may include personal data of reviewers. Use review data for legitimate analysis only.

### SEO Keywords

trusted shops scraper, trusted shops reviews data, german shop reviews, verified customer reviews, shop rating monitoring, e-commerce reputation monitoring, trust seal certification data, star distribution analysis, trustpilot alternative, trusted shops api alternative, merchant rating comparison, review dataset export, shoppbewertungen, verified purchase reviews, shop trust score, competitor review benchmarking, json csv excel export, buyer protection status, trusted shops gdpr, review scraping without browser

# Actor input Schema

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

Shop website domains to look up on Trusted Shops, e.g. "outdoor-renner.de". Each is resolved to its Trusted Shops profile via the official public API.

## `profileUrls` (type: `array`):

Direct Trusted Shops profile URLs (e.g. https://www.trustedshops.de/bewertung/info\_X8B4BF6371C245F95B3BD70755FE286F2.html) or bare TSIDs (X + 32 hex chars). Use when you already have the exact profile link.

## `maxReviewsPerShop` (type: `integer`):

Maximum number of individual reviews to fetch per shop.

## `maxResults` (type: `integer`):

Overall cap on output rows (shop summary + reviews) across the whole run.

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

Also push one shop summary row per shop (overall rating, star distribution, certification status, address, contact).

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "shopDomains": [
    "outdoor-renner.de"
  ],
  "profileUrls": [],
  "maxReviewsPerShop": 50,
  "maxResults": 200,
  "includeShopInfo": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "shopDomains": [
        "outdoor-renner.de"
    ],
    "profileUrls": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/trustedshops-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 = {
    "shopDomains": ["outdoor-renner.de"],
    "profileUrls": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/trustedshops-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 '{
  "shopDomains": [
    "outdoor-renner.de"
  ],
  "profileUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/trustedshops-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/trustedshops-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/cWG4O4ewyJIP8lJQi/builds/eTwLhPjPbUE4yJOqx/openapi.json
