# Target Product Scraper (`crawloop/target-scraper`) Actor

Scrape Target.com products by keyword, search URL, category URL, or product URL. Export current price, regular price, rating, brand, TCIN, DPCI, and image for price monitoring. HTTP Target scraper and API alternative.

- **URL**: https://apify.com/crawloop/target-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Product Scraper — prices, ratings & SKUs

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Target Corporation or its affiliates. Data is read from publicly accessible search and product pages only. No login. You are responsible for complying with applicable law and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

> **US retail catalog** — Target product prices, sale flags, ratings, and SKUs for price monitoring and assortment research. Pair with Walmart and Amazon Search for the same keyword across retailers.

| Target catalog | Walmart catalog | Amazon search | Amazon deals |
| :---: | :---: | :---: | :---: |
| **Target Product Scraper** ◄── you are here | [Walmart Scraper](https://apify.com/crawloop/walmart-scraper) | [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) | [Amazon Today's Deals Scraper](https://apify.com/crawloop/amazon-deals-scraper) |
| Price, sale, rating, TCIN, DPCI | ZIP-local price and stock | Keyword SERP and ASIN | Lightning deals and claimed % |

This **Target scraper** turns public Target search, category, and product pages into a structured Apify dataset. Each row includes **current price**, **regular price**, **unit price**, **rating**, **review count**, **brand**, **TCIN**, **DPCI**, and the **primary image**. Use it as a Target API alternative from **Python**, **Node.js**, or an **MCP** assistant.

***

### When to use this Actor

- **Target product scrape** by keyword, search URL, category URL, or product URL
- **Price monitoring** — current price, regular price, and sale flag
- **Assortment research** — brand, rating, review count, sponsored flag, badges
- **SKU matching** — TCIN and DPCI next to the product URL

### When not to use this Actor

- **Checkout, cart, or Target account** automation
- **Review text** — this Actor returns rating and review count, not review bodies
- **Store-locator crawls** as the main job (pass an optional store ID for price context)
- **Walmart or Amazon catalogs** — use the sibling Actors linked above

***

### Key Features

- **Keyword search** — the same terms shoppers type into Target search
- **URL input** — `/s?searchTerm=`, `/c/.../-/N-`, and `/p/.../-/A-` product links
- **Sale flag** — current price and regular price when the item is marked down
- **Identity fields** — TCIN, DPCI, brand, canonical product URL, primary image
- **Sponsored flag** — search cards marked as sponsored stay in the dataset and are labeled

### Input

| Field | Required | Description |
| :--- | :--- | :--- |
| `searchQueries` | One of these | Keywords, one per line |
| `startUrls` | One of these | Search, category, or product URLs |
| `zipCode` | No | 5-digit US ZIP. Default `10001` |
| `storeId` | No | Target store number for price context. Default online store `3991` |
| `sort` | No | `relevance`, `PriceLow`, `PriceHigh`, `RatingHigh`, `bestselling`, `newest` |
| `maxItems` | No | Stop after this many products. Default 24 |
| `maxPages` | No | Pages per keyword or category (24 products per page). Default 1 |
| `proxyConfiguration` | No | US residential proxy. Datacenter IPs are blocked |

```json
{
  "searchQueries": ["paper towels"],
  "zipCode": "10001",
  "maxItems": 24,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output

| Field | Description |
| :--- | :--- |
| `tcin` | Target catalog item number |
| `dpci` | Department-class-item code |
| `title` | Product title |
| `brand` | Brand |
| `price` | Current price in USD |
| `regularPrice` | Regular price |
| `onSale` | True when the current price is below regular |
| `unitPrice` | Formatted unit price when Target sends one |
| `rating` | Average stars |
| `reviewCount` | Number of reviews |
| `isSponsored` | Sponsored search placement |
| `badges` | Labels such as Bestseller |
| `url` | Product page URL |
| `image` | Primary image |
| `zipCode` / `storeId` | Location used for the request |

```json
{
  "source": "target",
  "tcin": "53274278",
  "dpci": "253-03-0235",
  "title": "Bounty Select-A-Size Paper Towels - 6 Triple Rolls",
  "brand": "Bounty",
  "url": "https://www.target.com/p/bounty-select-a-size-paper-towels-6-triple-rolls/-/A-53274278",
  "image": "https://target.scene7.com/is/image/Target/GUEST_example",
  "price": 16.99,
  "regularPrice": 16.99,
  "currency": "USD",
  "onSale": false,
  "unitPrice": "$2.30/100 count",
  "rating": 4.73,
  "reviewCount": 30053,
  "isSponsored": false,
  "badges": ["Bestseller"],
  "zipCode": "10001",
  "storeId": "3991",
  "keyword": "paper towels",
  "error": null
}
```

### Use cases

- **Price monitoring** for a weekly basket of Target keywords
- **MAP and promo checks** using `onSale`, `price`, and `regularPrice`
- **Catalog match** of TCIN and DPCI against an internal SKU list
- **Cross-retail comps** — same keyword on Target, then Walmart and Amazon Search

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('crawloop/target-scraper').call({
  searchQueries: ['paper towels'],
  zipCode: '10001',
  maxItems: 24,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'US',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/target-scraper").call(
    run_input={
        "searchQueries": ["paper towels"],
        "zipCode": "10001",
        "maxItems": 24,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "US",
        },
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~target-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["paper towels"],"zipCode":"10001","maxItems":24,"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/target-scraper`.

Example prompts:

- "Run Target Product Scraper for keyword paper towels and return the first 20 rows with price, TCIN, and rating"
- "Open this Target product URL and return the current price, regular price, and DPCI"
- "Scrape Target search coffee maker, then run Walmart Scraper for the same keyword in ZIP 10001"

### Suite next step

After a Target pull, run [Walmart Scraper](https://apify.com/crawloop/walmart-scraper) for ZIP-local big-box comps and [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) for marketplace prices on the same keywords.

### Related Actors

| Focus | Actor |
| :--- | :--- |
| **Target catalog** | **Target Product Scraper** ◄── you are here |
| Walmart ZIP-local catalog | [Walmart Scraper](https://apify.com/crawloop/walmart-scraper) |
| Amazon keyword search | [Amazon Search Scraper](https://apify.com/crawloop/amazon-search-scraper) |
| Amazon lightning deals | [Amazon Today's Deals Scraper](https://apify.com/crawloop/amazon-deals-scraper) |

### FAQ

**How do I scrape Target with Python or Node.js?**\
Call `crawloop/target-scraper` with the examples above. Pass `searchQueries` or `startUrls`. Export the dataset as JSON or CSV from the run.

**Does this include review text?**\
No. Each row includes star rating and review count only.

**Are error rows billed?**\
No. Rows with `error` set are not billed as products.

**Why a US residential proxy?**\
Target's catalog API blocks datacenter IPs. The default is a US residential proxy so prices match the ZIP you set.

**Can I pin a store?**\
Yes. Set `storeId` to a Target store number. Prices in the row use that store together with `zipCode`.

# Actor input Schema

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

Target search terms, the same queries shoppers type into site search. One keyword per line.

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

Search URLs (/s?searchTerm=), category URLs (/c/.../-/N-...), or product URLs (/p/.../-/A-...).

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

Optional 5-digit US ZIP for localized prices. Defaults to 10001.

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

Optional Target store number for price context (for example 3991). Leave empty for the default online store.

## `sort` (type: `string`):

Native Target search sort.

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

Stop after this many saved products across all inputs.

## `maxPages` (type: `integer`):

Maximum result pages per keyword or category. Each page has up to 24 products.

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

US residential proxy. Target's catalog API blocks datacenter IPs.

## Actor input object example

```json
{
  "searchQueries": [
    "paper towels"
  ],
  "zipCode": "10001",
  "sort": "relevance",
  "maxItems": 24,
  "maxPages": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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 = {
    "searchQueries": [
        "paper towels"
    ],
    "zipCode": "10001",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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 = {
    "searchQueries": ["paper towels"],
    "zipCode": "10001",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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 '{
  "searchQueries": [
    "paper towels"
  ],
  "zipCode": "10001",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call crawloop/target-scraper --silent --output-dataset

```

## MCP server setup

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