Target API & Scraper
Target API returns live Target data as clean JSON for target The primary endpoint, search, returns product results including variant tcin, product tcin, position, name and brand.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Developers reach for it when they need to track product listings, prices, availability, variants and reviews without maintaining one-off scraping code or separate API contracts. If you were about to build or fix a Target scraper, this API is the maintained alternative — it returns the same data as clean JSON, with the proxies, rotation and anti-bot handling already solved. This page covers the live example, request shape, response shape and available actions: search, product_detail, price. Every request uses the same ReefAPI envelope, one API key and one shared credit pool, so it fits alongside the rest of your data stack.
Target's identifiers: TCIN, DPCI, UPC, and the parent-versus-variant split
Target uses three separate numbering systems and the difference between them decides whether a lookup works. The parent-versus-variant split matters just as much: on an apparel product, the row you saw in search is not the page you get back. Measured on 2026-08-27 with searches for 'coffee maker' and 't-shirt', the /c/cpus category, and product 87328557.
| Identifier | Format | Measured |
|---|---|---|
| TCIN | the A-<id> segment of /p/<slug>/-/A-<id> | 8 or 10 digits, not fixed: 'coffee maker' returned 22 eight-digit and 2 ten-digit; /c/cpus returned 13 and 11 |
| product_tcin vs variant_tcin | the parent page, and the specific color or size that was listed | 't-shirt' differed on 24 of 24 rows; 'coffee maker' matched on 19 of 24; /c/cpus matched on 24 of 24. product_detail accepts either |
| DPCI | Target's in-store code, department-class-item | 3-2-4 digits, e.g. 331-14-4383. Null on a variation parent, present on every one of its 79 variants |
| barcode | the UPC printed on the box | 12 digits, e.g. 199592576120. Also null on a variation parent |
| price on a variation parent | there is not one | price and list_price are null; price_range carried min 4.20, max 6.00 over 79 of 79 priced variants, with derived_from naming the source |
| rating_count vs review_count | star ratings versus written reviews | 3,214 ratings but 666 written reviews; rating_distribution 236/114/198/325/2341 sums back to 3,214 |
| stock on search rows | not published on that surface | in_stock and availability were null on all 48 rows across keyword and category mode; product_detail has it per variant, 72 of 79 in stock |
| pagination | 24 per page, with a floor under how deep you can go | 'coffee maker': total_results 294, total_results_at_most 312, deepest_offset 288 |
The slug in a target.com product URL is decorative, so /p/-/A-87328557 resolves. product.requested_tcin echoes what you asked for and product.tcin reports the canonical id, so you can always tell whether you landed on a parent.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/target/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "coffee maker",
"max_results": 24
}
}{
"ok": true,
"meta": {
"api": "target",
"endpoint": "search",
"mode": "live",
"latency_ms": 2356.2,
"record_count": 24,
"bytes": 1121148,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "limit_reached",
"field_sources": {
"crawler_ua": "every field on this action"
},
"fields_not_published": {
"fields": [
"in_stock",
"availability",
"review_count"
],
"reason": "target.com's search listing does not publish a stock state or a written-review count — the keys are returned as null rather than guessed.",
"available_in": "product_detail"
},
"degraded": false,
"source": {
"surface": "target.com server-rendered ItemList (schema.org)",
"url": "https://www.target.com/s/coffee+maker",
"upstream_calls": 1,
"page_size": 24
},
"search_mode": "keyword",
"keyword_match_rate": 1,
"pagination": {
"page": 1,
"page_size": 24,
"returned": 24,
"offset": 0,
"deepest_offset": 288,
"total_results": 290,
"total_results_at_most": 312,
"has_more": true,
"next_page": 2
},
"filters": {
"applied": [],
"ignored": [],
"notes": "target.com publishes no facet vocabulary on this surface, so only filters measured to bite are offered: sort, min_price, max_price."
},
"notes": null,
"charged_credits": 1,
"version": "1.0.0"
},
"data": {
"products": [
{
"variant_tcin": "90116759",
"product_tcin": "91466170",
"url": "https://www.target.com/p/keurig-k-mini-go-multicup-reservoir-single-serve-k-cup-pod-coffee-maker-with-strong-brew-button/-/A-91466170",
"position": 1,
"name": "Keurig K-Mini Go, Multicup Reservoir Single-Serve K-Cup Pod Coffee Maker with Strong Brew Button",
"brand": "Keurig",
"brand_url": "https://www.target.com/b/keurig/-/N-5uvm4",
"category": "Coffee Makers",
"image": "https://target.scene7.com/is/image/Target/GUEST_17b87f23-79f3-4bbb-b0a2-98d278f42e6b",
"price": 69.99,
"list_price": 88.99,
"currency": "USD",
"on_sale": true,
"in_stock": null,
"availability": null,
"rating": 4,
"rating_count": 2132,
"review_count": null,
"offer_type": "sale"
},
{
"variant_tcin": "91863920",
"product_tcin": "91863920",
"url": "https://www.target.com/p/mr-coffee-12c-programmable-drip-coffee-maker-stainless-steel-finish/-/A-91863920",
"position": 2,
"name": "Mr. Coffee 12-Cup Programmable Coffee Maker Black",
"brand": "Mr. Coffee",
"brand_url": "https://www.target.com/b/mr-coffee/-/N-5s76z",
"category": "Coffee Makers",
"image": "https://target.scene7.com/is/image/Target/GUEST_fd026130-c56b-41d3-9e88-992fcf06debf",
"price": 34.99,
"list_price": 34.99,
"currency": "USD",
"on_sale": false,
"in_stock": null,
"availability": null,
"rating": 4.3,
"rating_count": 996,
"review_count": null,
"offer_type": "reg"
},
{
"variant_tcin": "91986267",
"product_tcin": "91986267",
"url": "https://www.target.com/p/mr-coffee-5c-switch-drip-coffee-maker-black/-/A-91986267",
"position": 3,
"name": "Mr. Coffee 5 Cup Switch Coffee Maker Black: Small Drip Coffee Machine, Electric, Paper Filter, 25 oz Capacity",
"brand": "Mr. Coffee",
"brand_url": "https://www.target.com/b/mr-coffee/-/N-5s76z",
"category": "Coffee Makers",
"image": "https://target.scene7.com/is/image/Target/GUEST_72ba1da6-01d0-4c2b-ba8f-78ca9fc34a98",
"price": 21.99,
"list_price": 21.99,
"currency": "USD",
"on_sale": false,
"in_stock": null,
"availability": null,
"rating": 4.5,
"rating_count": 1185,
"review_count": null,
"offer_type": "reg"
}
],
"related_categories": []
}
}What the Target API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Find products on target.com (US). Give a free-text `query` ('coffee maker', 'lego star wars', 'nike running shoes') to run Target's own site search, or a `category` path ('/c/cpus/-/N-01vhh', '/b/apple/-/N-5y3ej') to browse a Target category or brand page. Every product comes back with BOTH of Target's ids — the parent product id and the specific colour/size id — plus the name, brand, category, image, current price, the crossed-out list price when it is on sale, the star rating and rating count, and the product URL. Narrow with `sort`, `min_price` and `max_price`; page with `page` and `max_results`. | Pricing teams call search to find products on target.com (US). | query, category, page, max_results, sort, ... |
| product_detail | Get one Target product in full, by Target's own id or by its target.com URL. One call returns the UPC barcode, the shipping weight and package dimensions with Target's own units, the complete image gallery, the entire colour/size variant matrix with each variant's own price, list price, stock status, barcode, weight, dimensions, image and native Target id, the specification table parsed into name/value pairs, the brand, the category breadcrumb path, the current price and availability, the star rating with its full 1-5 distribution and Target's secondary ratings, the customer review photos, and the customer reviews inline. | Marketplace operators call product_detail to get one Target product in full, by Target's own id or by its target.com URL. | tcin, url, reviews, include_price |
| price | Live price and stock for ONE Target product — the cheap way to refresh products you already hold, without paying for the whole product page. Pass the `tcin` search gave you (either `product_tcin` or `variant_tcin`) or a target.com product `url`. A specific colour/size id returns THAT variant's own price and stock; a parent id of a colour/size family returns every variant's price and stock in `variants[]` (Target prices the variants, not the family, so the top-level `price` is null there and `price_range` gives the min/max over the variants). | Catalog enrichment teams call price to get live price and stock for ONE Target product. | tcin, url |
Call search from your stack
curl -X POST https://api.reefapi.com/target/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"coffee maker","max_results":24}'import requests
r = requests.post(
"https://api.reefapi.com/target/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "coffee maker",
"max_results": 24
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/target/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "coffee maker",
"max_results": 24
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.target.search with {"query":"coffee maker","max_results":24}.Who uses this API and why
- Pricing teams use Target to find products on target.com (US).
- Marketplace operators use Target to get one Target product in full, by Target's own id or by its target.com URL.
- Catalog enrichment teams use Target to get live price and stock for ONE Target product.
Questions developers ask before integrating
Is a Target TCIN always 8 digits?
No, and a fixed-width column for it will bite you. A search for 'coffee maker' returned 22 eight-digit TCINs and 2 ten-digit ones, and browsing /c/cpus returned 13 eight-digit and 11 ten-digit. Treat the TCIN as a string of digits with no fixed length. It is the A- segment of a target.com product URL.
Why does every Target search row carry two ids?
Because product_tcin is the parent product page and variant_tcin is the exact color and size Target put in that grid slot, and on some categories they are never the same. All 24 rows of a 't-shirt' search had different ids, while all 24 rows of the /c/cpus category had identical ones. Collapsing them into a single id would silently re-key half your catalogue, so both are returned. product_detail accepts either and resolves to the parent.
What is DPCI and why is it null on the product I looked up?
DPCI is Target's in-store item code, formatted as department-class-item in 3-2-4 digits, like 331-14-4383. It identifies a physical item, so it exists per variant and not for a variation parent. On a measured t-shirt the parent's dpci and barcode were both null while all 79 variants carried both. Read them from variants[].
Why is price null on a product I know has a price?
Because you asked for a variation parent, and target.com publishes no single figure for one. You get price_range instead, which reported min 4.20 and max 6.00 with priced_variants 79 of 79 and a derived_from field naming where those numbers came from. is_variant_parent tells you to expect this before you look at the price.
Why is stock always null on Target search results?
The search surface does not publish it. Across 48 measured rows in both keyword and category mode, in_stock and availability were null on every one - null meaning unknown, not false meaning out of stock. product_detail does carry it per variant: the measured t-shirt had 72 of 79 variants in stock and the other 7 marked OutOfStock.
Why is rating_count so much larger than review_count?
They count different things. rating_count is everyone who left stars, review_count is the subset who also wrote something - a measured product had 3,214 ratings and 666 written reviews. rating_distribution breaks the ratings out by star as 236, 114, 198, 325 and 2,341, which sums back to 3,214, so you can check the arithmetic yourself. recommended_percentage and secondary_ratings for comfort, quality, sizing and style come alongside.
Does asking for more Target reviews cost more?
No. The reviews are already inside the two pages the call fetches, so the reviews parameter only trims the response, and setting it to 0 saves bytes rather than requests. The parameter's ceiling is 12, but the page often holds fewer: a measured product reported reviews.available_on_page 8. The rating, the distribution and the review photos come back regardless.
What is total_results_at_most in the pagination block?
It is the honest upper bound for when Target's own count and its own paging disagree. On 'coffee maker' total_results was 294 while total_results_at_most was 312 and deepest_offset was 288, meaning Target claims 294 matches but will not page you past offset 288. Use total_results for reporting and deepest_offset to decide when to stop crawling.
What is the Target API?
Target API is a ReefAPI endpoint group for target It returns live JSON through POST requests under /target/v1.
Is the Target API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Target calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Target login or account?
No login to Target is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Target data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Target API use?
Target actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Target from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call target actions with the same key, credit pool and JSON envelope used by normal REST requests.