# Etsy Shop Reviews Scraper (`reviewly/etsy-shop-reviews-scraper`) Actor

Scrapes all reviews from any Etsy shop. Extracts rating, review text, date, reviewer, buyer photos, and the reviewed listing — with automatic bot detection bypass.

- **URL**: https://apify.com/reviewly/etsy-shop-reviews-scraper.md
- **Developed by:** [Reviewly](https://apify.com/reviewly) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Etsy Shop Reviews Scraper — Export Every Etsy Review to JSON, CSV & Excel

**Scrape all reviews from any Etsy shop in minutes — ratings, review text, dates, reviewer names, buyer photos, and the exact product reviewed — with automatic anti-bot bypass built in.**

Point it at an Etsy shop URL, press **Start**, and get clean, structured review data ready for analysis, dashboards, or monitoring. No code required.

- ✅ **Every review, not just page one** — full pagination, no 5-page limit
- ✅ **Rich shop profile** — sales count, admirers, Star Seller status, location & rating
- ✅ **Built-in bot-wall bypass** — clears Etsy's DataDome protection automatically
- ✅ **Incremental updates** — scrape only reviews newer than your last run
- ✅ **Clean exports** — JSON, CSV, Excel, or API — one click

---

### 📌 What This Actor Does

The **Etsy Shop Reviews Scraper** is an [Apify Actor](https://apify.com/actors) that collects the complete review history of any Etsy shop and turns it into structured data you can actually use.

Etsy doesn't offer a public API for shop reviews, and its pages are protected by anti-bot technology that blocks ordinary scrapers. This Actor handles all of that for you: it clears the protection, walks through every page of reviews, and returns a clean dataset — no proxies to configure by hand, no CAPTCHAs to solve, no code to write.

**Who it's for:**

- **E-commerce sellers & brands** — monitor your own or competitors' reviews and reputation
- **Market researchers & analysts** — mine customer sentiment and product feedback at scale
- **Developers & data teams** — pull Etsy review data into apps, dashboards, or data pipelines
- **Agencies & consultants** — deliver review insights and competitive analysis to clients
- **Dropshippers & product researchers** — validate demand and spot quality issues before you sell

**Real-world examples:** tracking star ratings over time, finding the most-reviewed products in a shop, analyzing what buyers love or complain about, benchmarking competitors, or building an early-warning system for negative reviews.

---

### ✨ Key Features

- **Complete review extraction** — scrapes every review a shop exposes, across all pages
- **Full review detail** — rating, review text, date, reviewer name & profile, and buyer-uploaded photos
- **Product-level linking** — each review is tied to the exact listing it's about (title, URL, image, ID)
- **Seller responses** — captures the shop's public reply when present
- **Shop intelligence** — overall rating, total review count, total sales, admirers, Star Seller badge, location, logo, and description
- **Sort control** — collect reviews newest-first (`Recency`) or by Etsy's "Suggested" order (`Relevancy`)
- **Incremental scraping** — set a target date to grab only new reviews since your last run
- **Automatic anti-bot bypass** — no manual proxy juggling or CAPTCHA solving
- **Multiple shops per run** — queue as many shop URLs as you like
- **Flexible export** — JSON, CSV, Excel, HTML table, or REST API

---

### 🧠 Why This Actor Is Different

Most Etsy scrapers break the moment Etsy shows a bot challenge, or they silently stop after the first page of reviews. This Actor is built differently:

| | This Actor | Typical scrapers |
|---|---|---|
| **Anti-bot handling** | Clears Etsy's DataDome protection automatically | Get blocked with 403 errors |
| **Review coverage** | Every page, every review | Often just the first page |
| **Data quality** | Structured, deduplicated, date-normalized | Raw HTML or messy fields |
| **Shop metadata** | Sales, admirers, Star Seller, location | Reviews only |
| **Maintenance** | Actively maintained parsing & bypass | Break on site changes |

**Reliability first.** The Actor uses a real browser fingerprint to earn access, then a fast HTTP client to page through reviews on the same session — the approach that stays unblocked where plain HTTP scrapers fail. Reviews are **deduplicated automatically** and dates are **normalized to ISO format** (`YYYY-MM-DD`), so your data is clean the moment it lands.

---

### ⚙️ Input Configuration

You can configure everything from the visual input form in the Apify Console — no JSON editing needed. These are the available settings:

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | Array | ✅ Yes | One or more Etsy shop URLs to scrape. Any shop URL variant works. |
| `maxReviews` | Integer | No | Max reviews to collect per shop. `0` = no limit (scrape everything). Default: `0`. |
| `sortOption` | Select | No | `Recency` (newest first, recommended) or `Relevancy` (Etsy's "Suggested" order). Default: `Recency`. |
| `targetDate` | Date | No | Stop when reviews get older than this date (ISO, e.g. `2025-01-01`). Requires `Recency`. |
| `proxyConfiguration` | Object | No | Proxy settings. Residential proxy (US) recommended for large or frequent runs. |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.etsy.com/shop/ClothandFable" }
  ],
  "maxReviews": 0,
  "sortOption": "Recency",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
````

#### Tips for best results

- **Use the plain shop URL** — `https://www.etsy.com/shop/ShopName`. Extra tracking parameters (`?ref=...`) are fine; they're stripped automatically.
- **For incremental runs**, set `targetDate` to your last run's date and keep `sortOption: "Recency"` — you'll only collect new reviews.
- **For large shops or scheduled runs**, enable the **residential proxy** for the most reliable access.
- **To sample quickly**, set `maxReviews` to something small (e.g. `30`) while you test your setup.

***

### 📤 Output Format

The Actor produces **one dataset record per shop**, containing the shop profile plus a `reviews` array. Export it as JSON, CSV, Excel, or pull it via the API.

#### Sample output

```json
{
  "name": "ClothandFable",
  "shopName": "ClothandFable",
  "shopUrl": "https://www.etsy.com/shop/ClothandFable",
  "rating": 5,
  "reviewCount": 391,
  "salesCount": 2258,
  "admirersCount": 407,
  "isStarSeller": true,
  "location": "Utah, United States",
  "description": "Shop Handmade, patterns, kits & fashion for modern creatives by ClothandFable.",
  "slogan": "Handmade, patterns, kits & fashion for modern creatives",
  "logoUrl": "https://i.etsystatic.com/61239456/r/isla/fdfed7/79486511/isla_500x500.jpg",
  "shopId": 61239456,
  "reviews": [
    {
      "reviewId": "5113732307",
      "reviewerName": "Anna",
      "reviewerProfileUrl": "https://www.etsy.com/people/jawu26mxmqxo8mlj?ref=shop_review",
      "date": "2026-07-02",
      "dateText": "Jul 2, 2026",
      "rating": 5,
      "reviewBody": "The towel was beautifully embroidered and packaged with care. It was the perfect wedding gift.",
      "photos": [
        "https://i.etsystatic.com/iap/a9b7c5/8206180908/iap_300x300.jpg"
      ],
      "listing": {
        "listingId": 4401893715,
        "title": "Personalized Monogram Ruffled Tea Towel with Scalloped Edge",
        "url": "https://www.etsy.com/listing/4401893715/personalized-monogram-ruffled-tea-towel",
        "image": "https://i.etsystatic.com/7643683563/r/il/bd3d3c/7643683563/il_170x135.jpg"
      },
      "sellerResponse": null
    }
  ]
}
```

#### Field reference

**Shop-level fields**

| Field | Description |
|---|---|
| `name` / `shopName` | The shop's name |
| `shopUrl` | Canonical shop URL |
| `rating` | Average review rating (0–5) |
| `reviewCount` | Total number of reviews the shop reports |
| `salesCount` | Total lifetime sales |
| `admirersCount` | Number of users who favorited the shop |
| `isStarSeller` | `true` if the shop holds Etsy's Star Seller badge |
| `location` | Shop location as listed on Etsy |
| `description` / `slogan` | Shop's description and tagline |
| `logoUrl` | Shop logo image URL |
| `shopId` | Etsy's internal shop ID |

**Per-review fields (in `reviews[]`)**

| Field | Description |
|---|---|
| `reviewId` | Unique Etsy review ID |
| `reviewerName` | Buyer's display name (or `"Etsy buyer"` if anonymous) |
| `reviewerProfileUrl` | Link to the buyer's profile (`null` if anonymous) |
| `date` | Review date, normalized to `YYYY-MM-DD` |
| `dateText` | Original date text as shown on Etsy |
| `rating` | Star rating for this review (1–5) |
| `reviewBody` | The review text |
| `photos` | Array of buyer-uploaded photo URLs (empty if none) |
| `listing` | The reviewed product: `listingId`, `title`, `url`, `image` |
| `sellerResponse` | The shop's public reply, if any (`null` otherwise) |

> **Tip:** For one row *per review* instead of per shop, export as **JSON** and flatten the `reviews` array in your own tooling, or use Apify's dataset transformation. CSV/Excel will expand nested fields into columns like `reviews/0/reviewerName`.

***

### ▶️ How to Use

Getting started takes under a minute:

1. **Open the Actor** in the Apify Console and click **Try for free**.
2. **Paste one or more Etsy shop URLs** into the **Shop URLs** field
   (e.g. `https://www.etsy.com/shop/ClothandFable`).
3. *(Optional)* Set **Max reviews**, choose a **sort order**, or add a **target date** for incremental runs.
4. *(Recommended for big runs)* Turn on the **residential proxy**.
5. Click **Start** ▶️.
6. When the run finishes, open the **Dataset** tab and **export** to JSON, CSV, or Excel — or grab the data via the API.

#### Common workflows

- **One-time export:** paste a shop URL, leave defaults, run, download.
- **Competitor monitoring:** add several competitor shops to `startUrls` and schedule the Actor to run weekly.
- **Incremental sync:** run on a schedule with `targetDate` set to your previous run date to capture only new reviews.

***

### 📈 Use Cases

1. **Reputation monitoring** — Track your shop's ratings and catch negative reviews early so you can respond fast.
2. **Competitor analysis** — Scrape competing shops to see what buyers praise or complain about and find gaps to exploit.
3. **Product research** — Validate demand and quality by analyzing which products get the most (and best) reviews before you launch or resell.
4. **Customer sentiment analysis** — Feed thousands of reviews into your NLP or AI tools to surface trends, themes, and pain points.
5. **Market & academic research** — Build datasets of real customer feedback across many Etsy shops for reports, studies, or dashboards.

***

### 🛠️ Advanced Tips

- **Proxies:** For occasional small runs you can often run without a proxy. For **large shops, scheduled runs, or many shops at once**, enable the **Apify Residential proxy (US)** for the most stable access.
- **Run timeout:** Clearing the anti-bot check takes time on the first request. Keep the run timeout at **900 seconds or higher** so large shops finish comfortably.
- **Scaling to many shops:** Add all shop URLs to `startUrls` in a single run rather than launching many tiny runs — it's more efficient and easier to manage.
- **Scheduling:** Use Apify **Schedules** to run the Actor daily or weekly for always-fresh review data.
- **Integrations:** Push results to Google Sheets, Slack, webhooks, or your database using Apify **Integrations** — no glue code required.

***

### ❓ FAQ & Troubleshooting

**Is scraping Etsy reviews legal?**
This Actor collects **publicly available** review data. As with any web scraping, you're responsible for how you use the data — respect Etsy's terms, applicable laws, and privacy regulations (e.g. GDPR). Don't use the data to spam or harass.

**The run returns 0 reviews. What's wrong?**
Usually the shop URL is incorrect or the shop has no reviews. Double-check the URL format (`https://www.etsy.com/shop/ShopName`). If it persists, enable the residential proxy and try again — a particular IP may have been temporarily blocked.

**Why is a reviewer named "Etsy buyer"?**
Some buyers leave reviews anonymously. In those cases Etsy shows "Etsy buyer" and there's no profile link, so `reviewerProfileUrl` is `null`. This is expected.

**Can I get only new reviews since my last run?**
Yes. Set `sortOption` to `Recency` and `targetDate` to the date of your last run. The Actor stops as soon as it reaches older reviews.

**How many reviews can it scrape?**
As many as the shop publicly exposes. Use `maxReviews` to cap it if you only need a sample.

**Do I need a proxy?**
Not always, but it's **strongly recommended** for large or frequent runs to keep access reliable.

**Why does the date look slightly different from Etsy?**
The `date` field is normalized to ISO `YYYY-MM-DD` for easy sorting and filtering. The original text is preserved in `dateText`.

***

### 📞 Support

Questions, feature requests, or found a bug? I'm happy to help.

- **Issues & feedback:** use the **Issues** tab on the Actor's page in the Apify Console
- **Direct contact:** <me@ahmedhrid.com>

If you're reporting a problem, please include your **input configuration** and the **run ID** so I can diagnose it quickly.

***

*Keywords: Etsy scraper, Etsy reviews scraper, Etsy shop reviews, web scraping, Apify actor, Etsy data extraction, e-commerce review scraping, customer review scraper, Etsy API alternative, scrape Etsy reviews to CSV.*

# Actor input Schema

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

Etsy shop URLs to scrape reviews from. Accepts any shop URL variant, e.g. https://www.etsy.com/shop/RumorGoods (with or without ?ref=… or /reviews).

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape per shop URL. 0 means no limit (scrape every review the shop exposes).

## `sortOption` (type: `string`):

How Etsy sorts the reviews being paged. 'Recency' (newest first) is recommended and required for the Target date cutoff to work; 'Relevancy' matches Etsy's default 'Suggested' order.

## `targetDate` (type: `string`):

Stop scraping reviews older than this date (ISO 8601, e.g. 2025-01-01). Requires sort order 'Recency'. Useful for incremental runs — set to the date of your last run to collect only new reviews.

## `proxyConfiguration` (type: `object`):

Residential proxy is strongly recommended — the same session is shared between the DataDome-bypass browser and all subsequent review fetches, so the clearance cookie stays bound to one exit IP.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.etsy.com/shop/RumorGoods"
    }
  ],
  "maxReviews": 0,
  "sortOption": "Recency",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Each record contains shop info (name, shopName, shopUrl, rating, reviewCount, salesCount, admirersCount, isStarSeller, location, description, slogan, logoUrl, shopId) and a reviews array; each review has reviewId, reviewerName, reviewerProfileUrl, date, rating, reviewBody, photos, the reviewed listing (id, title, url, image), and any sellerResponse.

