{
  "apiVersion": 1,
  "generatedAt": "2026-09-14T00:00:00+00:00",
  "slug": "appsumo-product-reviews-scraper",
  "botId": "appsumo-product-reviews-scraper",
  "configEncoding": "plain",
  "configDigest": "460d4665b5fbcafc90102dcdddbedf3414baff951c8be9dccd4556ce1e13a1b8",
  "configBytes": 13664,
  "project": {
    "name": "AppSumo Product Reviews Scraper",
    "settings": {
      "urls": [
        "${product_urls}"
      ],
      "headless": false,
      "navigation_timeout": 60000,
      "max_concurrent_workers": 1,
      "humanoidEnabled": false,
      "proxyEnabled": false,
      "captchaEnabled": false,
      "matchTimezoneAndLocale": false,
      "block_resources": false,
      "get_urls_from_sitemap": false,
      "respect_robots_txt": false,
      "skip_initial_navigation": false,
      "variables": [
        {
          "name": "product_urls",
          "required": true,
          "is_list": false
        },
        {
          "name": "max_pages_per_product",
          "required": false,
          "is_list": false
        }
      ]
    },
    "datasets": {
      "reviews": {
        "item_selector": "css=[data-testid='review-card-wrapper']",
        "properties": [
          {
            "name": "product_slug",
            "type": "text",
            "selector": "variable=product_slug",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "source_url",
            "type": "text",
            "selector": "variable=source_url",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "scraped_page_url",
            "type": "page_url",
            "selector": ""
          },
          {
            "name": "scraped_page_number",
            "type": "page_url",
            "selector": "",
            "transformations": [
              {
                "type": "regex",
                "pattern": "[?&]page=(\\d+)",
                "default_value": "1"
              },
              {
                "type": "cast"
              }
            ]
          },
          {
            "name": "review_position_on_page",
            "type": "index",
            "selector": ""
          },
          {
            "name": "review_id",
            "type": "attribute",
            "selector": "css=a[target='_blank'][href*='/reviews/']",
            "attribute": "href",
            "transformations": [
              {
                "type": "regex",
                "pattern": "-?(\\d+)\\/?$",
                "default_value": ""
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_url",
            "type": "attribute",
            "selector": "css=a[target='_blank'][href*='/reviews/']",
            "attribute": "href",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_slug",
            "type": "attribute",
            "selector": "css=a[target='_blank'][href*='/reviews/']",
            "attribute": "href",
            "transformations": [
              {
                "type": "regex",
                "pattern": "\\/reviews\\/([^\\/?#]+)\\/?$",
                "default_value": ""
              }
            ]
          },
          {
            "name": "review_title",
            "type": "text",
            "selector": "css=div.space-y-1 p.font-header",
            "transformations": [
              {
                "type": "replace"
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_text",
            "type": "text",
            "selector": "css=div.text-midnight [data-testid='toggle-text']",
            "transformations": [
              {
                "type": "replace"
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_text_length",
            "type": "text",
            "selector": "css=div.text-midnight [data-testid='toggle-text']",
            "transformations": [
              {
                "type": "script",
                "code": "return String((value || '').length);",
                "default_value": "0"
              },
              {
                "type": "cast"
              }
            ]
          },
          {
            "name": "review_rating_raw",
            "type": "attribute",
            "selector": "css=[alt$=' stars']",
            "attribute": "alt",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_rating",
            "type": "attribute",
            "selector": "css=[alt$=' stars']",
            "attribute": "alt",
            "transformations": [
              {
                "type": "regex",
                "pattern": "([\\d.]+)",
                "default_value": ""
              },
              {
                "type": "cast"
              }
            ]
          },
          {
            "name": "review_date",
            "type": "text",
            "selector": "css=div.flex-wrap.text-grace span",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "review_date_iso",
            "type": "text",
            "selector": "css=div.flex-wrap.text-grace span",
            "transformations": [
              {
                "type": "script",
                "code": "var t=(value||'').trim();if(!t)return '';var d=new Date(t);if(!isNaN(d.getTime()))return d.toISOString().slice(0,10);var m=t.match(/^([A-Za-z]{3,9})\\.?\\s+(\\d{1,2}),\\s*(\\d{4})$/);if(!m)return '';var mo={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12}[m[1].slice(0,3).toLowerCase()];if(!mo)return '';return m[3]+'-'+('0'+mo).slice(-2)+'-'+('0'+m[2]).slice(-2);",
                "default_value": ""
              }
            ]
          },
          {
            "name": "review_meta_row_text",
            "type": "text",
            "selector": "css=div.flex-wrap.text-grace",
            "transformations": [
              {
                "type": "replace"
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "reviewer_username",
            "type": "text",
            "selector": "css=[data-testid='discussion-user-info'] a.font-bold",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "reviewer_profile_url",
            "type": "attribute",
            "selector": "css=[data-testid='discussion-user-info'] a.font-bold",
            "attribute": "href",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "reviewer_avatar_url",
            "type": "attribute",
            "selector": "css=[data-testid='discussion-user-info'] img",
            "attribute": "src",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "is_plus_member",
            "type": "count",
            "selector": "css=[data-testid='plus-badge']"
          },
          {
            "name": "is_verified_buyer",
            "type": "count",
            "selector": "css=[data-testid='discussion-user-info'] svg[data-icon='circle-check']"
          },
          {
            "name": "reviewer_verified_label",
            "type": "text",
            "selector": "css=[data-testid='discussion-user-info']",
            "transformations": [
              {
                "type": "regex",
                "pattern": "(Verified(?:\\s+purchaser)?)",
                "default_value": ""
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "reviewer_member_since",
            "type": "text",
            "selector": "css=[data-testid='discussion-user-info']",
            "transformations": [
              {
                "type": "regex",
                "pattern": "Member since:\\s*([A-Za-z]{3,9}\\.?\\s+\\d{4})",
                "default_value": ""
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "reviewer_badges_text",
            "type": "text",
            "selector": "css=[data-testid='discussion-user-info']",
            "transformations": [
              {
                "type": "replace"
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "has_founder_reply",
            "type": "count",
            "selector": "css=[data-testid='discussion-creator-reply']"
          },
          {
            "name": "founder_reply_label",
            "type": "text",
            "selector": "css=[data-testid='creator-reply-label']",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "founder_username",
            "type": "text",
            "selector": "css=[data-testid='creator-username']",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "founder_avatar_url",
            "type": "attribute",
            "selector": "css=[data-testid='creator-avatar']",
            "attribute": "src",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "founder_reply_date",
            "type": "text",
            "selector": "css=[data-testid='creator-posted-date']",
            "transformations": [
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "founder_reply_date_iso",
            "type": "text",
            "selector": "css=[data-testid='creator-posted-date']",
            "transformations": [
              {
                "type": "script",
                "code": "var t=(value||'').trim();if(!t)return '';var d=new Date(t);if(!isNaN(d.getTime()))return d.toISOString().slice(0,10);var m=t.match(/^([A-Za-z]{3,9})\\.?\\s+(\\d{1,2}),\\s*(\\d{4})$/);if(!m)return '';var mo={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12}[m[1].slice(0,3).toLowerCase()];if(!mo)return '';return m[3]+'-'+('0'+mo).slice(-2)+'-'+('0'+m[2]).slice(-2);",
                "default_value": ""
              }
            ]
          },
          {
            "name": "founder_reply_text",
            "type": "text",
            "selector": "css=[data-testid='discussion-creator-reply'] [data-testid='toggle-text']",
            "transformations": [
              {
                "type": "replace"
              },
              {
                "type": "trim"
              }
            ]
          },
          {
            "name": "helpful_count",
            "type": "text",
            "selector": "css=[data-testid='discussion-helpful-buttons']",
            "transformations": [
              {
                "type": "regex",
                "pattern": "(\\d+)",
                "default_value": ""
              },
              {
                "type": "cast"
              }
            ]
          },
          {
            "name": "review_share_count",
            "type": "text",
            "selector": "css=[data-testid='review-card-wrapper']",
            "transformations": [
              {
                "type": "regex",
                "pattern": "Share(\\d+)",
                "default_value": ""
              },
              {
                "type": "cast"
              }
            ]
          }
        ],
        "required_fields": [
          "review_id",
          "review_text"
        ]
      }
    },
    "commands": [
      {
        "command": "execute_script",
        "params": {
          "script": "return location.href;"
        },
        "output_variable": "source_url"
      },
      {
        "command": "execute_script",
        "params": {
          "script": "return (location.pathname.split('/products/')[1] || '').split('/')[0];"
        },
        "output_variable": "product_slug"
      },
      {
        "command": "goto",
        "params": {
          "url": "https://appsumo.com/products/${product_slug}/reviews/?ref=pdp&page=1"
        }
      },
      {
        "command": "wait_for_selector",
        "params": {
          "selector": "css=h1, [data-testid='review-card-wrapper']",
          "timeout": 45000
        }
      },
      {
        "command": "execute_script",
        "params": {
          "script": "var as=document.getElementsByTagName('a');var last=1;for(var i=0;i<as.length;i++){var l=as[i].getAttribute('aria-label');if(l&&l.indexOf('Go to page ')===0){var m=l.match(/(\\d+)$/);if(m){var n=parseInt(m[1],10);if(n>last)last=n;}}}return last;"
        },
        "output_variable": "last_page"
      },
      {
        "command": "set_variable",
        "params": {
          "name": "page",
          "value": 1
        }
      },
      {
        "command": "extract_data",
        "params": {
          "dataset": "reviews"
        }
      },
      {
        "command": "while",
        "params": {
          "condition": {
            "type": "script",
            "expression": "((variables.page - 0) || 0) < ((variables.last_page - 0) || 0) && ((variables.page - 0) || 0) < ((variables.max_pages_per_product - 0) || 999)"
          },
          "do": [
            {
              "command": "set_variable",
              "params": {
                "name": "page",
                "value": "${(variables.page - 0) + 1}"
              }
            },
            {
              "command": "goto",
              "params": {
                "url": "https://appsumo.com/products/${product_slug}/reviews/?ref=pdp&page=${page}"
              }
            },
            {
              "command": "wait_for_selector",
              "params": {
                "selector": "css=[data-testid='review-card-wrapper']",
                "timeout": 45000
              }
            },
            {
              "command": "extract_data",
              "params": {
                "dataset": "reviews"
              }
            }
          ]
        }
      }
    ],
    "authors": []
  }
}