Updated Oct 2026

Shopware 6 reviews API in Python: Admin API search, replies via comment

Shopware 6 doesn’t have a reviews API as such; it has the Admin API’s generic search over the product_review entity, which is enough to read every review, filter by status and date, and answer: the shop’s reply is simply the review’s comment field, patched in place. This guide does it with requests, following Shopware’s docs and core source as Prisma’s Shopware connector does (in beta, built from the docs). The store-platform picture is on e-commerce reviews API.

Shell
pip install requests

Credentials: an integration (Settings → System → Integrations) with its access key id and secret access key, and the shop’s https address.

1. Token (one hour)

Python
import os, requests

SHOP = "https://shop.example.com"
r = requests.post(f"{SHOP}/api/oauth/token", headers={"Content-Type": "application/json", "Accept": "application/json"},
                  json={"grant_type": "client_credentials", "client_id": os.environ["SW_ACCESS_KEY_ID"], "client_secret": os.environ["SW_SECRET_ACCESS_KEY"]}, timeout=30)
r.raise_for_status()
H = {"Authorization": f"Bearer {r.json()['access_token']}", "Content-Type": "application/json", "Accept": "application/json"}

2. Search visible reviews, newest first

Python
def reviews(since=None, limit=100):
    filt = [{"type": "equals", "field": "status", "value": True}]
    if since:   # updatedAt is null until a review is first changed, so new ones match on createdAt
        gte = {"gte": since}
        filt.append({"type": "multi", "operator": "or", "queries": [{"type": "range", "field": "createdAt", "parameters": gte}, {"type": "range", "field": "updatedAt", "parameters": gte}]})
    page = 1
    while True:
        body = {"page": page, "limit": limit, "filter": filt, "sort": [{"field": "createdAt", "order": "DESC"}], "total-count-mode": 2}
        r = requests.post(f"{SHOP}/api/search/product-review", headers=H, json=body, timeout=30)
        r.raise_for_status()
        rows = r.json().get("data", [])
        yield from rows
        if len(rows) < limit:
            break
        page += 1

for rev in reviews(since="2026-10-01T00:00:00.000Z"):
    print(rev["id"], rev.get("points"), rev.get("externalUser"), rev.get("title"), (rev.get("content") or "")[:80], rev.get("productId"), "| replied" if (rev.get("comment") or "").strip() else "")

Fields: id, productId, title, content, points (1 to 5; round it), externalUser (reviewer name), comment (the shop’s answer), status (visible or not), createdAt, updatedAt. The product’s storefront URL comes from the product entity (/api/product/{id} with its SEO URL) if you need links.

3. Reply, overwrite, clear

Python
rid = rev["id"]
requests.patch(f"{SHOP}/api/product-review/{rid}", headers=H, json={"comment": "Thank you, Laura. The new sizing chart is on the product page."}, timeout=30).raise_for_status()
# the same PATCH overwrites; to remove the answer:
requests.patch(f"{SHOP}/api/product-review/{rid}", headers=H, json={"comment": None}, timeout=30).raise_for_status()

The comment shows under the review on the storefront immediately; the customer isn’t notified by Shopware.

4. The same job through Prisma

Prisma connects a Shopware 6 shop with the integration keys and address (checked before storing, encrypted), reads visible reviews incrementally, keeps the comment as the reply in the same shape as every other platform, publishes replies with the PATCH and reads the review back after a dropped request. One key covers Shopware plus WooCommerce, Wix, Judge.me, Google and 50+ more.

Python
H = {"Authorization": f"Bearer {os.environ['PRISMA_API_KEY']}"}
r = requests.get("https://api.prismareviews.com/v1/reviews", headers=H, params={"platform": "shopware", "has_reply": "false", "limit": 100}, timeout=30)
for rev in r.json()["data"]:
    print(rev["rating"], rev["author"], rev["title"], rev["text"])
requests.post(f"https://api.prismareviews.com/v1/reviews/{rev['id']}/reply", headers=H, json={"text": "Thank you, Laura. The new sizing chart is on the product page."}, timeout=30).raise_for_status()

Shopware is in beta in Prisma, with replies live. Connection fields: Platforms. A test key returns sample reviews so the code runs now.

FAQ

How do I authenticate to the Shopware 6 Admin API?

Create an integration in Settings → System → Integrations and use its access key id and secret access key as client_id and client_secret in POST /api/oauth/token with grant_type client_credentials. The token lasts an hour.

How do replies to Shopware reviews work?

A product review has a comment field that is the shop’s answer, shown under the review on the storefront. PATCH /api/product-review/{id} with comment sets or overwrites it; sending null clears it.

How do I get only reviews changed since my last sync?

Filter on createdAt or updatedAt with a range filter inside a multi/or filter: updatedAt stays null until a review is first changed, so new reviews match on createdAt and edited ones on updatedAt.

Shopware, WooCommerce, Wix and Google, one key.

Get API key

2 locations free. Test keys return sample reviews from every platform.

Get your API key in a minute

Free Spark plan: 2 locations, no card. Test keys return sample data on all 66 platforms, so you can build before connecting a real one.