Target.com Product Scraper
Scrape Target.com by keyword, category or product link. TCIN, price, promotions, rating, shipping and store pickup stock, images and URL. No API key.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,startUrls,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00078 per product = $0.78 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Product returned | One product returned in the dataset. Similarity fallbacks, diagnostics and the labelled sample row are not charged. | $0.00078 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | What to look up on target.com, one per line — "air fryer", "lego", "paper towels". Each term is searched separately and every product it returns becomes a row. | array |
startUrls | Paste Target pages instead of typing terms. Search pages (https://www.target.com/s?searchTerm=air+fryer), category and brand pages (…/-/N-5xtg6) and single product pages (…/-/A-92084780) all work, mixed together. Product links always come back with the full description. | array |
maxItems | Hard cap on products returned across everything above. You pay per product, so this is what bounds the bill. Target stops any one search or category at 1,227 products. | integer |
zipCode | A five-digit US postcode, for example 55403. It picks the nearest Target store for pickup stock. It does not change the price: on every test run with a postcode, prices still came from Target's online store (pricedAtStoreId 3991). Leave it empty if you do not need pickup stock. | string |
includeAvailability | Look up whether each product ships, is sold out, and — when a postcode is set — whether it is on the shelf for pickup. Costs one extra request per 30 products. | boolean |
includeFullDetail | Fetch each product's own page data for the long description and the star-by-star review breakdown. This is one extra request per product, so a 500-product run takes noticeably longer. Product links pasted into "Target URLs" always get this regardless. | boolean |
What you get
A structured dataset — each result includes fields like:
titlebrandpriceregularPriceonSalesavingsPercentratingreviewCountonlineAvailabilitypickupAvailabilitypromotionsprimaryImagetcinurlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Target.com Product Scraper: prices, promotions and pickup stock from target.com
Type a search term, or paste a Target search, category, brand or product link. You get one row per product: TCIN, title, brand, today's price and any markdown, promotions, star rating and review count, whether it ships, whether a nearby store has it for pickup, the images and the link. A postcode sets the pickup store, but on every test run checked the price still came from Target's online store (pricedAtStoreId 3991), and any one search or category stops at 1,227 products.
| Input | Search terms, or Target search, category, brand or product links |
| Output | One row per product |
| Ceiling | 2,000 products per run, and 1,227 per search or category |
| Account needed | None |
| Price | $0.78 per 1,000 products, flat on every plan |
🔍 What Target.com Product Scraper does
Each search term is run separately and every product it returns becomes a row. Category and brand links work the same way, and pasted product links are fetched first, so a broad category can never use up maxItems before the products you named.
Target never answers a search with "no matches". Ask for something it does not stock and it returns a page of 28 products that have nothing to do with the question. So the first page of every keyword search is checked against the words you typed, and if almost none of the titles mention them, you get one free NO_MATCH note instead of 28 charges. The check was tuned on 66 real shopping terms, none of which it rejected, including "bed sheets", where every product is titled "Sheet Set". It is loose in the other direction on purpose: dropping a real result is worse than letting a weak one through. Category and brand links skip the check.
Without a postcode you get Target's online view: shipping status, sold-out flags, delivery status and a ship-by date, with the pickup fields left null. Add a postcode and the nearest store's pickup status, name and unit count fill in.
Three hundred products took 18 seconds on a test run.
📥 What you give it
{
"searchTerms": ["air fryer"],
"zipCode": "55403",
"maxItems": 12
}
| Field | If you leave it out | What it is |
|---|---|---|
searchTerms | none | What to look up, one per line, such as air fryer or paper towels. |
startUrls | none | Target search pages, category and brand pages (/-/N-5xtg6) and product pages (/-/A-92084780), mixed freely. Product links always come back with the full description. |
maxItems | 50 | 1 to 2,000 products across everything above. You pay per product, so this bounds the bill. |
zipCode | none | A five-digit US postcode. Sets the store for pickup stock. |
includeAvailability | on | Whether each product ships, is sold out and, with a postcode, is on the shelf for pickup. |
includeFullDetail | off | Adds the long description, the barcode and the star-by-star review count. A large run takes noticeably longer with it on. |
proxyConfiguration | not used | Only for your own servers. Addresses you list here are used as given. Leave it alone otherwise. |
A category link is a node id: in target.com/c/anything/-/N-5xtg6, the 5xtg6 is what matters. The form opens with air fryer and a cap of 50 filled in, as an example.
📤 What you get back
A real row from a real run with postcode 55403, with the image, highlight and specification lists cut short:
{
"tcin": "92084780",
"title": "Gourmia Digital 3qt Air Fryer with Guided Cooking Prompts Black/Stainless Steel Finish",
"brand": "Gourmia",
"url": "https://www.target.com/p/digital-3qt-air-fryer-with-guided-cooking-prompts-black-stainless-steel-finish/-/A-92084780",
"price": 39.99,
"formattedPrice": "$39.99",
"regularPrice": 39.99,
"comparisonPrice": null,
"onSale": false,
"savingsAmount": null,
"savingsPercent": null,
"unitPrice": null,
"unitPriceSuffix": null,
"priceType": "reg",
"priceNote": null,
"pricedAtStoreId": "3991",
"promotions": [],
"rating": 4.18,
"reviewCount": 471,
"onlineAvailability": "IN_STOCK",
"soldOut": false,
"outOfStockInAllStores": false,
"pickupAvailability": "IN_STOCK",
"pickupStoreId": "1375",
"pickupStoreName": "Mpls Nicollet Mall",
"pickupQuantity": 6,
"scheduledDeliveryAvailability": "IN_STOCK",
"shipsBy": "2026-09-21",
"primaryImage": "https://target.scene7.com/is/image/Target/GUEST_6ec22cbf-b531-4468-86ce-f0194548211b",
"images": ["https://target.scene7.com/is/image/Target/GUEST_6ec22cbf-b531-4468-86ce-f0194548211b"],
"dpci": "072-04-6561",
"upc": null,
"itemType": "Electric Fryers",
"departmentId": "72",
"classId": "4",
"categoryId": "ncrpx",
"highlights": [
"3-quart air fryer can cook for one or a few",
"8 One-Touch Cooking Functions eliminate guesswork"
],
"specifications": [
"Dimensions (Overall): 10.47 Inches (H) x 11.46 Inches (W) x 8.98 Inches (D)",
"Capacity (Volume): 3 Quart"
],
"description": null,
"ratingDistribution": null,
"searchTerm": "air fryer",
"position": 1,
"scrapedAt": "2026-09-20T00:46:59.705Z"
}
A marked-down product from another real run, price fields only:
{
"tcin": "94986645",
"price": 99.99,
"regularPrice": 99.99,
"comparisonPrice": 159.99,
"onSale": true,
"savingsAmount": 60,
"savingsPercent": 38
}
| Field | What it is |
|---|---|
tcin | Target's product number, the digits after A- in a product link. Stable, so use it to join runs. |
price, regularPrice, comparisonPrice, onSale | On a markdown, the old price is in comparisonPrice and regularPrice equals the current one. Read onSale first. |
savingsAmount, savingsPercent | Filled when Target shows a was/now price. |
unitPrice, unitPriceSuffix | Grocery and household items, such as $0.36 and /ounce. |
pricedAtStoreId | Which store the price is for. 3991 is Target's online store. |
promotions | Each with message, promotionId, type, thresholdType, thresholdValue, rewardType and rewardValue. |
onlineAvailability, soldOut, outOfStockInAllStores, scheduledDeliveryAvailability, shipsBy | The online and delivery picture. |
pickupAvailability, pickupStoreId, pickupStoreName, pickupQuantity | Need a postcode. pickupQuantity can be null while the status says in stock; the status is the reliable one. |
dpci, upc | Target's shelf number and the barcode. upc needs full detail or a pasted product link. |
description, ratingDistribution | The long copy and the count at each star. Same rule as upc. |
highlights, specifications, itemType, departmentId, classId, categoryId | The product page bullets and Target's own classification. |
🧾 Reading the output
Real product rows have no charged field. The free rows carry charged: false, so dropping those leaves only products.
| Row | How to spot it | Charged |
|---|---|---|
| A product | a tcin and no charged field | yes |
| The sample | _sample: true | no |
| A note | _diagnostic: true, with an errorCode, an error and a hint | no |
The sample appears only when a run has no search terms and no links. It looks like a real product row, so filter on _sample or charged rather than on the fields.
errorCode | What it means |
|---|---|
NO_MATCH | Target stocks nothing for that term and answered with unrelated products, which were left out. The note carries a relevance score. |
NO_RESULTS | Target returned no products for that term or link. |
NOT_FOUND | No product behind that TCIN. They change when Target merges or retires a listing. |
BAD_URL | Not a Target search, category, brand or product link. |
ZIP_NOT_FOUND | No store near that postcode. The run carries on with online prices. |
LIMIT_REACHED | maxItems was used up before that search or those links, so they were not fetched. |
TARGET_UNREACHABLE, BLOCKED, FAILED | Target did not answer that part of the run. Re-running usually clears it. |
▶️ How to run it
1. Open Target.com Product Scraper and click Try for free. 2. Type what you want into Search terms, or paste pages into Target URLs. 3. Set Maximum products. 4. For pickup stock at a store, fill in US postcode (optional). 5. Click Start, then download the dataset as JSON, CSV or Excel.
💰 How much does it cost?
$0.78 per 1,000 products, flat on every Apify plan. Stock and full detail cost nothing extra.
Not charged: the sample row, every note above, the unrelated products behind a NO_MATCH, and a product that turns up under two searches, which is delivered once. If you set a maximum cost for the run, it stops there and says so in its status.
💡 What people use it for
- Watching a fixed list of products. Paste their links, schedule the run, and the rows line up on
tcin from one run to the next.
- Catching markdowns across a category, using
onSaleandcomparisonPrice. - Checking whether one store has an item on the shelf before driving there.
- Pulling DPCI, UPC and Target's classification for a product list.
🚧 What it does not do
- No review text. The star average, the review count and, with full detail, the count at each
star.
- Pickup stock for one store only, the nearest to your postcode. Checking forty stores is a
different job.
- No store-level prices, as far as testing shows.
pricedAtStoreIdread 3991 on every row of
every test run checked, with a postcode or without.
- No variants as rows. A shirt in six colours is one row, the one Target shows in the listing.
- Nothing behind a sign-in. No Circle member pricing, no order history.
- target.com only. Target Australia is a different company.
- No sponsored placements. Paid slots in the results are skipped, so this is the wrong tool for
studying ads.
- Prices move. A row is what target.com showed at
scrapedAt.
🧭 Which retail scraper do you need?
| If you want | Use |
|---|---|
| Target products with promotions and pickup stock | This one |
| Lowe's products with store price, stock and specs | Lowe's Product Scraper |
| Amazon products by keyword or ASIN | Amazon Scraper |
| A Shopify store's whole catalogue | Shopify Products Scraper |
| An alert when any product page changes price or stock | Product Price and Stock Monitor |
❓ Questions people ask
Do I need a Target account or an API key? No. Nothing is signed in and there is no key to get.
Can I scrape a whole category? Up to 1,227 products of it, which is Target's own ceiling. For more, search the sub-categories separately.
Why did my search give a note instead of products? Target had nothing matching and answered with unrelated items, so they were left out rather than billed. If you think that was wrong, a category or brand link fetches the products with no check.
What is a TCIN, and what is a DPCI? The TCIN is Target's product number online and the one to join on. The DPCI is its shelf number in stores.
Why is pickupQuantity null when the item is in stock? Target does not publish a unit count for every item. Trust pickupAvailability.
Is this legal? It reads what target.com shows anyone who is not signed in. Apify's write-up on the legality of web scraping is a good starting point. We are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page and send the input you used and the run ID. The note rows in the dataset usually name the reason already.