# Target Product Scraper (Cheap) (`data_api/target-product-scraper-cheap`) Actor

Target product search scraper that pulls product prices, ratings, and availability from Target.com search results and category pages, so retail analysts can collect structured data without manual browsing.

- **URL**: https://apify.com/data\_api/target-product-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Target Product Scraper

![Target Product Scraper](cover.jpg)

Pulling product data off Target.com by hand is slow going. You click through page after page, copy a price here and a rating there, and the catalog has shifted by the time you finish. This scraper does the clicking for you. Hand it a search keyword or a Target.com link and it walks every results page, reading the item name, brand, sale and list price, star rating, review count, and stock status straight from Target's own product API. Flip on the detail option and it also brings back spec sheets, weights, country of origin, and the full image gallery. Run a single keyword or a long list of category pages in one go.

### What you get

Each product comes back as one tidy row, and the columns hold their shape from the first item to the last so the data drops cleanly into a sheet or database. The fields fall into a few groups:

- **Identity** — `itemId`, `itemName`, `brandName`, `itemUrl`, `barcode`
- **Pricing** — `salePrice`, `listPrice`, `isDiscounted`, `currencyCode`
- **Ratings and stock** — `starRating`, `reviewsTotal`, `inStockOnline`
- **Description** — `featureBullets`, `itemSummary`, `specSheet`, `shippingNote`
- **Physical and variant** — `packageWeight`, `weightUnit`, `originCountry`, `colorVariant`, `sizeVariant`, `sizeUnit`
- **Media and crawl** — `imageLink`, `imageGallery`, `nextPageUrl`, `collectedAt`

### Quick start

1. Click **Try for free** to open the input form.
2. Paste Target.com search or category links into **Target.com page URLs**, or type plain keywords into **Keyword searches** and let the actor build the links for you.
3. Set **Products per URL or keyword** to cap each input, pick a proxy, and switch on **Pull complete product records** if you also want spec sheets and variant data.
4. Hit **Start**, then download the results as JSON, CSV, Excel, or XML once the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Price tracking** — watch sale and list prices across a category and flag the products that just dropped
- **Competitor catalog research** — see what brands and items rivals stock, at what price, and how they rate
- **Market analysis** — measure how many products carry reviews, how they are rated, and what is in stock online
- **Product data feeds** — turn a set of category pages into a structured catalog for a comparison site or app
- **Inventory and availability checks** — track which items show as available online over time
- **Brand monitoring** — pull every listing for a brand keyword and keep an eye on pricing and ratings

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `targetUrls` | array of strings | One of targetUrls or searchTerms | Target.com search or category links to scrape, one per line. Both /s?searchTerm=... and /c/... pages work. |
| `searchTerms` | array of strings | One of targetUrls or searchTerms | Plain keywords to look up on Target.com, one per line; the actor builds each search link for you. |
| `resultsLimit` | integer | No | Most products to gather per URL or keyword; pages turn automatically until reached. Default `50`; use `0` for no cap. |
| `requestSpacingMs` | integer | No | Milliseconds to rest between paged requests. Raise it if pages come back empty or you hit rate limiting. Default `1500`. |
| `includeFullDetails` | boolean | No | Make one extra call per product for spec sheet, weight, origin, variants, and full gallery. Slower, around a second per product. Default `false`. |
| `proxyConfiguration` | object | No | Proxies for each request. Defaults to Datacenter (US); switch to Residential if you get blocked. |

#### Example input

```json
{
    "targetUrls": [
        "https://www.target.com/s?searchTerm=coffee+maker"
    ],
    "searchTerms": [
        "coffee maker",
        "robot vacuum"
    ],
    "resultsLimit": 50,
    "requestSpacingMs": 1500,
    "includeFullDetails": false,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
}
```

### Output

Every matched product becomes one row. Fields that Target does not return for a given item are dropped from that row, so a clean record holds only the data that actually exists.

#### Example output

