# Target Scraper — Products, Prices, Stock & Reviews (`tortuga/target-scraper`) Actor

Scrape Target.com search, category, brand and product pages: price, regular price, sale and clearance flags, Circle offers, stock, store pickup, UPC, variants and reviews.

- **URL**: https://apify.com/tortuga/target-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** E-commerce
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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: Products, Prices, Stock & Reviews

Scrape Target.com search results, category pages, brand pages and product pages into a clean dataset: price, regular price, sale and clearance flags, savings, promotions and Circle offers, rating, review count, online stock, store pickup and in-store stock for any Target store or ZIP code, DPCI, images, badges and rank. Turn on details for the UPC, category path, specifications, description and every variant (color / size) with its own price, and turn on reviews for the review texts.

No browser and no login: the Actor reads the same public JSON that target.com loads in your browser, so one request returns 24 products. Download the results as JSON, CSV or Excel, or pull them through the API into your own app, Google Sheets or an LLM pipeline. You pay per item you get.

### What data does Target Scraper extract?

Every product from a search, category or brand page (the `result` event):

| Field | Description |
|---|---|
| `type` | `"product"` |
| `tcin`, `parentTcin` | Target item number (the digits after `/A-` in the URL) and, for a color / size variant, the item number of its parent product |
| `dpci` | Target's store item number (department-class-item, e.g. `057-10-8384`), printed on shelf tags |
| `upc` | Barcode. Filled with **Include product details** on (or for product URLs); search tiles do not carry it |
| `name`, `brand`, `url`, `imageUrl`, `images` | Title, brand, product URL, main image and all images shown on the tile |
| `price`, `priceText`, `currency` | Current price (`USD`) and the price as displayed |
| `regularPrice`, `wasPrice` | Target's regular price and the struck-through comparison price ("reg $59.99") when shown |
| `priceType` | Target's own price label: `reg`, `sale`, `clearance` |
| `isOnSale`, `isClearance`, `savingsAmount`, `savingsPercent` | Sale and clearance flags, savings in dollars and percent |
| `priceMin`, `priceMax`, `regularPriceMin`, `regularPriceMax` | Price range when a product is shown as a range ("$139.99 - $169.95") |
| `priceNote` | e.g. `When purchased online` |
| `promotions`, `hasCircleOffer` | Promotions on the product: `{promotionId, message, type, rewardType, rewardValue, thresholdType, thresholdValue, isCircleOffer, channel}`, e.g. "Buy 1, get 1 50% off Hanes clothing" |
| `rating`, `reviewCount` | Average rating (0-5) and number of ratings |
| `availability`, `inStock` | Online / shipping status (`IN_STOCK`, `OUT_OF_STOCK`, `UNAVAILABLE`, ...) and an overall boolean |
| `storeAvailability` | Store pickup status at the chosen store (`IN_STOCK`, `UNAVAILABLE`, ...); `null` without a store |
| `fulfillment` | `{shippingStatus, shippingMinDeliveryDate, shippingMaxDeliveryDate, isTwoDayShipping, freeShipping, storeId, storeName, pickupStatus, pickupDate, inStoreStatus, storeQuantity, aisle, soldOut, outOfStockInAllStores}` |
| `badges` | `Bestseller`, `New at Target`, `Rarely returned`, `4k+ bought in last month`, ... |
| `isSponsored` | `true` for sponsored products. A product shown as an ad and as an organic result is saved once, as organic |
| `categoryId`, `productType`, `variantOptions` | Target category id, product type (`Headphones`) and the variant dimensions (`[{name: "Color", values: ["Black", "Pink"]}]`) |
| `position`, `page` | Rank among the tiles of the search (ads included, in display order) and page number |
| `searchTerm`, `sourceUrl`, `storeId`, `scrapedAt` | Provenance |
| `changeType`, `previousValues` | Only with **Only new or changed items** on (see below) |

