{
  "data": {
    "id": "NH8lgwIa6DUbH8qF5",
    "actId": "DeYvCwCnIKlepvXdy",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-29T07:50:36.902Z",
    "finishedAt": "2026-10-29T07:50:45.814Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8813,
      "runTimeSecs": 8.813,
      "computeUnits": 0.009792222222222223,
      "imageSizeBytes": 357821440
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Shein Homepage & Home Feed Scraper Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Feed\",\n      \"type\": \"string\",\n      \"description\": \"Which server-rendered SHEIN feed to collect. The home feed is richer (20 products with SKU, SPU, brand, rating, sold count) and is available for US, UK, AU, BR, CA, MX, PH, SG, MY, NZ and ZA; other markets fall back to their root homepage.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"featured\",\n        \"homeFeed\",\n        \"all\"\n      ],\n      \"enumTitles\": [\n        \"Featured products (root homepage)\",\n        \"Home feed (richer, 20 products)\",\n        \"Both feeds\"\n      ],\n      \"default\": \"featured\",\n      \"prefill\": \"featured\"\n    },\n    \"countries\": {\n      \"title\": \"Storefronts\",\n      \"type\": \"array\",\n      \"description\": \"One or more SHEIN storefronts to read. Each storefront returns its own products, local currency and USD comparison prices.\",\n      \"editor\": \"select\",\n      \"uniqueItems\": true,\n      \"minItems\": 1,\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"US\",\n          \"UK\",\n          \"CA\",\n          \"AU\",\n          \"NZ\",\n          \"MX\",\n          \"BR\",\n          \"CL\",\n          \"CO\",\n          \"PE\",\n          \"DE\",\n          \"FR\",\n          \"ES\",\n          \"IT\",\n          \"NL\",\n          \"PT\",\n          \"AT\",\n          \"PL\",\n          \"SE\",\n          \"CH\",\n          \"IL\",\n          \"SA\",\n          \"JP\",\n          \"KR\",\n          \"TW\",\n          \"TH\",\n          \"VN\",\n          \"IN\",\n          \"PH\",\n          \"SG\",\n          \"MY\",\n          \"ZA\"\n        ],\n        \"enumTitles\": [\n          \"United States (USD)\",\n          \"United Kingdom (GBP)\",\n          \"Canada (CAD)\",\n          \"Australia (AUD)\",\n          \"New Zealand (NZD)\",\n          \"Mexico (MXN)\",\n          \"Brazil (BRL)\",\n          \"Chile (CLP)\",\n          \"Colombia (COP)\",\n          \"Peru (PEN)\",\n          \"Germany (EUR)\",\n          \"France (EUR)\",\n          \"Spain (EUR)\",\n          \"Italy (EUR)\",\n          \"Netherlands (EUR)\",\n          \"Portugal (EUR)\",\n          \"Austria (EUR)\",\n          \"Poland (PLN)\",\n          \"Sweden (SEK)\",\n          \"Switzerland (CHF)\",\n          \"Israel (ILS)\",\n          \"Saudi Arabia (SAR)\",\n          \"Japan (JPY)\",\n          \"South Korea (KRW)\",\n          \"Taiwan (TWD)\",\n          \"Thailand (THB)\",\n          \"Vietnam (VND)\",\n          \"India (USD)\",\n          \"Philippines (PHP)\",\n          \"Singapore (SGD)\",\n          \"Malaysia (MYR)\",\n          \"South Africa (ZAR)\"\n        ]\n      },\n      \"default\": [\n        \"US\"\n      ],\n      \"prefill\": [\n        \"US\"\n      ]\n    },\n    \"maxItems\": {\n      \"title\": \"Max Items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on records across all selected storefronts. A root homepage carries 6-14 products and a home feed carries 20; the cap trims records after each storefront is read and stops requesting the remaining storefronts once it is reached.\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 100,\n      \"prefill\": 1\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Shein Homepage & Home Feed Scraper\n\nRead what SHEIN is promoting in 32 storefronts without a login, cookie or proxy setup. The actor collects two server-rendered surfaces: the featured products on each regional homepage and the richer `/home` feed, which adds SKU, SPU, brand, rating, review count, sold count and a sales label. It does not offer keyword search, category browse or product detail pages; SHEIN blocks those anonymous routes (see Limitations).\n\n## What this actor does\n\n- **Three feed modes:** `featured` (root homepage, 32 markets), `homeFeed` (20 richer products in 11 markets, root fallback elsewhere) and `all` (both, deduplicated per market).\n- **Local and USD pricing:** sale price, retail price, discount percentage, plus SHEIN's own USD equivalent for cross-market comparison.\n- **Rich home-feed fields:** brand, SKU, SPU, rating, review count, units sold, sales label and on-sale flag when the feed provides them.\n- **Product links and imagery:** canonical product URLs when the feed has a slug, main image and gallery images.\n- **Empty fields are omitted.** A field SHEIN does not publish for a particular card is left out rather than sent as `null`.\n\n## Services\n\n- **Storefront snapshots:** capture the current featured assortment for one market or all 32 in a single run.\n- **Cross-market price checks:** compare local prices and SHEIN's USD equivalent across storefronts.\n- **Promotion monitoring:** track discount depth, sales labels and on-sale flags over time.\n- **Catalogue seeding:** collect product IDs, titles, links, prices and images for a lightweight starter catalogue.\n- **Assortment research:** see which products each regional storefront chooses to promote.\n\n## How it works\n\nThe actor requests the public storefront page, reads the product data that SHEIN renders into that page, and returns one record per product. No account is used, no cookies are passed in, and no browser is required. If a page is temporarily challenged, the actor retries and then tries a different Apify connection automatically; it never asks you for proxy settings.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `featured` | `featured` reads the root homepage; `homeFeed` reads the richer `/home` feed; `all` reads both and keeps one record per product. |\n| `countries` | array | `[\"US\"]` | Storefronts to read. Choose any of the 32 supported markets; each returns local prices and its own currency. |\n| `maxItems` | integer | `100` | Hard cap on records across all selected storefronts (1–500). Each storefront is read once, then the cap trims the result; once reached, remaining storefronts are not requested. |\n\nEvery field has a default, so a run can start with no changes. Existing tasks that still send the old `country` value keep working: the actor maps it to `countries` in code.\n\n### Example: US featured products\n\n```json\n{\n    \"mode\": \"featured\",\n    \"countries\": [\"US\"],\n    \"maxItems\": 10\n}\n```\n\n### Example: richer home feed for three markets\n\n```json\n{\n    \"mode\": \"homeFeed\",\n    \"countries\": [\"US\", \"UK\", \"BR\"],\n    \"maxItems\": 60\n}\n```\n\n### Example: compare featured and home-feed products\n\n```json\n{\n    \"mode\": \"all\",\n    \"countries\": [\"US\", \"DE\", \"JP\"],\n    \"maxItems\": 200\n}\n```\n\n### Example: legacy input from an existing task\n\n```json\n{\n    \"country\": \"UK\",\n    \"maxItems\": 5\n}\n```\n\n## Output per product\n\n- `productId` — SHEIN goods ID\n- `title` — product name from the feed\n- `url` — product page URL on the matching storefront\n- `countryCode` — storefront code (`US`, `UK`, `DE`, …)\n- `currency` — local ISO currency code\n- `mainImage` — main product image URL\n- `images` — gallery image URLs\n- `salePrice` / `salePriceText` — current price as a number and with its currency symbol\n- `retailPrice` / `retailPriceText` — list price as a number and with its currency symbol\n- `priceUsd` / `retailPriceUsd` — SHEIN's USD equivalent for the sale and retail price\n- `discountPercentage` — discount shown by SHEIN\n- `catId` — SHEIN category ID\n- `brand` — brand name when the card carries one\n- `productSku` — SKU code (home feed)\n- `spu` — SPU identifier (home feed)\n- `rating` — average customer rating when reviews exist\n- `reviewCount` — number of customer reviews\n- `soldCount` — units sold as shown on the card (home feed); a `1.5k+ sold` label becomes `1500`\n- `salesLabel` — sales label such as `800+ sold` (home feed)\n- `isOnSale` — on-sale flag (home feed)\n- `badges` — promotional labels shown on the card\n- `recordType` — `featured` or `homeFeed`\n- `position` — 1-based position in that storefront's returned records (home-feed records come first in `all` mode)\n- `scrapedAt` — UTC scrape timestamp\n\n## Use cases\n\n- **Merchandising teams** — snapshot what each storefront is promoting today.\n- **Pricing analysts** — compare local prices against SHEIN's USD equivalent across markets.\n- **Promotion trackers** — monitor discount depth and sales labels around seasonal events.\n- **Market researchers** — study assortment differences between mature and emerging storefronts.\n- **Data teams** — seed a product catalogue with stable IDs, titles, links and images.\n\n## Usage cost\n\nYou pay for Apify platform usage (run time and memory). There is no per-record charge from this actor and no paid proxy is required. A typical run reads one page per selected storefront, so keeping `countries` focused keeps both runtime and cost down.\n\n## FAQ\n\n**Can I search SHEIN by keyword or browse a category with this actor?**\nNo. Keyword search, category pages and product detail pages currently answer anonymous requests with a SHEIN risk challenge. This actor deliberately stays on the two storefront feeds that work without a login and documents that boundary instead of returning partial or fabricated detail data.\n\n**Why does a market return fewer products than `maxItems`?**\nEach root homepage carries 6–14 products and each home feed carries 20. `maxItems` is a cap, not a quota; the actor never invents products that are not on the page.\n\n**Why are brand, rating, sold count or SKU missing on some records?**\nThose fields live on the richer home feed. Root-homepage cards do not carry them, and even on the home feed a card may omit a brand, rating or sales label. Missing values are omitted.\n\n**Why does `homeFeed` return featured records for some countries?**\nThe `/home` feed is available for US, UK, AU, BR, CA, MX, PH, SG, MY, NZ and ZA. For other markets, and when a feed is temporarily empty, the actor reads the root homepage and labels those records `featured`.\n\n**Are prices live?**\nYes. Every run reads the storefront at run time. Local prices, discounts and USD equivalents reflect that moment.\n\n**Does the featured set change between runs?**\nSHEIN can change its storefront merchandising at any time, but within a short test window the feed is usually stable. Do not assume a new set on every run; schedule the actor at the cadence your use case needs.\n\n**Do I need a proxy or a SHEIN account?**\nNo. The actor works without user credentials and chooses a working connection automatically.\n\n**Is this affiliated with SHEIN?**\nNo. This is an independent third-party actor that reads publicly available storefront pages. It is not affiliated with or endorsed by SHEIN.\n\n## Notes\n\n- 32 storefronts are supported; each record carries the correct local currency and SHEIN's USD equivalent.\n- Home-feed records are richer because the `/home` payload includes SKU, SPU, brand, rating, review count, sold count and a sales label.\n- When both feeds contain the same product in `all` mode, the home-feed record is kept and the root duplicate is dropped.\n- `soldCount` follows the card's sold label, so `800+ sold` becomes `800`; SHEIN's separate internal counter is used only when no label is shown.\n- Records are deduplicated per product and storefront; the same product can appear once for each market.\n- Fields are omitted when empty, so downstream code should treat every optional field as optional.\n\n## Limitations\n\n- **No keyword search, category browse or product detail.** Those routes return a SHEIN risk challenge to anonymous requests from every tested connection, so the actor does not offer them. It is a storefront-feed collector, not a full catalogue scraper.\n- **No variants, sizes, stock or review text.** Those data points exist only on product detail pages, which are part of the same blocked surface.\n- **Fixed row ceiling.** A storefront provides one feed screen: 6–14 root products and 20 home-feed products. There is no reliable anonymous pagination, so a single market tops out at about 34 products; in testing the 32 root pages plus 11 home feeds held about 580 product-and-storefront records (499 unique product IDs).\n- **Home feed is not universal.** The 11 listed markets have the rich feed; other markets return root-homepage records even in `homeFeed` mode.\n- **Conditional fields.** Rating, brand, sales label and gallery images appear only when SHEIN includes them on a card.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "shein-homepage-featured-products-scraper",
      "title": "Shein Homepage & Home Feed Scraper",
      "description": "Collect featured products from SHEIN storefront homepages and the richer home feed: local prices, discounts, rating, reviews, sold counts, brand, SKU and images across 32 markets. No login, no proxy.",
      "version": "2.0",
      "buildTag": "latest",
      "input": {
        "title": "Shein Homepage & Home Feed Scraper Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Feed",
            "type": "string",
            "description": "Which server-rendered SHEIN feed to collect. The home feed is richer (20 products with SKU, SPU, brand, rating, sold count) and is available for US, UK, AU, BR, CA, MX, PH, SG, MY, NZ and ZA; other markets fall back to their root homepage.",
            "editor": "select",
            "enum": [
              "featured",
              "homeFeed",
              "all"
            ],
            "enumTitles": [
              "Featured products (root homepage)",
              "Home feed (richer, 20 products)",
              "Both feeds"
            ],
            "default": "featured",
            "prefill": "featured"
          },
          "countries": {
            "title": "Storefronts",
            "type": "array",
            "description": "One or more SHEIN storefronts to read. Each storefront returns its own products, local currency and USD comparison prices.",
            "editor": "select",
            "uniqueItems": true,
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "US",
                "UK",
                "CA",
                "AU",
                "NZ",
                "MX",
                "BR",
                "CL",
                "CO",
                "PE",
                "DE",
                "FR",
                "ES",
                "IT",
                "NL",
                "PT",
                "AT",
                "PL",
                "SE",
                "CH",
                "IL",
                "SA",
                "JP",
                "KR",
                "TW",
                "TH",
                "VN",
                "IN",
                "PH",
                "SG",
                "MY",
                "ZA"
              ],
              "enumTitles": [
                "United States (USD)",
                "United Kingdom (GBP)",
                "Canada (CAD)",
                "Australia (AUD)",
                "New Zealand (NZD)",
                "Mexico (MXN)",
                "Brazil (BRL)",
                "Chile (CLP)",
                "Colombia (COP)",
                "Peru (PEN)",
                "Germany (EUR)",
                "France (EUR)",
                "Spain (EUR)",
                "Italy (EUR)",
                "Netherlands (EUR)",
                "Portugal (EUR)",
                "Austria (EUR)",
                "Poland (PLN)",
                "Sweden (SEK)",
                "Switzerland (CHF)",
                "Israel (ILS)",
                "Saudi Arabia (SAR)",
                "Japan (JPY)",
                "South Korea (KRW)",
                "Taiwan (TWD)",
                "Thailand (THB)",
                "Vietnam (VND)",
                "India (USD)",
                "Philippines (PHP)",
                "Singapore (SGD)",
                "Malaysia (MYR)",
                "South Africa (ZAR)"
              ]
            },
            "default": [
              "US"
            ],
            "prefill": [
              "US"
            ]
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Hard cap on records across all selected storefronts. A root homepage carries 6-14 products and a home feed carries 20; the cap trims records after each storefront is read and stops requesting the remaining storefronts once it is reached.",
            "editor": "number",
            "minimum": 1,
            "maximum": 500,
            "default": 100,
            "prefill": 1
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Shein Homepage & Home Feed Scraper Output",
        "description": "One record per SHEIN featured or home-feed product, with local and USD pricing, ratings, sold counts, brand, SKU, images and storefront metadata.",
        "properties": {
          "products": {
            "type": "string",
            "title": "Shein products",
            "description": "Dataset containing all scraped SHEIN storefront products.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Shein Homepage & Home Feed Scraper\n\nRead what SHEIN is promoting in 32 storefronts without a login, cookie or proxy setup. The actor collects two server-rendered surfaces: the featured products on each regional homepage and the richer `/home` feed, which adds SKU, SPU, brand, rating, review count, sold count and a sales label. It does not offer keyword search, category browse or product detail pages; SHEIN blocks those anonymous routes (see Limitations).\n\n## What this actor does\n\n- **Three feed modes:** `featured` (root homepage, 32 markets), `homeFeed` (20 richer products in 11 markets, root fallback elsewhere) and `all` (both, deduplicated per market).\n- **Local and USD pricing:** sale price, retail price, discount percentage, plus SHEIN's own USD equivalent for cross-market comparison.\n- **Rich home-feed fields:** brand, SKU, SPU, rating, review count, units sold, sales label and on-sale flag when the feed provides them.\n- **Product links and imagery:** canonical product URLs when the feed has a slug, main image and gallery images.\n- **Empty fields are omitted.** A field SHEIN does not publish for a particular card is left out rather than sent as `null`.\n\n## Services\n\n- **Storefront snapshots:** capture the current featured assortment for one market or all 32 in a single run.\n- **Cross-market price checks:** compare local prices and SHEIN's USD equivalent across storefronts.\n- **Promotion monitoring:** track discount depth, sales labels and on-sale flags over time.\n- **Catalogue seeding:** collect product IDs, titles, links, prices and images for a lightweight starter catalogue.\n- **Assortment research:** see which products each regional storefront chooses to promote.\n\n## How it works\n\nThe actor requests the public storefront page, reads the product data that SHEIN renders into that page, and returns one record per product. No account is used, no cookies are passed in, and no browser is required. If a page is temporarily challenged, the actor retries and then tries a different Apify connection automatically; it never asks you for proxy settings.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `featured` | `featured` reads the root homepage; `homeFeed` reads the richer `/home` feed; `all` reads both and keeps one record per product. |\n| `countries` | array | `[\"US\"]` | Storefronts to read. Choose any of the 32 supported markets; each returns local prices and its own currency. |\n| `maxItems` | integer | `100` | Hard cap on records across all selected storefronts (1–500). Each storefront is read once, then the cap trims the result; once reached, remaining storefronts are not requested. |\n\nEvery field has a default, so a run can start with no changes. Existing tasks that still send the old `country` value keep working: the actor maps it to `countries` in code.\n\n### Example: US featured products\n\n```json\n{\n    \"mode\": \"featured\",\n    \"countries\": [\"US\"],\n    \"maxItems\": 10\n}\n```\n\n### Example: richer home feed for three markets\n\n```json\n{\n    \"mode\": \"homeFeed\",\n    \"countries\": [\"US\", \"UK\", \"BR\"],\n    \"maxItems\": 60\n}\n```\n\n### Example: compare featured and home-feed products\n\n```json\n{\n    \"mode\": \"all\",\n    \"countries\": [\"US\", \"DE\", \"JP\"],\n    \"maxItems\": 200\n}\n```\n\n### Example: legacy input from an existing task\n\n```json\n{\n    \"country\": \"UK\",\n    \"maxItems\": 5\n}\n```\n\n## Output per product\n\n- `productId` — SHEIN goods ID\n- `title` — product name from the feed\n- `url` — product page URL on the matching storefront\n- `countryCode` — storefront code (`US`, `UK`, `DE`, …)\n- `currency` — local ISO currency code\n- `mainImage` — main product image URL\n- `images` — gallery image URLs\n- `salePrice` / `salePriceText` — current price as a number and with its currency symbol\n- `retailPrice` / `retailPriceText` — list price as a number and with its currency symbol\n- `priceUsd` / `retailPriceUsd` — SHEIN's USD equivalent for the sale and retail price\n- `discountPercentage` — discount shown by SHEIN\n- `catId` — SHEIN category ID\n- `brand` — brand name when the card carries one\n- `productSku` — SKU code (home feed)\n- `spu` — SPU identifier (home feed)\n- `rating` — average customer rating when reviews exist\n- `reviewCount` — number of customer reviews\n- `soldCount` — units sold as shown on the card (home feed); a `1.5k+ sold` label becomes `1500`\n- `salesLabel` — sales label such as `800+ sold` (home feed)\n- `isOnSale` — on-sale flag (home feed)\n- `badges` — promotional labels shown on the card\n- `recordType` — `featured` or `homeFeed`\n- `position` — 1-based position in that storefront's returned records (home-feed records come first in `all` mode)\n- `scrapedAt` — UTC scrape timestamp\n\n## Use cases\n\n- **Merchandising teams** — snapshot what each storefront is promoting today.\n- **Pricing analysts** — compare local prices against SHEIN's USD equivalent across markets.\n- **Promotion trackers** — monitor discount depth and sales labels around seasonal events.\n- **Market researchers** — study assortment differences between mature and emerging storefronts.\n- **Data teams** — seed a product catalogue with stable IDs, titles, links and images.\n\n## Usage cost\n\nYou pay for Apify platform usage (run time and memory). There is no per-record charge from this actor and no paid proxy is required. A typical run reads one page per selected storefront, so keeping `countries` focused keeps both runtime and cost down.\n\n## FAQ\n\n**Can I search SHEIN by keyword or browse a category with this actor?**\nNo. Keyword search, category pages and product detail pages currently answer anonymous requests with a SHEIN risk challenge. This actor deliberately stays on the two storefront feeds that work without a login and documents that boundary instead of returning partial or fabricated detail data.\n\n**Why does a market return fewer products than `maxItems`?**\nEach root homepage carries 6–14 products and each home feed carries 20. `maxItems` is a cap, not a quota; the actor never invents products that are not on the page.\n\n**Why are brand, rating, sold count or SKU missing on some records?**\nThose fields live on the richer home feed. Root-homepage cards do not carry them, and even on the home feed a card may omit a brand, rating or sales label. Missing values are omitted.\n\n**Why does `homeFeed` return featured records for some countries?**\nThe `/home` feed is available for US, UK, AU, BR, CA, MX, PH, SG, MY, NZ and ZA. For other markets, and when a feed is temporarily empty, the actor reads the root homepage and labels those records `featured`.\n\n**Are prices live?**\nYes. Every run reads the storefront at run time. Local prices, discounts and USD equivalents reflect that moment.\n\n**Does the featured set change between runs?**\nSHEIN can change its storefront merchandising at any time, but within a short test window the feed is usually stable. Do not assume a new set on every run; schedule the actor at the cadence your use case needs.\n\n**Do I need a proxy or a SHEIN account?**\nNo. The actor works without user credentials and chooses a working connection automatically.\n\n**Is this affiliated with SHEIN?**\nNo. This is an independent third-party actor that reads publicly available storefront pages. It is not affiliated with or endorsed by SHEIN.\n\n## Notes\n\n- 32 storefronts are supported; each record carries the correct local currency and SHEIN's USD equivalent.\n- Home-feed records are richer because the `/home` payload includes SKU, SPU, brand, rating, review count, sold count and a sales label.\n- When both feeds contain the same product in `all` mode, the home-feed record is kept and the root duplicate is dropped.\n- `soldCount` follows the card's sold label, so `800+ sold` becomes `800`; SHEIN's separate internal counter is used only when no label is shown.\n- Records are deduplicated per product and storefront; the same product can appear once for each market.\n- Fields are omitted when empty, so downstream code should treat every optional field as optional.\n\n## Limitations\n\n- **No keyword search, category browse or product detail.** Those routes return a SHEIN risk challenge to anonymous requests from every tested connection, so the actor does not offer them. It is a storefront-feed collector, not a full catalogue scraper.\n- **No variants, sizes, stock or review text.** Those data points exist only on product detail pages, which are part of the same blocked surface.\n- **Fixed row ceiling.** A storefront provides one feed screen: 6–14 root products and 20 home-feed products. There is no reliable anonymous pagination, so a single market tops out at about 34 products; in testing the 32 root pages plus 11 home feeds held about 580 product-and-storefront records (499 unique product IDs).\n- **Home feed is not universal.** The 11 listed markets have the rich feed; other markets return root-homepage records even in `homeFeed` mode.\n- **Conditional fields.** Rating, brand, sales label and gallery images appear only when SHEIN includes them on a card.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Shein Homepage & Home Feed Products",
          "fields": {
            "type": "object",
            "properties": {
              "productId": {
                "type": "string",
                "description": "SHEIN goods ID."
              },
              "title": {
                "type": "string",
                "description": "Product name exactly as shown on the feed."
              },
              "url": {
                "type": "string",
                "description": "Product URL on the matching storefront. Uses the canonical slug when the feed provides one."
              },
              "countryCode": {
                "type": "string",
                "description": "Storefront code the record came from (US, UK, DE, ...)."
              },
              "currency": {
                "type": "string",
                "description": "ISO currency code of the storefront."
              },
              "mainImage": {
                "type": "string",
                "nullable": true,
                "description": "Main product image URL."
              },
              "images": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Gallery image URLs when the feed provides them."
              },
              "salePrice": {
                "type": "number",
                "nullable": true,
                "description": "Current sale price in the local currency."
              },
              "salePriceText": {
                "type": "string",
                "nullable": true,
                "description": "Sale price formatted with the local currency symbol."
              },
              "retailPrice": {
                "type": "number",
                "nullable": true,
                "description": "Retail (list) price in the local currency."
              },
              "retailPriceText": {
                "type": "string",
                "nullable": true,
                "description": "Retail price formatted with the local currency symbol."
              },
              "priceUsd": {
                "type": "number",
                "nullable": true,
                "description": "SHEIN's USD equivalent of the sale price."
              },
              "retailPriceUsd": {
                "type": "number",
                "nullable": true,
                "description": "SHEIN's USD equivalent of the retail price."
              },
              "discountPercentage": {
                "type": "integer",
                "nullable": true,
                "description": "Discount percentage shown by SHEIN."
              },
              "catId": {
                "type": "string",
                "nullable": true,
                "description": "SHEIN category ID."
              },
              "brand": {
                "type": "string",
                "nullable": true,
                "description": "Brand name when the feed carries one."
              },
              "productSku": {
                "type": "string",
                "nullable": true,
                "description": "SHEIN SKU code (home feed only)."
              },
              "spu": {
                "type": "string",
                "nullable": true,
                "description": "SHEIN SPU identifier (home feed only)."
              },
              "rating": {
                "type": "number",
                "nullable": true,
                "description": "Average customer rating when the product has reviews."
              },
              "reviewCount": {
                "type": "integer",
                "nullable": true,
                "description": "Number of customer reviews when available."
              },
              "soldCount": {
                "type": "integer",
                "nullable": true,
                "description": "Units sold as shown on the card (home feed only); a 1.5k+ sold label becomes 1500."
              },
              "salesLabel": {
                "type": "string",
                "nullable": true,
                "description": "Sales label shown by SHEIN, e.g. 800+ sold."
              },
              "isOnSale": {
                "type": "boolean",
                "nullable": true,
                "description": "Whether SHEIN marks the product as on sale (home feed only)."
              },
              "badges": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Promotional labels shown on the product card."
              },
              "recordType": {
                "type": "string",
                "enum": [
                  "featured",
                  "homeFeed"
                ],
                "description": "Which feed produced the record."
              },
              "position": {
                "type": "integer",
                "description": "1-based position in that storefront's returned records (home-feed records come first in all mode)."
              },
              "scrapedAt": {
                "type": "string",
                "description": "UTC timestamp of the scrape in ISO 8601 format."
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.1",
    "imageDigest": "045a7bb982c33dd29a5d39ee561e3266b01203c154a4e49b65cc28abbc7e1bb4",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.009792222222222223
    }
  }
}