```json
{
    "itemId": "84601238",
    "itemName": "Keurig K-Express Single-Serve Coffee Maker",
    "brandName": "Keurig",
    "salePrice": 59.99,
    "listPrice": 89.99,
    "isDiscounted": true,
    "starRating": 4.6,
    "reviewsTotal": 3421,
    "itemUrl": "https://www.target.com/p/-/A-84601238",
    "imageLink": "https://target.scene7.com/is/image/Target/GUEST_84601238",
    "inStockOnline": true,
    "barcode": "611247379042",
    "currencyCode": "USD",
    "featureBullets": [
        "Brews multiple cup sizes",
        "Compatible with all K-Cup pods",
        "42 oz removable water reservoir"
    ],
    "itemSummary": "Single-serve coffee maker that brews in under a minute.",
    "specSheet": "<div>Capacity: 42 oz ...</div>",
    "shippingNote": "Free shipping on orders over $35.00",
    "packageWeight": 4.5,
    "weightUnit": "LB",
    "originCountry": "China",
    "colorVariant": "Black",
    "sizeVariant": null,
    "sizeUnit": null,
    "imageGallery": [
        "https://target.scene7.com/is/image/Target/GUEST_84601238",
        "https://target.scene7.com/is/image/Target/GUEST_84601238_ALT01"
    ],
    "nextPageUrl": "https://www.target.com/s?searchTerm=coffee+maker&Nao=24",
    "collectedAt": "2026-06-30T12:00:00.000000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `itemId` | string | Target's internal product number (TCIN) |
| `itemName` | string | Full product name as shown on Target.com |
| `brandName` | string | Maker or brand tied to the product |
| `salePrice` | number | Price the product sells for now, in USD |
| `listPrice` | number | Standard non-promotional price in USD; null when none is shown |
| `isDiscounted` | boolean | True when the sale price is below the list price |
| `starRating` | number | Mean shopper rating from 0 to 5 |
| `reviewsTotal` | integer | Count of shopper reviews |
| `itemUrl` | string | Direct link to the product page |
| `imageLink` | string | Address of the lead product photo |
| `inStockOnline` | boolean | True when the item can be bought online at scrape time |
| `barcode` | string | Universal Product Code (UPC); null when not exposed |
| `currencyCode` | string | Currency the prices are quoted in, always USD |
| `featureBullets` | array | Bullet-point selling points, HTML stripped |
| `itemSummary` | string | Short blurb from the first soft-bullet line |
| `specSheet` | string | Full specifications block as raw HTML; may be null |
| `shippingNote` | string | Free-shipping threshold message; null when none |
| `packageWeight` | number | Numeric package weight; see weightUnit for the unit |
| `weightUnit` | string | Unit for the package weight, e.g. LB or OZ |
| `originCountry` | string | Country the product was made in |
| `colorVariant` | string | Color of this item; null when not sold by color |
| `sizeVariant` | string | Size of this item; null when not sold by size |
| `sizeUnit` | string | Unit paired with the size, e.g. FL OZ; null when n/a |
| `imageGallery` | array | All product image addresses, lead photo first |
| `nextPageUrl` | string | Link to the next results page; null on the last page |
| `collectedAt` | string | ISO 8601 timestamp of when the row was gathered |

### Tips for best results

- **Test with a small batch first.** Run one keyword with `resultsLimit` at 20 to confirm the fields fit your pipeline before scaling up.
- **Leave detail mode off unless you need it.** Quick mode returns every field on the listing page in a fraction of the time. Switch on `includeFullDetails` only when you need spec sheets, weights, or variants.
- **Use Residential proxies for detail mode.** Target's detail endpoint blocks faster; if you see repeated 403s the run stops detail enrichment on its own, and Residential (US) proxies clear it.
- **Slow down if pages come back empty.** Raise `requestSpacingMs` toward 2000–3000 when you hit rate limiting or blank responses.
- **Set `resultsLimit` to 0 for the full catalog.** Pagination runs until Target stops returning products, so use a cap only when you want a sample.

### How can I use Target product data?

**How can I use the Target Product Scraper to track prices on Target.com?**
Run a keyword or a category link and the actor returns each product's `salePrice`, `listPrice`, and `isDiscounted` flag in one row. Re-run it on a schedule and compare the `salePrice` values over time to catch markdowns, restocks, and price creep across a whole category.

**How can I pull a Target product catalog for a comparison site?**
Paste your category pages into `targetUrls`, set `resultsLimit` to `0`, and switch on `includeFullDetails`. Each product comes back with name, brand, price, rating, spec sheet, and the full image gallery — a structured feed you can load straight into a comparison or aggregator app.

**How can I research a brand's products on Target without copying pages by hand?**
Put the brand name in `searchTerms` and the actor builds the search, walks every results page, and hands back `brandName`, `salePrice`, `starRating`, `reviewsTotal`, and `inStockOnline` for each match. That gives you a quick read on how a brand is priced, rated, and stocked.

**How can I check which Target items are in stock online?**
Every row carries the `inStockOnline` boolean alongside `itemId` and `itemName`. Scrape your watch list, filter on that flag, and you have an availability snapshot you can re-run whenever you need a fresh check.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `urls` (type: `array`):

List of Target.com search or category URLs to scrape in one run. One URL per line. Accepts both search (/s?searchTerm=...) and category (/c/...) pages.

## `queries` (type: `array`):

Plain search terms to look up on Target.com. Each term is automatically converted to a search URL — no need to build URLs manually. One search term per line.

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

Maximum number of products to collect per URL or search query. The actor paginates automatically (24 products per page) until this limit is reached. Set to 0 for no limit.

## `requestDelayMs` (type: `integer`):

Milliseconds to wait between paginated page requests. Increase this value if you encounter rate limiting or empty responses.

## `fetchProductDetails` (type: `boolean`):

When enabled, makes one extra API call per product to retrieve fields that are not in the search listing: specifications, weight, dimensions, country of origin, shipping info, color/size variants, and full image gallery. Produces complete records but is slower — plan for roughly 1 second per product.

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

Select proxies for requests. Target works reliably with Datacenter proxies set to United States. Switch to Residential if you experience blocks.

## Actor input object example

```json
{
  "urls": [
    "https://www.target.com/s?searchTerm=baking+sheet"
  ],
  "queries": [],
  "maxItems": 50,
  "requestDelayMs": 1000,
  "fetchProductDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "urls": [
        "https://www.target.com/s?searchTerm=baking+sheet"
    ],
    "queries": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/target-product-scraper-cheap").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 = {
    "urls": ["https://www.target.com/s?searchTerm=baking+sheet"],
    "queries": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.target.com/s?searchTerm=baking+sheet"
  ],
  "queries": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call data_api/target-product-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=data_api/target-product-scraper-cheap",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/ZYBgKnfiawc1Dbut2/builds/ZplfrbektCPuLLPIT/openapi.json