With **Include product details** on, or for product URLs / TCINs (the extra `detail` event), each product also gets:

| Field | Description |
|---|---|
| `upc`, `category`, `categoryPath` | Barcode and Target's category breadcrumb (`["Electronics & Tech", "Headphones", "Earbuds"]`) |
| `description`, `highlights` | Full description and the highlight bullets |
| `specifications`, `warranty` | Target's specification table as a dict (`{"Connection Type": "USB-C", ...}`) and the warranty text |
| `variants`, `variantCount`, `selectedOptions` | Every variant: `{tcin, name, options: {Color: "Black"}, price, regularPrice, wasPrice, priceType, upc, dpci, url, imageUrl, isShippingAvailable, isSoldOut}`; for a variant, its own option values |
| `ratingDistribution`, `reviewsWithText`, `recommendedPercentage`, `questionCount`, `secondaryRatings` | 1-5 star breakdown, written reviews, "would recommend" share, Q\&A count, sub-ratings (`quality`, `value`, ...) |
| `isMarketplace`, `soldBy` | Target Plus marketplace flag and the seller (`Target` for Target's own items) |
| `returnPolicy`, `packageDimensions`, `purchaseLimit`, `origin`, `department` | Return window and method, package size and weight, order limit, `Imported` / `Made in the USA`, Target department |

With **Include reviews** on (the `review` event), one item per review:

| Field | Description |
|---|---|
| `type` | `"review"` |
| `tcin`, `productName`, `productUrl` | Reviewed item (for variants Target keeps reviews on the parent product) |
| `reviewId`, `rating`, `title`, `text`, `submittedAt`, `modifiedAt` | Review id, stars (1-5), title, text, ISO dates |
| `reviewerName` | Reviewer's nickname as Target shows it |
| `verifiedPurchase`, `recommended`, `badges`, `isIncentivized` | Verified purchaser flag, "would recommend", badges, incentivized review flag |
| `positiveFeedback`, `negativeFeedback` | Helpful / not helpful votes |
| `photosCount`, `photos`, `videosCount` | Customer photos (image URLs) and number of videos |
| `secondaryRatings` | Sub-ratings the reviewer gave (`{"quality": 5, "value": 4}`) |
| `isSyndicated`, `syndicatedFrom` | Reviews copied from the brand's own site (`sharkninja.com`) |
| `sellerResponse`, `sellerResponseBy`, `sellerResponseDate` | Brand / seller reply when present |

### How to use Target Scraper

1. Type one or more **Search terms** (one per line), and/or paste **Start URLs**: search pages (`/s?searchTerm=...`), category pages (`/c/.../-/N-5xteg`), brand pages (`/b/.../-/N-...`) or product pages (`/p/.../-/A-89827259`). Filters you applied on target.com stay in the URL and are respected. You can also list TCINs in **Product IDs**.
2. Optionally pick **Sort by**, a **Min / Max price**, and a **Store ID** or **ZIP code** for store pickup stock.
3. Set **Max items** to cap the run (and the cost). Products and reviews both count. With several searches, **Max products per search** gives each its share.
4. Turn on **Include product details** and/or **Include reviews** only if you need them.

### Input example

```json
{
  "searchTerms": ["air fryer"],
  "startUrls": [
    { "url": "https://www.target.com/c/headphones-electronics-tech/-/N-5xteg" },
    { "url": "https://www.target.com/p/apple-earpods-usb-c/-/A-89827259" }
  ],
  "maxItems": 200,
  "sortBy": "bestselling",
  "zipCode": "10001",
  "includeDetails": true,
  "includeReviews": false
}
```

### Output example

```json
{
  "type": "product",
  "tcin": "85978609",
  "parentTcin": null,
  "dpci": "057-10-8384",
  "upc": null,
  "name": "Apple AirPods Pro 3 Wireless Earbuds with Active Noise Cancellation",
  "brand": "Apple",
  "url": "https://www.target.com/p/ap2022-true-wireless-bluetooth-headphones/-/A-85978609",
  "imageUrl": "https://target.scene7.com/is/image/Target/GUEST_d1b8c229-751b-430b-a0fb-521d7777a784",
  "price": 199.99,
  "regularPrice": 249.99,
  "wasPrice": 249.99,
  "priceText": "$199.99",
  "priceType": "sale",
  "isOnSale": true,
  "isClearance": false,
  "savingsAmount": 50.0,
  "savingsPercent": 20.0,
  "currency": "USD",
  "promotions": [
    { "promotionId": "584387474", "message": "Get the AirPods Pro 3 starting at $24/mo.", "type": "No Discount",
      "rewardType": "NoDiscount", "rewardValue": 0.0, "isCircleOffer": false, "channel": "online_and_store" }
  ],
  "hasCircleOffer": false,
  "rating": 3.92,
  "reviewCount": 2192,
  "availability": "IN_STOCK",
  "inStock": true,
  "storeAvailability": "IN_STOCK",
  "fulfillment": {
    "shippingStatus": "IN_STOCK", "shippingMinDeliveryDate": "2026-10-11", "shippingMaxDeliveryDate": "2026-10-11",
    "isTwoDayShipping": true, "freeShipping": true, "storeId": "1176", "storeName": "Arlington Heights",
    "pickupStatus": "IN_STOCK", "pickupDate": "2026-10-10", "inStoreStatus": "IN_STOCK", "storeQuantity": 10,
    "aisle": "D 30", "soldOut": false, "outOfStockInAllStores": false
  },
  "badges": ["Bestseller"],
  "isSponsored": false,
  "categoryId": "4sbu8",
  "productType": "Headphones",
  "position": 15,
  "page": 1,
  "searchTerm": "headphones",
  "storeId": "1176",
  "scrapedAt": "2026-10-10T07:38:43+00:00"
}
```

A review item:

```json
{
  "type": "review",
  "tcin": "91747218",
  "productName": "Beats Solo 4 Bluetooth Wireless On-Ear Headphones - Cloud Pink",
  "productUrl": "https://www.target.com/p/beats-solo-4-bluetooth-wireless-on-ear-headphones-cloud-pink/-/A-91747218",
  "reviewId": "09dd01b0-6057-4efb-ab8b-183f9dcf53fa",
  "rating": 5.0,
  "title": "Worth $",
  "text": "The presentation/ unboxing was my favorite part sounds grate would recommend",
  "submittedAt": "2026-09-26T14:21:43.000+00:00",
  "modifiedAt": "2026-09-28T09:58:49.000+00:00",
  "reviewerName": "John",
  "verifiedPurchase": true,
  "recommended": true,
  "badges": ["verifiedPurchaser"],
  "positiveFeedback": 0,
  "negativeFeedback": 2,
  "photosCount": 0,
  "photos": [],
  "isSyndicated": false,
  "sellerResponse": null
}
```

### How much does it cost?

Pay per item, no subscription:

| Event | Price | When |
|---|---|---|
| Product (`result`) | $0.0025 | Every product saved: price, stock, rating, promotions, images |
| Product details (`detail`) | $0.0015 | Extra, per product whose details are fetched (Include product details, product URLs, TCINs) |
| Review (`review`) | $0.0005 | Every review saved |

1,000 products from search cost $2.50 (with details $4.00). Platform usage is small: the Actor runs on 512 MB and reads 24 products per request through Apify's datacenter proxy. In our test, 1,300 products took 124 requests and less than $0.01 of platform usage.

### How to scrape Target search results by keyword

Type the keywords into **Search terms**. Each term is read page by page (24 products per page) until **Max items** is reached. Target shows at most 1,200 products for one search; when you ask for more, the Actor splits the search into price ranges automatically and reads each range, so large categories can be collected completely. Results are deduplicated by TCIN.

### How to track Target prices, sales and clearance

Every product carries `price`, `regularPrice`, `wasPrice`, `priceType` (`reg` / `sale` / `clearance`), `isOnSale`, `isClearance`, savings and promotions. Filter a category for deals by pasting a target.com URL with the "Deals" filter applied, or use **Sort by** and **Min / Max price**. For a fixed list of products, put their TCINs into **Product IDs**.

### How to check Target store stock and pickup availability

Set **Store ID** (e.g. `1176`) or a **ZIP code** (the nearest store is used). Every product then gets `storeAvailability` and `fulfillment` with pickup status, pickup date, in-store status, quantity at that store and the aisle. Without a store you still get online / shipping availability and delivery dates.

### How to scrape Target product reviews

Turn on **Include reviews** and set **Max reviews per product**. Reviews are read 50 per request in the order you choose (most recent, most helpful, highest or lowest rating). Each review includes the reviewer's nickname as Target shows it, verified purchaser flag, helpful votes, photos, and the brand's reply. Use **Only reviews newer than** (`7 days`, `2026-10-01`) to collect only recent reviews.

### Monitor changes on a schedule

Turn on **Only new or changed items** and the Actor remembers what earlier runs of the same input returned. Each run then outputs only products that are new in the results or whose price, regular price or online availability changed (plus store availability when a store is set, and the rating count when reviews are on). Unchanged products are dropped before anything is saved and before details or reviews are requested, so they are not charged. Save the input as a task and add a Schedule to it in Apify Console (Schedules → Create new, e.g. daily). Every output item carries `changeType` (`new` or `changed`), and changed products carry `previousValues`, e.g. `{"price": 24.99, "availability": "IN_STOCK"}` for a product that dropped to $19.99 and sold out.

Tips:

- **Max items** becomes the watched window: that many products of the listing are checked each run.
- Turn **Include sponsored products** off so rotating ads do not show up as new.
- Target's relevance order shifts slightly between runs, so the first runs may report a few products that moved into the window as `new`; each one is reported once.
- With reviews on, only reviews not returned before are output.
- **Monitoring key** keeps several schedules on the same search separate.

### Does it work without login or a browser?

Yes. Everything comes from Target's public pages and the public JSON they load; no account, cookies or browser are needed, and nothing behind a login is collected.

### Proxy note

The default Apify datacenter proxy works. Target protects its APIs with PerimeterX; the Actor identifies its requests the way Target's mobile app does and retries a blocked request with another IP, so in our tests every request succeeded on the first try. No Unblocker or residential proxy is needed.

### Integrations and API

Use the run in Zapier, Make, n8n or Google Sheets, or call it from Python / Node.js with the Apify client. See the **API** tab for ready-made snippets.

### Is it legal to scrape Target?

The Actor collects only information Target publishes on its public pages: product data, prices, stock and public reviews with the nickname the reviewer chose to show. It does not log in and does not collect anything behind a login. You are responsible for how you use the data and for complying with Target's terms and applicable law (for example data-protection rules when you store reviewer nicknames).

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

### Related scrapers

- [Home Depot Scraper](https://apify.com/tortuga/home-depot-scraper): Products, Prices & Reviews
- [Lowe's Scraper](https://apify.com/tortuga/lowes-scraper): Products, Prices & Reviews
- [eBay Scraper](https://apify.com/tortuga/ebay-scraper): Listings, Prices & Sellers
- [Etsy Scraper](https://apify.com/tortuga/etsy-scraper): Listings, Prices, Shops & Badges
- [Walmart Scraper](https://apify.com/tortuga/walmart-scraper): Products, Prices & Reviews

### Found it useful?

A ★ review on this Actor's Apify Store page helps other users find it and tells us what to improve. Issues and feature requests are welcome in the Actor's **Issues** tab.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Target.com, one per line (e.g. "headphones", "air fryer"). Each term is searched separately and paginated automatically: one request returns 24 products plus sponsored ones.

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

Target.com URLs instead of (or in addition to) search terms: search pages (https://www.target.com/s?searchTerm=lego), category pages (https://www.target.com/c/headphones-electronics-tech/-/N-5xteg), brand pages (https://www.target.com/b/shokz/-/N-q643leuuk8t) or product pages (https://www.target.com/p/-/A-89827259, returned with full details). Filters in the URL (facetedValue, sortBy, Z... facet ids) are kept.

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

Target item numbers (TCIN, the digits after /A- in a product URL, e.g. 89827259). Each one is returned with full product details.

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

Stop after this many dataset items in total. Products and reviews both count, so with reviews on raise it accordingly (100 products with 20 reviews each = 2,100 items). Target shows 1,200 products per search; above that the search is split into price ranges automatically.

## `maxItemsPerSearch` (type: `integer`):

Optional cap on products per search term or start URL, so several searches in one run each get their share of Max items. Empty = no per-search cap.

## `sortBy` (type: `string`):

Result order for search terms, category and brand pages, as in Target's own "Sort by" menu.

## `minPrice` (type: `integer`):

Only products at or above this price (Target's own price filter). Sponsored products ignore Target's filter, so those outside the range are dropped before saving and never charged.

## `maxPrice` (type: `integer`):

Only products at or below this price (Target's own price filter).

## `includeSponsored` (type: `boolean`):

Target mixes up to 6 sponsored products into each results page. They are saved with isSponsored = true. Turn this off to keep organic results only (recommended for monitoring: ads rotate between visits).

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

Target store id (e.g. 1176, shown in the store's URL on target.com/sl/...). Adds store pickup and in-store status, quantity and aisle for that store to every product. Leave empty for online availability only.

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

US ZIP code; the nearest Target store is used for store pickup stock (ignored when Store ID is set).

## `includeDetails` (type: `boolean`):

Also fetch each product's details: UPC, category path, description, highlights, specifications, all images, every variant (color / size) with its own price and UPC, rating breakdown, seller for marketplace items, return policy and package dimensions. One extra request and one extra `detail` charge per product.

## `includeReviews` (type: `boolean`):

Also collect customer reviews for every product, as separate items with type = "review" (rating, title, text, date, reviewer nickname as Target shows it, verified purchaser, helpful votes, photos). Up to 50 reviews per request.

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

Cap on reviews per product.

## `reviewSort` (type: `string`):

Order in which reviews are collected (matters when a cap is set). "Most recent" is best for monitoring; "Lowest rating" surfaces complaints.

## `reviewsNewerThan` (type: `string`):

Only reviews newer than: a date (YYYY-MM-DD) or a period such as '7 days' or '24 hours'. Reviews are then read newest first and reading stops at the first review page that is entirely older. Applies when Include reviews is on.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. Compared: price, regular price, online availability (plus store availability with a store, and rating count with reviews on). Max items is then the watched window: that many products are checked each run.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input.

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

Apify datacenter proxy (the default) works: Target's public APIs are read directly, no browser and no Unblocker needed. Residential proxy also works but costs more.

## Actor input object example

```json
{
  "searchTerms": [
    "headphones"
  ],
  "startUrls": [],
  "tcins": [],
  "maxItems": 100,
  "sortBy": "relevance",
  "includeSponsored": true,
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "reviewSort": "most_recent",
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "searchTerms": [
        "headphones"
    ],
    "startUrls": [],
    "tcins": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/target-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 = {
    "searchTerms": ["headphones"],
    "startUrls": [],
    "tcins": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/target-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 '{
  "searchTerms": [
    "headphones"
  ],
  "startUrls": [],
  "tcins": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/target-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tortuga/target-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/DRpcfob68aNrQJwIX/builds/l3ZNAWULMGYNnXxjx/openapi.json