# 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.etsy.com/shop/RumorGoods"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reviewly/etsy-shop-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.etsy.com/shop/RumorGoods" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reviewly/etsy-shop-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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.etsy.com/shop/RumorGoods"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call reviewly/etsy-shop-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=reviewly/etsy-shop-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Etsy Shop Reviews Scraper",
        "description": "Scrapes all reviews from any Etsy shop. Extracts rating, review text, date, reviewer, buyer photos, and the reviewed listing — with automatic bot detection bypass.",
        "version": "0.0",
        "x-build-id": "vADNk1mWFuhIovaNH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/reviewly~etsy-shop-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-reviewly-etsy-shop-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/reviewly~etsy-shop-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-reviewly-etsy-shop-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/reviewly~etsy-shop-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-reviewly-etsy-shop-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Shop URLs",
                        "type": "array",
                        "description": "Etsy shop URLs to scrape reviews from. Accepts any shop URL variant, e.g. https://www.etsy.com/shop/RumorGoods (with or without ?ref=… or /reviews).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxReviews": {
                        "title": "Max reviews per shop",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per shop URL. 0 means no limit (scrape every review the shop exposes).",
                        "default": 0
                    },
                    "sortOption": {
                        "title": "Sort order",
                        "enum": [
                            "Recency",
                            "Relevancy"
                        ],
                        "type": "string",
                        "description": "How Etsy sorts the reviews being paged. 'Recency' (newest first) is recommended and required for the Target date cutoff to work; 'Relevancy' matches Etsy's default 'Suggested' order.",
                        "default": "Recency"
                    },
                    "targetDate": {
                        "title": "Target date",
                        "type": "string",
                        "description": "Stop scraping reviews older than this date (ISO 8601, e.g. 2025-01-01). Requires sort order 'Recency'. Useful for incremental runs — set to the date of your last run to collect only new reviews."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy is strongly recommended — the same session is shared between the DataDome-bypass browser and all subsequent review fetches, so the clearance cookie stays bound to one exit IP."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
