Turn a Target TCIN into prices, variants and reviews
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.
2 active endpoints, on 1 and 3 credit tiers.
- POST/target/v1/search
- POST/target/v1/product_detail
What Target endpoints does ReefAPI ship?
2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Target API
2 of 2 endpoints, ready to run
One product in full: the UPC, the shipping weight and package dimensions in Target's own units, the whole variant matrix with each variant's own price, stock and barcode, the star distribution and the reviews inline.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Target API works
Target is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Get every size of a grocery item at its own price
On Target a family of sizes is one page with one name, and the price you want belongs to a variant rather than to the product. Two calls get you the whole matrix.
{"query": "cereal", "max_results": 20}One flat credit. Each row carries both a product_tcin and a variant_tcin — they are not always the same number.
{"tcin": "89089937", "reviews": 8}Three flat credits. variants[] gives one row per size with its own price, stock, barcode and package dimensions, and price_range spans them.
Four credits for a whole product family priced size by size, with the star distribution and eight review bodies thrown in at no extra request.
curl -X POST https://api.reefapi.com/target/v1/product_detail \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"tcin":"87328557","reviews":5}'{
"ok": true,
"data": { … },
"meta": {
"api": "target",
"endpoint": "product_detail",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}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.
Two TCINs per row, and the price that lives on the variant
Measured on 2026-08-27 across coffee makers, toys and groceries, paging one query until it ran out. Three of these lines go against us.
product_tcin is the page; variant_tcin is one specific size or colour. On a coffee maker both read 91863920. On a cereal, the row returned variant_tcin 81875472 and product_tcin 89089937 — the 18.8 ounce box and the family page. Both work as input, and the response is explicit about what it did: it echoes what you asked for in requested_tcin and always reports the canonical parent in tcin. That is the answer to which id opens the door: either one, and it tells you which door it went through.
gtin13 (14 digits, zero-padded), barcode (the 12-digit UPC), dpci (Target's own aisle code, 072-08-0313) and one barcode per variant. The cereal's four sizes had four different barcodes. If you are matching against a retail catalogue, barcode is the field that joins.
Against us at first glance and defensible on inspection. The cereal returned price null, in_stock null and availability null — because target.com publishes no single figure for a variation product. What it returns instead is price_range: min 2.99, max 7.39, priced_variants 4 of 4, and a derived_from note explaining exactly that. Read price_range on a parent and price on a variant.
Against us, and confirmed across three unrelated categories: in_stock, availability and review_count were null on every search row in all of them. Stock state exists only on product_detail. A stock monitor built on search alone will never see anything go out of stock.
Page 10 returned a full 20 rows. Pages 13, 16, 20 and 30 all returned zero products with ok:true and completeness_pct 0.0. An auto-paged request for 200 rows returned 178 in eight upstream calls and reported completeness_pct 92.71. The feed is roughly a dozen pages deep and the response scores its own completeness, which is more than most.
product_detail returns rating, rating_count, the full 1-to-5 rating_distribution, the recommended percentage, Target's secondary ratings where the category has them (quality, design, ease of use, value), the customer review photos, and the review bodies inline. reviews.available_on_page tells you how many bodies actually existed, so asking for more than that is not an error — you simply get what is there, typically eight.
Setting it false returned the catalogue record — name, brand, barcode, rating, dimensions — with price, currency, in_stock and availability all null. It does what it says, and it is the cheaper-to-serve path if you are only building a catalogue.
This engine is exactly two actions: search at 1 flat credit and product_detail at 3. No per-row billing. Search of 20 rows ran about one second, product_detail two to four, and a 178-row sweep about ten. Small surface, no arithmetic, no surprises.
What people build with Target
The jobs this data is most often used for.
endpoints
credits per call
Pricing and assortment teams use Target to find products on target.com (US).
Brand-protection teams use Target to get one Target product in full, by Target's own id or by its target.com URL.
Retail analysts use Target to read a retailer's own catalogue with full product detail, variants, price and stock, all from one ReefAPI key and credit pool.
What Target data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/target/v1/product_detail \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"tcin":"87328557","reviews":5}'import requests
r = requests.post(
"https://api.reefapi.com/target/v1/product_detail",
headers={"x-api-key": REEF_KEY},
json={
"tcin": "87328557",
"reviews": 5
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Target.
Get a free key →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, and 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.
15 More APIs APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Target, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.