{
  "data": {
    "id": "3eBuV9sO4ltC6gYLd",
    "actId": "OgPzorRclF6tasDvP",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-10-31T08:17:33.378Z",
    "finishedAt": "2026-10-31T08:18:06.340Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 32908,
      "runTimeSecs": 32.908,
      "computeUnits": 0.03656444444444444,
      "imageSizeBytes": 3211813888
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Amazon Reviews Scraper Input\",\n  \"description\": \"Collect Amazon customer reviews and rating summaries with no login and no proxy setup. The actor reads the product page's inline review block (~8-13 top reviews, retried across desktop and mobile because the wall is probabilistic) and, when `extendedHistory` is on, merges Amazon's public extended review feed for the same ASIN (typically 100-850+ unique US reviews). `mergeMarketplaces` adds the product page from other Amazon marketplaces and unions the deduplicated reviews.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"productUrls\": {\n      \"title\": \"Product URLs\",\n      \"type\": \"array\",\n      \"description\": \"List of Amazon product URLs to scrape reviews from. Supports /dp/, /gp/product/, /gp/aw/d/ and /product/ URL formats across 19+ Amazon domains. A bare 10-character ASIN (e.g. \\\"B09X7MPX8L\\\", no URL) is also accepted -- it is expanded into a full URL using the `country` domain below. Leave empty and use `keywords`/`categoryUrls` instead to discover products automatically.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.amazon.com/dp/B09X7MPX8L\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"sectionCaption\": \"Inputs\",\n      \"sectionDescription\": \"Product URLs whose reviews should be scraped. Any of the supported Amazon country domains is accepted.\"\n    },\n    \"keywords\": {\n      \"title\": \"Keywords (auto-discover products)\",\n      \"type\": \"array\",\n      \"description\": \"Search keywords used to auto-discover products when `productUrls` is empty (e.g. \\\"wireless earbuds\\\"). Fetches Amazon's public `/s?k=` search results page for each keyword and reviews up to `maxProductsToDiscover` resulting products.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [],\n      \"default\": [],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"categoryUrls\": {\n      \"title\": \"Category / Search URLs (auto-discover products)\",\n      \"type\": \"array\",\n      \"description\": \"Advanced mode: supply your own Amazon `/s?...` or `/b?node=...` category/search URL(s) directly (used only when `productUrls` is empty). Products are discovered the same way as `keywords`.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [],\n      \"default\": [],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"maxProductsToDiscover\": {\n      \"title\": \"Max Products to Discover\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of products to discover per run from `keywords`/`categoryUrls`. Ignored when `productUrls` is supplied directly.\",\n      \"editor\": \"number\",\n      \"default\": 10,\n      \"prefill\": 10,\n      \"minimum\": 1,\n      \"maximum\": 50\n    },\n    \"extendedHistory\": {\n      \"title\": \"Extended Review History\",\n      \"type\": \"boolean\",\n      \"description\": \"Merge Amazon's public extended review feed for each ASIN (no login, no cookie): up to 100 reviews per star/sort bucket, and walking every bucket yields 100-850+ unique reviews for popular US products, deduplicated against the product-page sample. Coverage varies by ASIN (some products expose few or no rows) and the feed carries Amazon.com reviews only; when off, only the ~8-13 product-page top reviews are returned.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"mergeMarketplaces\": {\n      \"title\": \"Merge Extra Marketplaces\",\n      \"type\": \"array\",\n      \"description\": \"Additional Amazon marketplaces whose product page is fetched for the same ASIN and whose reviews are merged (deduplicated by review ID and content). Each marketplace typically adds a handful of locally-written reviews. Empty = only the product's own marketplace.\",\n      \"editor\": \"select\",\n      \"prefill\": [],\n      \"default\": [],\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"amazon.com\",\n          \"amazon.co.uk\",\n          \"amazon.de\",\n          \"amazon.fr\",\n          \"amazon.it\",\n          \"amazon.es\",\n          \"amazon.ca\",\n          \"amazon.com.au\",\n          \"amazon.co.jp\",\n          \"amazon.in\",\n          \"amazon.com.br\",\n          \"amazon.com.mx\",\n          \"amazon.nl\",\n          \"amazon.sg\",\n          \"amazon.ae\",\n          \"amazon.sa\",\n          \"amazon.pl\",\n          \"amazon.se\",\n          \"amazon.com.tr\"\n        ],\n        \"enumTitles\": [\n          \"United States (amazon.com)\",\n          \"United Kingdom (amazon.co.uk)\",\n          \"Germany (amazon.de)\",\n          \"France (amazon.fr)\",\n          \"Italy (amazon.it)\",\n          \"Spain (amazon.es)\",\n          \"Canada (amazon.ca)\",\n          \"Australia (amazon.com.au)\",\n          \"Japan (amazon.co.jp)\",\n          \"India (amazon.in)\",\n          \"Brazil (amazon.com.br)\",\n          \"Mexico (amazon.com.mx)\",\n          \"Netherlands (amazon.nl)\",\n          \"Singapore (amazon.sg)\",\n          \"UAE (amazon.ae)\",\n          \"Saudi Arabia (amazon.sa)\",\n          \"Poland (amazon.pl)\",\n          \"Sweden (amazon.se)\",\n          \"Turkey (amazon.com.tr)\"\n        ]\n      }\n    },\n    \"includeAggregates\": {\n      \"title\": \"Include Review Aggregates\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit one additional `amazon_review_aggregate` record per product with the product title, average rating, global ratings count, star histogram (plus derived per-star counts), and \\\"Customers say\\\" AI summary with aspects -- parsed from the same page HTML already fetched. These widgets render server-side even when individual review cards are gated, so this record is available more reliably than the reviews themselves.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"country\": {\n      \"title\": \"Amazon Domain\",\n      \"type\": \"string\",\n      \"description\": \"Amazon country domain to scrape from. URLs from a different domain are honored automatically.\",\n      \"editor\": \"select\",\n      \"default\": \"amazon.com\",\n      \"prefill\": \"amazon.com\",\n      \"enum\": [\n        \"amazon.com\",\n        \"amazon.co.uk\",\n        \"amazon.de\",\n        \"amazon.fr\",\n        \"amazon.it\",\n        \"amazon.es\",\n        \"amazon.ca\",\n        \"amazon.com.au\",\n        \"amazon.co.jp\",\n        \"amazon.in\",\n        \"amazon.com.br\",\n        \"amazon.com.mx\",\n        \"amazon.nl\",\n        \"amazon.sg\",\n        \"amazon.ae\",\n        \"amazon.sa\",\n        \"amazon.pl\",\n        \"amazon.se\",\n        \"amazon.com.tr\"\n      ],\n      \"enumTitles\": [\n        \"United States (amazon.com)\",\n        \"United Kingdom (amazon.co.uk)\",\n        \"Germany (amazon.de)\",\n        \"France (amazon.fr)\",\n        \"Italy (amazon.it)\",\n        \"Spain (amazon.es)\",\n        \"Canada (amazon.ca)\",\n        \"Australia (amazon.com.au)\",\n        \"Japan (amazon.co.jp)\",\n        \"India (amazon.in)\",\n        \"Brazil (amazon.com.br)\",\n        \"Mexico (amazon.com.mx)\",\n        \"Netherlands (amazon.nl)\",\n        \"Singapore (amazon.sg)\",\n        \"UAE (amazon.ae)\",\n        \"Saudi Arabia (amazon.sa)\",\n        \"Poland (amazon.pl)\",\n        \"Sweden (amazon.se)\",\n        \"Turkey (amazon.com.tr)\"\n      ]\n    },\n    \"maxReviews\": {\n      \"title\": \"Max Reviews per Product\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on the number of reviews returned per product AFTER merging and deduplication (1-2000). The product-page sample alone yields ~8-13; the extended review feed can add 100-850+ for popular US products.\",\n      \"editor\": \"number\",\n      \"default\": 100,\n      \"prefill\": 15,\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"sectionCaption\": \"Filters & Sorting\",\n      \"sectionDescription\": \"Limit and shape the merged review set returned per product. All filters below are applied after merging and deduplication.\"\n    },\n    \"sortBy\": {\n      \"title\": \"Sort Reviews By\",\n      \"type\": \"string\",\n      \"description\": \"How to sort the returned reviews: most helpful first, or most recent first.\",\n      \"editor\": \"select\",\n      \"default\": \"helpful\",\n      \"prefill\": \"helpful\",\n      \"enum\": [\n        \"helpful\",\n        \"recent\"\n      ],\n      \"enumTitles\": [\n        \"Most Helpful\",\n        \"Most Recent\"\n      ]\n    },\n    \"filterByStar\": {\n      \"title\": \"Filter by Star Rating\",\n      \"type\": \"string\",\n      \"description\": \"Keep only reviews with this rating. `positive` keeps 4-5 star reviews; `critical` keeps 1-2 star reviews. Applied to the merged set, so narrow filters can legitimately return few or no rows.\",\n      \"editor\": \"select\",\n      \"default\": \"\",\n      \"enum\": [\n        \"\",\n        \"1\",\n        \"2\",\n        \"3\",\n        \"4\",\n        \"5\",\n        \"positive\",\n        \"critical\"\n      ],\n      \"enumTitles\": [\n        \"All Stars\",\n        \"1 Star\",\n        \"2 Stars\",\n        \"3 Stars\",\n        \"4 Stars\",\n        \"5 Stars\",\n        \"Positive (4-5 stars)\",\n        \"Critical (1-2 stars)\"\n      ]\n    },\n    \"verifiedPurchasesOnly\": {\n      \"title\": \"Verified Purchases Only\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only reviews carrying Amazon's Verified Purchase badge. Applied server-side for the extended feed and client-side for product-page rows.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"filterKeywords\": {\n      \"title\": \"Filter by Keywords\",\n      \"type\": \"array\",\n      \"description\": \"Keep only reviews whose title or text contains at least one of these keywords (case-insensitive). Empty = no keyword filter.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [],\n      \"default\": [],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"reviewsNewerThan\": {\n      \"title\": \"Reviews Newer Than\",\n      \"type\": \"string\",\n      \"description\": \"Keep only reviews dated on or after this date (e.g. 2026-01-15 or any ISO date). Reviews whose localized date cannot be parsed are kept. Empty = no date filter.\",\n      \"editor\": \"datepicker\",\n      \"prefill\": \"\"\n    },\n    \"mediaReviewsOnly\": {\n      \"title\": \"Media Reviews Only\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only reviews that include at least one reviewer-uploaded image or video.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeImages\": {\n      \"title\": \"Include Review Images\",\n      \"type\": \"boolean\",\n      \"description\": \"Extract images and videos uploaded by reviewers (full-resolution URLs).\",\n      \"default\": true,\n      \"prefill\": true,\n      \"sectionCaption\": \"Output Options\",\n      \"sectionDescription\": \"Toggle which fields are emitted. GDPR-sensitive fields are off by default.\"\n    },\n    \"includeGdprSensitive\": {\n      \"title\": \"Include GDPR Sensitive Data\",\n      \"type\": \"boolean\",\n      \"description\": \"Include reviewer names, profile links, and avatars. Set to false for GDPR compliance.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  }\n}",
    "readme": "# Amazon Review Aggregates & Extended History Scraper\n\nCollect Amazon customer reviews and rating summaries without a login and without any proxy setup. Point it at product URLs, bare ASINs, or search keywords and it merges three public sources — the product page's own review block (desktop and mobile), Amazon's public extended review feed for the same ASIN, and optionally the same product's pages on other Amazon marketplaces — then deduplicates everything and returns one clean review dataset plus a per-product rating summary.\n\n## What this actor does\n\n- **Extended review history** — the product page alone shows only ~8–13 \"top reviews\"; the public extended feed adds up to 100 reviews per star/sort bucket, and walking every bucket yields **100–850+ unique reviews** for popular US products (measured maxima: 856), merged and deduplicated by review ID and content fingerprint.\n- **Multi-marketplace merge** — collect the product page on additional Amazon marketplaces and union the deduplicated reviews, since each storefront carries a different (partially overlapping) set.\n- **Rating aggregates** — product title, average rating, global ratings count, the full star histogram with derived per-star counts, and Amazon's AI-generated \"Customers say\" summary with per-aspect sentiment.\n- **Filters that actually narrow the data** — star (including positive/critical), verified purchases, keywords, date, media-only, plus sort by most helpful or most recent.\n- **Resilient by design** — the review wall is probabilistic, so every product page is retried across fresh sessions and both desktop/mobile paths; blocked pages escalate to a residential connection automatically.\n- Fields a review or product page doesn't provide (no reviewer images, no Vine badge, no helpful votes) are simply left out of that record — empty fields are omitted, never sent as `null`.\n\n## Output per review\n\n| Field | Description |\n|---|---|\n| `productAsin` | Amazon ASIN of the requested product. |\n| `reviewedProductAsin` | Variant ASIN the review was written for, when the page exposes it. |\n| `ratingScore` | Star rating, 1–5. |\n| `reviewTitle` / `reviewDescription` | Review headline and full text. |\n| `reviewUrl` | Direct link to the individual review, when the source exposes one. |\n| `reviewReaction` | Raw \"N people found this helpful\" text, when present. |\n| `reviewedIn` | Raw \"Reviewed in \\<country\\> on \\<date\\>\" text. |\n| `isVerified` | Verified Purchase flag. |\n| `isVineVoice` | Amazon Vine reviewer flag, when evidenced. |\n| `variant` | Product variant reviewed (e.g. size/color), when shown. |\n| `reviewImages` | Reviewer-uploaded image URLs, when `includeImages` is on. |\n| `reviewVideos` | Reviewer-uploaded videos (`url`, `thumbnailUrl`), when present. |\n| `position` | Rank of this review within its product's returned set. |\n| `reviewId` | Amazon's own review identifier, when the source exposes one. |\n| `helpfulCount` | Parsed numeric helpful-vote count. |\n| `reviewDate` | Parsed ISO date. |\n| `reviewLocation` | Parsed reviewer country/region. |\n| `sentimentHint` | Derived `positive` / `neutral` / `negative` label. |\n| `wordCount` | Review length (character count for CJK scripts). |\n| `hasImages` / `imageCount` / `hasVideos` / `videoCount` | Derived media counts. |\n| `reviewHash` | Stable content fingerprint used for cross-source deduplication. |\n| `source` | Which pipeline produced the row: `productPage` or `extendedHistory`. |\n| `sourceMarketplace` | Amazon domain the row came from. |\n| `reviewerName` / `reviewerProfile` / `reviewerAvatar` | Reviewer identity fields, only present when `includeGdprSensitive` is `true`. |\n| `scrapedAt` | UTC timestamp of the scrape. |\n| `sourceUrl` | The product URL that was scraped. |\n\n## Output per product (rating aggregate)\n\nWhen `includeAggregates` is on (default), one additional record per product carries:\n\n| Field | Description |\n|---|---|\n| `type` | Always `\"amazon_review_aggregate\"`. |\n| `productAsin` | Amazon ASIN. |\n| `productTitle` | Product title from the same page. |\n| `averageRating` | Overall star rating shown on the product page. |\n| `globalRatingsCount` | Total number of ratings, not just the reviews collected. |\n| `starsBreakdown` | Percentage per star, 5 through 1. |\n| `ratingCountByStar` | Derived count per star (percentage × `globalRatingsCount`, rounded). |\n| `customersSay` | Amazon's AI-generated \"Customers say\" summary, when Amazon shows one. |\n| `customersSayAspects` | Per-aspect sentiment breakdown (`label`, `sentiment`, `mentionCount`, `summary`). |\n| `productUrl` | Canonical `/dp/{ASIN}` product URL. |\n| `scrapedAt` / `sourceUrl` | Scrape timestamp and source URL. |\n\n### Status records\n\nIf a run can't return real reviews for a product, the dataset gets one typed status record instead of being left empty, identified by its `type` value: `amazon_reviews_walled_us`, `amazon_reviews_no_star_match`, `amazon_reviews_blocked`, or `amazon_reviews_no_products_discovered`. A blocked/checkpointed page is always reported in the run's status message — the actor never fails silently.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `productUrls` | Array of strings | – | Amazon product URLs, or bare ASINs expanded using `country`. Leave empty to use `keywords`/`categoryUrls` instead. |\n| `keywords` | Array of strings | `[]` | Search keywords to auto-discover products, used only when `productUrls` is empty. |\n| `categoryUrls` | Array of strings | `[]` | Amazon search/category URLs to auto-discover products from, used only when `productUrls` is empty. |\n| `maxProductsToDiscover` | Integer | `10` | Maximum products to discover from `keywords`/`categoryUrls` (1–50). |\n| `extendedHistory` | Boolean | `true` | Merge Amazon's public extended review feed (typically 100–600+ unique reviews for popular US products) with the product-page sample. |\n| `mergeMarketplaces` | Array of domains | `[]` | Extra Amazon marketplaces to fetch the product page from and merge deduplicated reviews. |\n| `includeAggregates` | Boolean | `true` | Emit one rating-aggregate record per product. |\n| `country` | String (select) | `\"amazon.com\"` | Amazon marketplace domain (19 supported). |\n| `maxReviews` | Integer | `100` | Hard cap per product after merging and deduplication (1–2000). |\n| `sortBy` | String (select) | `\"helpful\"` | `helpful` or `recent`. |\n| `filterByStar` | String (select) | `\"\"` (all) | Restrict to one star rating (`\"1\"`–`\"5\"`), `positive` (4–5), or `critical` (1–2). |\n| `verifiedPurchasesOnly` | Boolean | `false` | Only return Verified Purchase reviews. |\n| `filterKeywords` | Array of strings | `[]` | Keep only reviews whose title or text contains at least one keyword. |\n| `reviewsNewerThan` | String (date) | – | Keep only reviews dated on or after this date. |\n| `mediaReviewsOnly` | Boolean | `false` | Keep only reviews with at least one image or video. |\n| `includeImages` | Boolean | `true` | Extract reviewer-uploaded images and videos. |\n| `includeGdprSensitive` | Boolean | `false` | Include reviewer name, profile link, and avatar. |\n\n### Example: extended history for one product\n\n```json\n{\n    \"productUrls\": [\"https://www.amazon.com/dp/B09X7MPX8L\"],\n    \"extendedHistory\": true,\n    \"maxReviews\": 300,\n    \"sortBy\": \"recent\"\n}\n```\n\n### Example: only critical reviews with images\n\n```json\n{\n    \"productUrls\": [\"B09X7MPX8L\"],\n    \"filterByStar\": \"critical\",\n    \"mediaReviewsOnly\": true,\n    \"verifiedPurchasesOnly\": true,\n    \"maxReviews\": 100\n}\n```\n\n### Example: merge several marketplaces\n\n```json\n{\n    \"productUrls\": [\"https://www.amazon.de/dp/B09X7MPX8L\"],\n    \"country\": \"amazon.de\",\n    \"mergeMarketplaces\": [\"amazon.co.uk\", \"amazon.fr\", \"amazon.it\"],\n    \"maxReviews\": 200\n}\n```\n\n### Example: keyword discovery with a date window\n\n```json\n{\n    \"keywords\": [\"wireless earbuds\"],\n    \"maxProductsToDiscover\": 5,\n    \"reviewsNewerThan\": \"2026-01-01\",\n    \"filterKeywords\": [\"battery\", \"sound\"],\n    \"sortBy\": \"recent\"\n}\n```\n\n## Use cases\n\n- **Voice-of-customer analysis** — pull hundreds of review texts per product line for sentiment, topic, or keyword analysis.\n- **Competitive benchmarking** — compare `averageRating`, `starsBreakdown`, and \"Customers say\" summaries across competing ASINs.\n- **Review monitoring** — schedule runs on a watch-list to track new reviews, ratings, and helpful-vote counts over time.\n- **Trust and quality signals** — surface `isVerified`/`isVineVoice` flags and reviewer-uploaded media for product-quality dashboards.\n- **Localization research** — merge reviews for the same product across marketplaces to compare region-specific feedback.\n- **Critical-review triage** — filter to `critical` reviews with media to jump straight to the problems customers photograph.\n\n## FAQ\n\n**How many reviews can I get per product?**\nThe product-page block alone shows ~8–13 top reviews. With `extendedHistory` on (default), the public extended feed adds up to 100 reviews per star/sort bucket; walking all buckets measured 100–856 unique reviews across a 35-ASIN survey (17 ASINs had feed data; the rest fall back to the product-page sample). Set `maxReviews` high enough (e.g. 500–1000) to receive the full depth, or keep it lower for a fast, cheap run.\n\n**Is a proxy or login required?**\nNo. The actor works without any credentials and without any proxy setup; it chooses a working connection automatically and only escalates to a residential connection for a request that Amazon actually blocks. It never uses your Amazon account or cookies.\n\n**Why did one product return only a handful of reviews?**\nThe extended feed does not cover every ASIN — in a 35-ASIN survey, 17 had feed data and 18 exposed few or no rows (the feed carries Amazon.com reviews only). When that happens the actor still returns the product-page sample plus the rating aggregates, and the run's status message reports what was collected.\n\n**Why are some fields missing on some reviews?**\nEvery source exposes a different subset: the extended feed has no review permalink or review ID (rows are deduplicated by a content fingerprint), some marketplace pages hide reviewer profiles for cross-posted reviews, and Amazon only renders the AI \"Customers say\" summary on some products and mostly on amazon.com. Missing fields are omitted, never filled with placeholders.\n\n**What does `source` mean?**\nIt tells you which pipeline produced the row: `productPage` (the product page's inline block) or `extendedHistory` (the public extended feed). `sourceMarketplace` tells you which Amazon storefront it came from.\n\n**Is `ratingCountByStar` exact?**\nIt is derived: Amazon publishes the histogram as percentages plus one global ratings count, so the per-star counts are that percentage applied to the total and rounded (validated on 61 live pages: percentages always sum to 100 and the derived counts are within ±1 of the global total). `starsBreakdown` holds the exact percentages.\n\n**Can I get the complete review history?**\nThe actor returns everything Amazon publishes to anonymous visitors: the product page's sample plus the public extended feed (and any merged marketplaces). Amazon keeps the fully paginated list behind a sign-in wall, and this actor never asks for an account, cookie, or password — so it does not read it.\n\n**Do reviewer name, profile, and avatar always appear?**\nNo — only when `includeGdprSensitive` is `true`. Make sure you have a lawful basis before enabling it.\n\n**Is this affiliated with Amazon?**\nNo. This is an independent, third-party actor that reads publicly available Amazon product and review pages and is not operated, endorsed, or sponsored by Amazon.com, Inc.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "amazon-review-aggregates-and-extended-history",
      "title": "Amazon Review Aggregates & Extended History Scraper",
      "description": "Collect Amazon customer reviews and rating summaries by product URL, ASIN, or keyword across 19 marketplaces: extended review history via public feeds, star/keyword/date/media filters, reviewer images, and per-product rating aggregates.",
      "version": "1.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-playwright"
      },
      "input": {
        "title": "Amazon Reviews Scraper Input",
        "description": "Collect Amazon customer reviews and rating summaries with no login and no proxy setup. The actor reads the product page's inline review block (~8-13 top reviews, retried across desktop and mobile because the wall is probabilistic) and, when `extendedHistory` is on, merges Amazon's public extended review feed for the same ASIN (typically 100-850+ unique US reviews). `mergeMarketplaces` adds the product page from other Amazon marketplaces and unions the deduplicated reviews.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "productUrls": {
            "title": "Product URLs",
            "type": "array",
            "description": "List of Amazon product URLs to scrape reviews from. Supports /dp/, /gp/product/, /gp/aw/d/ and /product/ URL formats across 19+ Amazon domains. A bare 10-character ASIN (e.g. \"B09X7MPX8L\", no URL) is also accepted -- it is expanded into a full URL using the `country` domain below. Leave empty and use `keywords`/`categoryUrls` instead to discover products automatically.",
            "editor": "stringList",
            "prefill": [
              "https://www.amazon.com/dp/B09X7MPX8L"
            ],
            "items": {
              "type": "string"
            },
            "sectionCaption": "Inputs",
            "sectionDescription": "Product URLs whose reviews should be scraped. Any of the supported Amazon country domains is accepted."
          },
          "keywords": {
            "title": "Keywords (auto-discover products)",
            "type": "array",
            "description": "Search keywords used to auto-discover products when `productUrls` is empty (e.g. \"wireless earbuds\"). Fetches Amazon's public `/s?k=` search results page for each keyword and reviews up to `maxProductsToDiscover` resulting products.",
            "editor": "stringList",
            "prefill": [],
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categoryUrls": {
            "title": "Category / Search URLs (auto-discover products)",
            "type": "array",
            "description": "Advanced mode: supply your own Amazon `/s?...` or `/b?node=...` category/search URL(s) directly (used only when `productUrls` is empty). Products are discovered the same way as `keywords`.",
            "editor": "stringList",
            "prefill": [],
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxProductsToDiscover": {
            "title": "Max Products to Discover",
            "type": "integer",
            "description": "Maximum number of products to discover per run from `keywords`/`categoryUrls`. Ignored when `productUrls` is supplied directly.",
            "editor": "number",
            "default": 10,
            "prefill": 10,
            "minimum": 1,
            "maximum": 50
          },
          "extendedHistory": {
            "title": "Extended Review History",
            "type": "boolean",
            "description": "Merge Amazon's public extended review feed for each ASIN (no login, no cookie): up to 100 reviews per star/sort bucket, and walking every bucket yields 100-850+ unique reviews for popular US products, deduplicated against the product-page sample. Coverage varies by ASIN (some products expose few or no rows) and the feed carries Amazon.com reviews only; when off, only the ~8-13 product-page top reviews are returned.",
            "default": true,
            "prefill": true
          },
          "mergeMarketplaces": {
            "title": "Merge Extra Marketplaces",
            "type": "array",
            "description": "Additional Amazon marketplaces whose product page is fetched for the same ASIN and whose reviews are merged (deduplicated by review ID and content). Each marketplace typically adds a handful of locally-written reviews. Empty = only the product's own marketplace.",
            "editor": "select",
            "prefill": [],
            "default": [],
            "items": {
              "type": "string",
              "enum": [
                "amazon.com",
                "amazon.co.uk",
                "amazon.de",
                "amazon.fr",
                "amazon.it",
                "amazon.es",
                "amazon.ca",
                "amazon.com.au",
                "amazon.co.jp",
                "amazon.in",
                "amazon.com.br",
                "amazon.com.mx",
                "amazon.nl",
                "amazon.sg",
                "amazon.ae",
                "amazon.sa",
                "amazon.pl",
                "amazon.se",
                "amazon.com.tr"
              ],
              "enumTitles": [
                "United States (amazon.com)",
                "United Kingdom (amazon.co.uk)",
                "Germany (amazon.de)",
                "France (amazon.fr)",
                "Italy (amazon.it)",
                "Spain (amazon.es)",
                "Canada (amazon.ca)",
                "Australia (amazon.com.au)",
                "Japan (amazon.co.jp)",
                "India (amazon.in)",
                "Brazil (amazon.com.br)",
                "Mexico (amazon.com.mx)",
                "Netherlands (amazon.nl)",
                "Singapore (amazon.sg)",
                "UAE (amazon.ae)",
                "Saudi Arabia (amazon.sa)",
                "Poland (amazon.pl)",
                "Sweden (amazon.se)",
                "Turkey (amazon.com.tr)"
              ]
            }
          },
          "includeAggregates": {
            "title": "Include Review Aggregates",
            "type": "boolean",
            "description": "Emit one additional `amazon_review_aggregate` record per product with the product title, average rating, global ratings count, star histogram (plus derived per-star counts), and \"Customers say\" AI summary with aspects -- parsed from the same page HTML already fetched. These widgets render server-side even when individual review cards are gated, so this record is available more reliably than the reviews themselves.",
            "default": true,
            "prefill": true
          },
          "country": {
            "title": "Amazon Domain",
            "type": "string",
            "description": "Amazon country domain to scrape from. URLs from a different domain are honored automatically.",
            "editor": "select",
            "default": "amazon.com",
            "prefill": "amazon.com",
            "enum": [
              "amazon.com",
              "amazon.co.uk",
              "amazon.de",
              "amazon.fr",
              "amazon.it",
              "amazon.es",
              "amazon.ca",
              "amazon.com.au",
              "amazon.co.jp",
              "amazon.in",
              "amazon.com.br",
              "amazon.com.mx",
              "amazon.nl",
              "amazon.sg",
              "amazon.ae",
              "amazon.sa",
              "amazon.pl",
              "amazon.se",
              "amazon.com.tr"
            ],
            "enumTitles": [
              "United States (amazon.com)",
              "United Kingdom (amazon.co.uk)",
              "Germany (amazon.de)",
              "France (amazon.fr)",
              "Italy (amazon.it)",
              "Spain (amazon.es)",
              "Canada (amazon.ca)",
              "Australia (amazon.com.au)",
              "Japan (amazon.co.jp)",
              "India (amazon.in)",
              "Brazil (amazon.com.br)",
              "Mexico (amazon.com.mx)",
              "Netherlands (amazon.nl)",
              "Singapore (amazon.sg)",
              "UAE (amazon.ae)",
              "Saudi Arabia (amazon.sa)",
              "Poland (amazon.pl)",
              "Sweden (amazon.se)",
              "Turkey (amazon.com.tr)"
            ]
          },
          "maxReviews": {
            "title": "Max Reviews per Product",
            "type": "integer",
            "description": "Hard cap on the number of reviews returned per product AFTER merging and deduplication (1-2000). The product-page sample alone yields ~8-13; the extended review feed can add 100-850+ for popular US products.",
            "editor": "number",
            "default": 100,
            "prefill": 15,
            "minimum": 1,
            "maximum": 2000,
            "sectionCaption": "Filters & Sorting",
            "sectionDescription": "Limit and shape the merged review set returned per product. All filters below are applied after merging and deduplication."
          },
          "sortBy": {
            "title": "Sort Reviews By",
            "type": "string",
            "description": "How to sort the returned reviews: most helpful first, or most recent first.",
            "editor": "select",
            "default": "helpful",
            "prefill": "helpful",
            "enum": [
              "helpful",
              "recent"
            ],
            "enumTitles": [
              "Most Helpful",
              "Most Recent"
            ]
          },
          "filterByStar": {
            "title": "Filter by Star Rating",
            "type": "string",
            "description": "Keep only reviews with this rating. `positive` keeps 4-5 star reviews; `critical` keeps 1-2 star reviews. Applied to the merged set, so narrow filters can legitimately return few or no rows.",
            "editor": "select",
            "default": "",
            "enum": [
              "",
              "1",
              "2",
              "3",
              "4",
              "5",
              "positive",
              "critical"
            ],
            "enumTitles": [
              "All Stars",
              "1 Star",
              "2 Stars",
              "3 Stars",
              "4 Stars",
              "5 Stars",
              "Positive (4-5 stars)",
              "Critical (1-2 stars)"
            ]
          },
          "verifiedPurchasesOnly": {
            "title": "Verified Purchases Only",
            "type": "boolean",
            "description": "Keep only reviews carrying Amazon's Verified Purchase badge. Applied server-side for the extended feed and client-side for product-page rows.",
            "default": false,
            "prefill": false
          },
          "filterKeywords": {
            "title": "Filter by Keywords",
            "type": "array",
            "description": "Keep only reviews whose title or text contains at least one of these keywords (case-insensitive). Empty = no keyword filter.",
            "editor": "stringList",
            "prefill": [],
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewsNewerThan": {
            "title": "Reviews Newer Than",
            "type": "string",
            "description": "Keep only reviews dated on or after this date (e.g. 2026-01-15 or any ISO date). Reviews whose localized date cannot be parsed are kept. Empty = no date filter.",
            "editor": "datepicker",
            "prefill": ""
          },
          "mediaReviewsOnly": {
            "title": "Media Reviews Only",
            "type": "boolean",
            "description": "Keep only reviews that include at least one reviewer-uploaded image or video.",
            "default": false,
            "prefill": false
          },
          "includeImages": {
            "title": "Include Review Images",
            "type": "boolean",
            "description": "Extract images and videos uploaded by reviewers (full-resolution URLs).",
            "default": true,
            "prefill": true,
            "sectionCaption": "Output Options",
            "sectionDescription": "Toggle which fields are emitted. GDPR-sensitive fields are off by default."
          },
          "includeGdprSensitive": {
            "title": "Include GDPR Sensitive Data",
            "type": "boolean",
            "description": "Include reviewer names, profile links, and avatars. Set to false for GDPR compliance.",
            "default": false,
            "prefill": false
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Amazon Review Aggregates & Extended History Scraper Output",
        "description": "One record per collected Amazon customer review — rating, title, body, verified-purchase/Vine flags, helpful-votes count, reviewer location, sentiment hint, images/videos, the pipeline that produced the row (`source`: productPage / extendedHistory / cookieMode), its marketplace, a stable dedup fingerprint, and product/source metadata. One additional `amazon_review_aggregate` record per product carries the product title, average rating, global ratings count, star histogram with derived per-star counts, and Amazon's \"Customers say\" summary with aspects. Empty / null fields are dropped at push time, so any field documented below may be absent if the source did not populate it. Records may carry `collectionCompleteness: \"INLINE_SAMPLE\"` when `sourceMode=FULL_PAGE` was requested without a valid `cookieString` and `onAuthRequired=RETURN_PARTIAL` fell back to the cookie-free product-page sample instead of the full paginated set.",
        "properties": {
          "reviews": {
            "type": "string",
            "title": "Amazon reviews",
            "description": "Dataset containing all collected Amazon customer reviews and per-product review aggregates.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Amazon Review Aggregates & Extended History Scraper\n\nCollect Amazon customer reviews and rating summaries without a login and without any proxy setup. Point it at product URLs, bare ASINs, or search keywords and it merges three public sources — the product page's own review block (desktop and mobile), Amazon's public extended review feed for the same ASIN, and optionally the same product's pages on other Amazon marketplaces — then deduplicates everything and returns one clean review dataset plus a per-product rating summary.\n\n## What this actor does\n\n- **Extended review history** — the product page alone shows only ~8–13 \"top reviews\"; the public extended feed adds up to 100 reviews per star/sort bucket, and walking every bucket yields **100–850+ unique reviews** for popular US products (measured maxima: 856), merged and deduplicated by review ID and content fingerprint.\n- **Multi-marketplace merge** — collect the product page on additional Amazon marketplaces and union the deduplicated reviews, since each storefront carries a different (partially overlapping) set.\n- **Rating aggregates** — product title, average rating, global ratings count, the full star histogram with derived per-star counts, and Amazon's AI-generated \"Customers say\" summary with per-aspect sentiment.\n- **Filters that actually narrow the data** — star (including positive/critical), verified purchases, keywords, date, media-only, plus sort by most helpful or most recent.\n- **Resilient by design** — the review wall is probabilistic, so every product page is retried across fresh sessions and both desktop/mobile paths; blocked pages escalate to a residential connection automatically.\n- Fields a review or product page doesn't provide (no reviewer images, no Vine badge, no helpful votes) are simply left out of that record — empty fields are omitted, never sent as `null`.\n\n## Output per review\n\n| Field | Description |\n|---|---|\n| `productAsin` | Amazon ASIN of the requested product. |\n| `reviewedProductAsin` | Variant ASIN the review was written for, when the page exposes it. |\n| `ratingScore` | Star rating, 1–5. |\n| `reviewTitle` / `reviewDescription` | Review headline and full text. |\n| `reviewUrl` | Direct link to the individual review, when the source exposes one. |\n| `reviewReaction` | Raw \"N people found this helpful\" text, when present. |\n| `reviewedIn` | Raw \"Reviewed in \\<country\\> on \\<date\\>\" text. |\n| `isVerified` | Verified Purchase flag. |\n| `isVineVoice` | Amazon Vine reviewer flag, when evidenced. |\n| `variant` | Product variant reviewed (e.g. size/color), when shown. |\n| `reviewImages` | Reviewer-uploaded image URLs, when `includeImages` is on. |\n| `reviewVideos` | Reviewer-uploaded videos (`url`, `thumbnailUrl`), when present. |\n| `position` | Rank of this review within its product's returned set. |\n| `reviewId` | Amazon's own review identifier, when the source exposes one. |\n| `helpfulCount` | Parsed numeric helpful-vote count. |\n| `reviewDate` | Parsed ISO date. |\n| `reviewLocation` | Parsed reviewer country/region. |\n| `sentimentHint` | Derived `positive` / `neutral` / `negative` label. |\n| `wordCount` | Review length (character count for CJK scripts). |\n| `hasImages` / `imageCount` / `hasVideos` / `videoCount` | Derived media counts. |\n| `reviewHash` | Stable content fingerprint used for cross-source deduplication. |\n| `source` | Which pipeline produced the row: `productPage` or `extendedHistory`. |\n| `sourceMarketplace` | Amazon domain the row came from. |\n| `reviewerName` / `reviewerProfile` / `reviewerAvatar` | Reviewer identity fields, only present when `includeGdprSensitive` is `true`. |\n| `scrapedAt` | UTC timestamp of the scrape. |\n| `sourceUrl` | The product URL that was scraped. |\n\n## Output per product (rating aggregate)\n\nWhen `includeAggregates` is on (default), one additional record per product carries:\n\n| Field | Description |\n|---|---|\n| `type` | Always `\"amazon_review_aggregate\"`. |\n| `productAsin` | Amazon ASIN. |\n| `productTitle` | Product title from the same page. |\n| `averageRating` | Overall star rating shown on the product page. |\n| `globalRatingsCount` | Total number of ratings, not just the reviews collected. |\n| `starsBreakdown` | Percentage per star, 5 through 1. |\n| `ratingCountByStar` | Derived count per star (percentage × `globalRatingsCount`, rounded). |\n| `customersSay` | Amazon's AI-generated \"Customers say\" summary, when Amazon shows one. |\n| `customersSayAspects` | Per-aspect sentiment breakdown (`label`, `sentiment`, `mentionCount`, `summary`). |\n| `productUrl` | Canonical `/dp/{ASIN}` product URL. |\n| `scrapedAt` / `sourceUrl` | Scrape timestamp and source URL. |\n\n### Status records\n\nIf a run can't return real reviews for a product, the dataset gets one typed status record instead of being left empty, identified by its `type` value: `amazon_reviews_walled_us`, `amazon_reviews_no_star_match`, `amazon_reviews_blocked`, or `amazon_reviews_no_products_discovered`. A blocked/checkpointed page is always reported in the run's status message — the actor never fails silently.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `productUrls` | Array of strings | – | Amazon product URLs, or bare ASINs expanded using `country`. Leave empty to use `keywords`/`categoryUrls` instead. |\n| `keywords` | Array of strings | `[]` | Search keywords to auto-discover products, used only when `productUrls` is empty. |\n| `categoryUrls` | Array of strings | `[]` | Amazon search/category URLs to auto-discover products from, used only when `productUrls` is empty. |\n| `maxProductsToDiscover` | Integer | `10` | Maximum products to discover from `keywords`/`categoryUrls` (1–50). |\n| `extendedHistory` | Boolean | `true` | Merge Amazon's public extended review feed (typically 100–600+ unique reviews for popular US products) with the product-page sample. |\n| `mergeMarketplaces` | Array of domains | `[]` | Extra Amazon marketplaces to fetch the product page from and merge deduplicated reviews. |\n| `includeAggregates` | Boolean | `true` | Emit one rating-aggregate record per product. |\n| `country` | String (select) | `\"amazon.com\"` | Amazon marketplace domain (19 supported). |\n| `maxReviews` | Integer | `100` | Hard cap per product after merging and deduplication (1–2000). |\n| `sortBy` | String (select) | `\"helpful\"` | `helpful` or `recent`. |\n| `filterByStar` | String (select) | `\"\"` (all) | Restrict to one star rating (`\"1\"`–`\"5\"`), `positive` (4–5), or `critical` (1–2). |\n| `verifiedPurchasesOnly` | Boolean | `false` | Only return Verified Purchase reviews. |\n| `filterKeywords` | Array of strings | `[]` | Keep only reviews whose title or text contains at least one keyword. |\n| `reviewsNewerThan` | String (date) | – | Keep only reviews dated on or after this date. |\n| `mediaReviewsOnly` | Boolean | `false` | Keep only reviews with at least one image or video. |\n| `includeImages` | Boolean | `true` | Extract reviewer-uploaded images and videos. |\n| `includeGdprSensitive` | Boolean | `false` | Include reviewer name, profile link, and avatar. |\n\n### Example: extended history for one product\n\n```json\n{\n    \"productUrls\": [\"https://www.amazon.com/dp/B09X7MPX8L\"],\n    \"extendedHistory\": true,\n    \"maxReviews\": 300,\n    \"sortBy\": \"recent\"\n}\n```\n\n### Example: only critical reviews with images\n\n```json\n{\n    \"productUrls\": [\"B09X7MPX8L\"],\n    \"filterByStar\": \"critical\",\n    \"mediaReviewsOnly\": true,\n    \"verifiedPurchasesOnly\": true,\n    \"maxReviews\": 100\n}\n```\n\n### Example: merge several marketplaces\n\n```json\n{\n    \"productUrls\": [\"https://www.amazon.de/dp/B09X7MPX8L\"],\n    \"country\": \"amazon.de\",\n    \"mergeMarketplaces\": [\"amazon.co.uk\", \"amazon.fr\", \"amazon.it\"],\n    \"maxReviews\": 200\n}\n```\n\n### Example: keyword discovery with a date window\n\n```json\n{\n    \"keywords\": [\"wireless earbuds\"],\n    \"maxProductsToDiscover\": 5,\n    \"reviewsNewerThan\": \"2026-01-01\",\n    \"filterKeywords\": [\"battery\", \"sound\"],\n    \"sortBy\": \"recent\"\n}\n```\n\n## Use cases\n\n- **Voice-of-customer analysis** — pull hundreds of review texts per product line for sentiment, topic, or keyword analysis.\n- **Competitive benchmarking** — compare `averageRating`, `starsBreakdown`, and \"Customers say\" summaries across competing ASINs.\n- **Review monitoring** — schedule runs on a watch-list to track new reviews, ratings, and helpful-vote counts over time.\n- **Trust and quality signals** — surface `isVerified`/`isVineVoice` flags and reviewer-uploaded media for product-quality dashboards.\n- **Localization research** — merge reviews for the same product across marketplaces to compare region-specific feedback.\n- **Critical-review triage** — filter to `critical` reviews with media to jump straight to the problems customers photograph.\n\n## FAQ\n\n**How many reviews can I get per product?**\nThe product-page block alone shows ~8–13 top reviews. With `extendedHistory` on (default), the public extended feed adds up to 100 reviews per star/sort bucket; walking all buckets measured 100–856 unique reviews across a 35-ASIN survey (17 ASINs had feed data; the rest fall back to the product-page sample). Set `maxReviews` high enough (e.g. 500–1000) to receive the full depth, or keep it lower for a fast, cheap run.\n\n**Is a proxy or login required?**\nNo. The actor works without any credentials and without any proxy setup; it chooses a working connection automatically and only escalates to a residential connection for a request that Amazon actually blocks. It never uses your Amazon account or cookies.\n\n**Why did one product return only a handful of reviews?**\nThe extended feed does not cover every ASIN — in a 35-ASIN survey, 17 had feed data and 18 exposed few or no rows (the feed carries Amazon.com reviews only). When that happens the actor still returns the product-page sample plus the rating aggregates, and the run's status message reports what was collected.\n\n**Why are some fields missing on some reviews?**\nEvery source exposes a different subset: the extended feed has no review permalink or review ID (rows are deduplicated by a content fingerprint), some marketplace pages hide reviewer profiles for cross-posted reviews, and Amazon only renders the AI \"Customers say\" summary on some products and mostly on amazon.com. Missing fields are omitted, never filled with placeholders.\n\n**What does `source` mean?**\nIt tells you which pipeline produced the row: `productPage` (the product page's inline block) or `extendedHistory` (the public extended feed). `sourceMarketplace` tells you which Amazon storefront it came from.\n\n**Is `ratingCountByStar` exact?**\nIt is derived: Amazon publishes the histogram as percentages plus one global ratings count, so the per-star counts are that percentage applied to the total and rounded (validated on 61 live pages: percentages always sum to 100 and the derived counts are within ±1 of the global total). `starsBreakdown` holds the exact percentages.\n\n**Can I get the complete review history?**\nThe actor returns everything Amazon publishes to anonymous visitors: the product page's sample plus the public extended feed (and any merged marketplaces). Amazon keeps the fully paginated list behind a sign-in wall, and this actor never asks for an account, cookie, or password — so it does not read it.\n\n**Do reviewer name, profile, and avatar always appear?**\nNo — only when `includeGdprSensitive` is `true`. Make sure you have a lawful basis before enabling it.\n\n**Is this affiliated with Amazon?**\nNo. This is an independent, third-party actor that reads publicly available Amazon product and review pages and is not operated, endorsed, or sponsored by Amazon.com, Inc.\n",
      "categories": [
        "ECOMMERCE",
        "PRODUCTS"
      ],
      "defaultRunOptions": {
        "build": "latest",
        "memoryMbytes": 2048,
        "timeoutSecs": 3600
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Amazon Reviews",
          "views": {
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "productAsin",
                  "reviewedProductAsin",
                  "ratingScore",
                  "reviewTitle",
                  "reviewDescription",
                  "isVerified",
                  "isVineVoice",
                  "reviewedIn",
                  "reviewReaction",
                  "variant",
                  "reviewImages",
                  "position",
                  "reviewId",
                  "reviewUrl",
                  "helpfulCount",
                  "reviewDate",
                  "reviewLocation",
                  "sentimentHint",
                  "wordCount",
                  "hasImages",
                  "imageCount",
                  "hasVideos",
                  "videoCount",
                  "reviewHash",
                  "source",
                  "sourceMarketplace",
                  "scrapedAt",
                  "sourceUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "productAsin": {
                    "label": "ASIN",
                    "format": "text"
                  },
                  "ratingScore": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewTitle": {
                    "label": "Title",
                    "format": "text"
                  },
                  "isVerified": {
                    "label": "Verified",
                    "format": "boolean"
                  },
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "helpfulCount": {
                    "label": "Helpful",
                    "format": "number"
                  },
                  "reviewDate": {
                    "label": "Date",
                    "format": "text"
                  },
                  "reviewLocation": {
                    "label": "Location",
                    "format": "text"
                  },
                  "sentimentHint": {
                    "label": "Sentiment",
                    "format": "text"
                  },
                  "wordCount": {
                    "label": "Words",
                    "format": "number"
                  },
                  "hasImages": {
                    "label": "Has Images",
                    "format": "boolean"
                  },
                  "source": {
                    "label": "Source",
                    "format": "text"
                  },
                  "sourceMarketplace": {
                    "label": "Marketplace",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.3",
    "imageDigest": "f8b756d116523ed65ad8918a26547c83886944f265ef7c22bcedc84b8ea47e55",
    "actVersion": {
      "sourceType": "TARBALL",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03656444444444444
    }
  }
}