# Target Product & Local Store Scraper (`hypebridge/target-product-scraper`) Actor

Gives you local prices and inventory by US ZIP code or exact store ID, full product details, and up to 1,000 full customer reviews per product in one workflow.

- **URL**: https://apify.com/hypebridge/target-product-scraper.md
- **Developed by:** [Hypebridge](https://apify.com/hypebridge) (community)
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 basic products

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Target scraper with ZIP-code pricing, full product details and reviews

**Target Product & Local Store Scraper** gives you **local prices and inventory by US ZIP code or exact store ID**, **full product details**, and **up to 1,000 full customer reviews per product** in one workflow.

Enter a ZIP code to find a nearby Target store automatically, or choose a store ID for repeatable local price and stock tracking. Enrich products with available UPC/DPCI, exact variant identity, descriptions, specifications, unit prices, ingredients and nutrition facts. Collect full review text, ratings, dates, verified-purchase flags, photo links and helpfulness votes for customer-feedback analysis.

Discover products from keywords, categories, direct product links or TCINs, the homepage and supported retail landing pages. Export one record per unique product as JSON, CSV or Excel, with reviews nested under the product they belong to.

[Strengths](#why-choose-this-target-scraper) · [Examples](#how-to-scrape-target-products) · [Pricing](#how-much-does-this-target-scraper-cost) · [Input options](#target-scraper-input-options) · [FAQ](#faq)

### Why choose this Target scraper?

When comparing Target actors, check what the returned data actually represents. A price, a review count and a successful run status each need context.

| What to compare | What this Actor provides | Why it matters |
|---|---|---|
| **Which store does the price belong to?** | Checks price/store identity. A price tagged with another store is omitted and flagged, while valid product data is retained. | Avoid mixing an online or another location's price into a local-store comparison. |
| **Is this the exact variant requested?** | Preserves the requested child TCIN, with parent TCIN and available UPC/DPCI separately. Direct product links and TCINs always request full details. | Match the right size, flavor or variant to your own catalog. |
| **Does discovery extend beyond keyword search?** | Supports search, categories, home and supported merchandising pages, including visible carousel products and tabs. | Research seasonal assortments and promoted products from the page you supplied. |
| **Are reviews full records or just totals?** | Optional review bodies, ratings, original dates, verification flags, votes, photos and collection status. Shared parent review pools are labeled. | Analyze customer feedback with clear product scope. |
| **Can grocery products be compared fairly?** | Available unit prices, normalized units, size text, ingredients and nutrition facts. | Compare value per ounce or fluid ounce rather than package price alone. |
| **Can you tell whether collection stopped early?** | Source-level completion reports, original source URLs, timestamps and explicit limit/error reasons. Earlier results survive later source failures. | Separate a complete collection from a capped or interrupted one. |
| **Can enrichment costs be controlled?** | Basic listing mode, optional details/reviews, one global product cap and spending-limit handling. | Pay for the depth needed by your workflow. |

#### Tested coverage

US validation on October 16, 2026 included:

- **80 unique products from the homepage** and **80 from a Halloween landing page**, across several product groups. The landing-page sample also progressed to a later tab.
- **10/10 fresh landing-page checks** across stores 775 and 1396 on the final discovery version. Earlier home checks passed 10/10; the larger home sample also passed after the final tab change.
- **1,000 full reviews on one product**, plus a separate collection of **200 reviews across 10 products**.
- Exact child/parent/barcode checks, different local milk prices at two stores, and billing counts matched to saved output.

These are measured samples, not a guarantee for every Target page or future site change. Missing data and partial results remain visible in the output.

### How to scrape Target products

1. Open the Actor and choose search terms, Target URLs or TCINs.
2. Set `maxItems` for the total number of unique products you want.
3. Enter a US `zipCode`, or use `storeId` for an exact location.
4. Enable product details or reviews when needed.
5. Start the run. Download products from **Dataset** and check the linked collection summary for coverage.

#### Search products with local availability

```json
{
  "searchQueries": ["whole milk"],
  "zipCode": "77505",
  "maxItems": 50
}
```

#### Get exact products and full reviews

```json
{
  "tcins": ["13276134", "54640214"],
  "storeId": "775",
  "maxItems": 2,
  "getProductReviews": true,
  "maxReviewsPerProduct": 60
}
```

Reviews automatically enable product details. Direct TCINs and product URLs request details even when `getProductDetails` is false.

#### Enrich products from a category

```json
{
  "startUrls": [
    { "url": "https://www.target.com/c/milk-dairy-grocery/-/N-5xszh" }
  ],
  "storeId": "1396",
  "maxItems": 30,
  "getProductDetails": true
}
```

#### Discover products on a seasonal landing page

```json
{
  "startUrls": [
    { "url": "https://www.target.com/c/halloween/-/N-5xt2o" }
  ],
  "storeId": "1396",
  "maxItems": 80,
  "maxPagesPerSearch": 12
}
```

Use `https://www.target.com/` to start from the homepage. Products must appear in supported visible product cards on the submitted page; promotional links alone are not treated as product listings.

### What data can this Target scraper extract?

| Fields | Type | What you get |
|---|---|---|
| `tcin`, `parentTcin`, `upc`, `dpci` | Strings | Exact product identity and available barcode/department identifiers. UPC requires successful details. |
| `title`, `brand`, `url`, `imageUrl` | Strings | Product name, brand, product link and image link. |
| `price`, `regularPrice`, `promoPrice`, `isOnSale`, `discountPercent`, `currency` | Numbers/boolean/strings | Available store-context prices and savings in USD. |
| `unitPrice`, `unit`, `sizeText`, `isHouseBrand` | Number/strings/boolean | Available unit pricing, package size and Target house-brand flag. |
| `inStock`, `soldOut`, `fulfillment` | Booleans/object | Separate pickup, drive-up, same-day delivery and shipping availability; unknown stays null. |
| `storeLocation`, `storeStockCount`, `aisle` | Object/number/string | Resolved store profile and local quantity/aisle where supplied. |
| `rating`, `reviewCount` | Numbers | Aggregate rating and rating count, separate from collected review bodies. |
| `descriptionHtml`, `bulletPoints`, `specifications`, `ingredients`, `nutritionFacts`, `variants` | Strings/arrays/objects | Available detail enrichment, including grocery data and variants. |
| `reviews`, `reviewsFetched`, `reviewStatus`, `reviewCollection` | Array/number/string/object | Full review records, retained count, outcome and product/pool scope. |
| `reviewPoolId`, `reviewSourceUrl`, `reviewPagesFetched`, `ratingDistribution` | Strings/number/object | Review provenance, collection progress and available rating distribution. |
| `sourceType`, `sourceUrl`, `searchQuery`, `market`, `language`, `scrapedAt` | Strings | Input provenance, US/en-US scope and UTC collection time. |
| `priceErrorCode`, `priceSourceStoreId`, `enrichError`, `enrichErrorCode`, `reviewError` | Strings/boolean | Reasons a price was omitted or enrichment was incomplete. |

Optional source values remain null when unavailable. Basic carousel records can omit brand, DPCI, UPC and parent identity; enable details when you need those fields. Nutrition, ingredients, promotions, aisle and stock counts vary by product and source.

#### Example product output

Recorded US example from October 16, 2026; additional fields omitted. Prices and availability change over time.

```json
{
  "tcin": "13276134",
  "parentTcin": "94602358",
  "upc": "085239284056",
  "title": "Vitamin D Whole Milk - 1gal - Good & Gather™",
  "brand": "Good & Gather",
  "price": 3.59,
  "currency": "USD",
  "unitPrice": 0.03,
  "unit": "fl oz",
  "inStock": true,
  "storeLocation": {
    "storeId": "775",
    "city": "Tyler",
    "state": "TX"
  },
  "sourceUrl": "https://www.target.com/p/-/A-13276134",
  "market": "US",
  "language": "en-US",
  "scrapedAt": "2026-10-16T20:52:23.036Z"
}
```

Full reviews stay nested in each product's `reviews` array. They include available IDs, title/text, rating and scale, original timestamps, author, verified-purchase and recommendation flags, incentivized/syndicated flags, helpful/unhelpful votes, photo URLs and secondary ratings. A pooled parent review is labeled as pooled rather than presented as child-specific feedback. JSON exports preserve the nested structure.

### How much does this Target scraper cost?

Pay per saved product, with an additional charge for retained full review bodies and a memory-based startup charge.

| Charge | Standard / FREE tier | GOLD and higher |
|---|---:|---:|
| Basic product | **$6 / 1,000** | $4 / 1,000 |
| Detailed product | **$16 / 1,000** | $10.67 / 1,000 |
| Full review body | **$0.50 / 1,000** | $0.33 / 1,000 |
| Startup, per GiB allocated | $0.02 | $0.01333 |

A detailed-product charge **replaces** the basic charge. Direct products and products with requested reviews use the detailed rate. Aggregate ratings and review counts add no review charge. BRONZE/SILVER discounts fall between the standard and GOLD rates.

At default memory and standard prices:

- **100 basic search products:** $0.62, including $0.02 startup.
- **80 basic home/landing products:** $0.56, including $0.08 startup.
- **One direct product with 20 full reviews:** $0.046, including $0.02 startup.

Query/TCIN-only runs default to 1 GiB; URL runs default to 4 GiB. Startup applies even to empty or unsupported-only runs. Examples assume the stated quantities are returned. Reviews are deduplicated within each product; when several children share a parent pool, reviews can appear and be billed in each product's saved collection.

Spending limits can shorten a review collection and stop further output. The saved record and source report identify this as `charge_limit`.

### Target scraper input options

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array | `[]` | Up to 5,000 US Target product, search, category, home, retail landing or store URLs. Strings and `{ "url": "…" }` accepted. |
| `maxItems` | Integer | `50` | Global unique-product cap across all sources, 1–5,000. |
| `getProductDetails` | Boolean | `false` | Enrich discovered products with available full details. Direct products always request details. |
| `getProductReviews` | Boolean | `false` | Attach full customer reviews; also enables product details. |
| `maxReviewsPerProduct` | Integer | `20` | Maximum unique reviews per product, 1–1,000; other limits can stop sooner. |
| `maxReviewPagesPerProduct` | Integer | `10` | Review collection-page budget, 1–50, including failed pages. |
| `searchQueries` | Array of strings | `[]` | Up to 100 search terms, each 1–200 characters. |
| `tcins` | Array of strings | `[]` | Up to 5,000 exact Target item IDs, each 8–10 digits. |
| `zipCode` | String | `"77001"` | Five-digit US ZIP for nearby-store resolution. |
| `storeId` | String | Omitted | Exact US Target store ID; overrides ZIP/store-URL resolution. |
| `maxPagesPerSearch` | Integer | `50` | Per-source collection budget, 1–50. Home/landing budgets include the page and product groups; use at least 2. Review pages have a separate budget. |
| `debugMode` | Boolean | `false` | Save bounded failure diagnostics for troubleshooting. |

Supported URLs include Target product `/p/…/-/A-{tcin}`, search `/s?searchTerm=…`, category `/c/…/-/N-{id}`, homepage and supported retail overview pages. Submitted category offsets and supported sorting/filter choices are preserved. Store URLs set location context; they do not request the store's entire catalog. Inputs share a 5,000-source cap and a 256 KiB input-size limit.

### Limits and completion reports

**US catalog only:** records use `market=US`, `language=en-US` and `currency=USD`. Target Australia and other unsupported hosts are warned and skipped. Malformed individual URLs are skipped; empty input finishes with zero products. An invalid explicit store returns an error rather than silently selecting another location.

Search/category collection advances until the item cap, page cap or verified source end. Home/landing coverage is limited to supported visible product groups and tabs. Unknown page layouts or continuations are reported as incomplete/unsupported, with earlier products retained. Universal coverage of every Target template is not claimed.

The linked `PAGINATION_SUMMARY` and individual source reports distinguish `exhausted`, `limited`, `unsupported` and `error`. Limits are not presented as full-catalog completion. `reviewStatus` distinguishes `not_requested`, `complete`, `empty`, `truncated`, `error` and `partial_error`; previously collected reviews survive a later failure.

Large review collections can stop before the requested count because of page, spending or output-size limits. Review text is capped at 16 KiB, photo links at ten per review, and each product record at 1 MiB. A truncated record states why collection stopped.

### FAQ

#### Can I collect up to 1,000 reviews per product?

Set `getProductReviews=true`, `maxReviewsPerProduct=1000` and `maxReviewPagesPerProduct=50`. The default ten-page budget can stop collection earlier. Availability, spending and record-size limits still apply. `reviewCollection.totalAvailable` describes written reviews and can differ from the aggregate rating count in `reviewCount`.

#### Why is a price or stock field null?

Target may omit that value, a collection step may be interrupted, or the returned price may belong to another store. Check `priceErrorCode`, `priceSourceStoreId`, enrichment flags and the source report. Missing stock is unknown, not automatically out of stock.

#### Are products and reviews separate dataset rows?

Each unique TCIN gets one product row, with reviews nested inside it. The product limit counts products. Parent review pools are labeled, and the original child TCIN is preserved.

#### Can I automate this from an API or n8n?

Use the **API** tab, Apify schedules and webhooks, or call the Actor from an n8n workflow through an Apify integration or HTTP request. JSON is the best export format when retaining full nested reviews.

### Support

Open the Actor's **Issues** tab with your run link, input URL or TCIN, store ID/ZIP, and the result you expected. Include the source report when a collection is incomplete.

Independent tool for publicly available Target.com data; not affiliated with Target Corporation.

# Actor input Schema

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

Target direct PDP, search, category, home, or overview URLs. Home/overview extracts only visible product cards/links from the submitted page; no recursive category crawl.

## `maxItems` (type: `integer`):

Maximum number of total products to extract across all queries and URLs.

## `getProductDetails` (type: `boolean`):

Enrich products discovered on search/category/home/overview pages with full PDP details. Direct PDP URLs and TCINs always return details. getProductReviews automatically enables details for discovered products.

## `getProductReviews` (type: `boolean`):

Attach paginated full reviews to each product, including direct PDP URLs and TCINs. Automatically enables product details for products discovered on search/category/home/overview pages. Off keeps existing aggregate ratings/counts without review-body requests.

## `maxReviewsPerProduct` (type: `integer`):

Maximum unique reviews attached to one product; the review page limit can stop collection sooner. maxItems still counts products.

## `maxReviewPagesPerProduct` (type: `integer`):

Hard maximum logical review pages attempted per product, including failed pages (up to 50 reviews/page). At most two retries per page and 3 times this limit in total HTTP attempts.

## `searchQueries` (type: `array`):

Keywords to search on Target.com (e.g. 'organic whole milk', 'air fryer', 'lego star wars').

## `tcins` (type: `array`):

Direct 8-to-10 digit Target Item Numbers (e.g. '13276134', '54640214').

## `zipCode` (type: `string`):

US ZIP code to resolve the nearest physical Target store for localized shelf prices, inventory, and address metadata. (e.g. '90210', '77001', '10001').

## `storeId` (type: `string`):

Optional direct Target Store ID (e.g. '775', '1396'). Overrides zipCode lookup if provided.

## `maxPagesPerSearch` (type: `integer`):

Shared discovery budget per seed. Search/category count listing pages; home/overview count each document and module API read, so use at least 2 for those sources. Stops at maxItems, verified source exhaustion, or this cap. Defaults to 50. Review pages use a separate limit.

## `debugMode` (type: `boolean`):

Save bounded sanitized failure HTML/JSON and available screenshots for diagnosis. Off by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.target.com/s?searchTerm=whole%20milk"
    }
  ],
  "maxItems": 50,
  "getProductDetails": false,
  "getProductReviews": false,
  "maxReviewsPerProduct": 20,
  "maxReviewPagesPerProduct": 10,
  "searchQueries": [],
  "zipCode": "77001",
  "maxPagesPerSearch": 50,
  "debugMode": false
}
```

# Actor output Schema

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

All products including nested reviews.

## `pagination` (type: `string`):

Source completion, limits and errors.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.target.com/s?searchTerm=whole%20milk"
        }
    ],
    "searchQueries": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("hypebridge/target-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.target.com/s?searchTerm=whole%20milk" }],
    "searchQueries": [],
}

# Run the Actor and wait for it to finish
run = client.actor("hypebridge/target-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.target.com/s?searchTerm=whole%20milk"
    }
  ],
  "searchQueries": []
}' |
apify call hypebridge/target-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hypebridge/target-product-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/glZuPmiInwFUshfHX/builds/dUH1ia4tc9YxQW5ZT/openapi.json
