find-a-product

target.com/find-a-product-nn7l9g · updated May 21, 2026

MDX-style export adds YAML metadata + attribution linking explainx.ai and this canonical listing URL.

$browse install target.com/find-a-product-nn7l9g
0 commentsdiscussion
summary

Search Target.com for a product query and return the top organic match's title, brand, price, original price, rating, TCIN, canonical product URL, and image — via the public redsky JSON aggregation API. Distinguishes real matches, spell-corrected matches, and zero-results-with-recommendation-padding outcomes. Read-only.

skill.md
name
find-a-product
title
Target.com Find Product
description
>- Search Target.com for a product query and return the top organic match's title, brand, price, original price, rating, TCIN, canonical product URL, and image — via the public redsky JSON aggregation API. Distinguishes real matches, spell-corrected matches, and zero-results-with-recommendation-padding outcomes. Read-only.
website
target.com
category
shopping
tags
- shopping - retail - target - product-search - read-only - json-api
source
'browserbase: agent-runtime 2026-05-18'
updated
'2026-05-18'
recommended_method
api
alternative_methods
- method: browser rationale: >- Falls back to driving https://www.target.com/s?searchTerm=... in a Verified + residential-proxy session when the redsky API returns 4xx. The browser path costs ~6–8 turns and ~30–60s wall (vs ~1s for the API) and has to dismiss a Health Data Consent modal before the product grid is interactable. Use only when the API path is confirmed broken.
verified
false
proxies
false

Target.com Find Product

Purpose

Given a free-text product query (e.g. "AirPods Pro 2", "tide pods", "lego star wars millennium falcon"), return the top matching Target.com product(s) with structured fields: title, brand, price, original (struck-through) price, average rating + rating count, TCIN (Target's internal product ID), canonical product URL (/p/.../-/A-<tcin>), primary image URL, and signals like spell correction or zero-results fallback. Read-only — never adds to cart, never submits an order.

When to Use

  • "Is X on Target.com? Price, link, image."
  • Daily / hourly price-check on a watch-list of Target products.
  • Bulk extraction of Target's top-N results for a list of keywords.
  • Comparison-shopping agents that need a Target price point alongside other retailers.
  • Anywhere you would otherwise drive target.com/s?searchTerm=... in a Verified browser — the redsky JSON API returns identical data in one ~1s HTTP request without anti-bot.

Workflow

Target's web search page is a Next.js SSR shell with a JS-rendered product grid; the actual data comes from a public JSON aggregation API at redsky.target.com that the browser polls on page load. The endpoint is keyed but the key is a static public token (ff457966e64d5e877fdbad070f276d18ecec4a01) embedded in Target's JS bundles, accepts unauthenticated requests, has no per-IP captcha or PerimeterX challenge, and works equally well with or without a residential proxy. Hit it directly — the browser path is a ~100× cost premium that pays for a Health Data Consent modal you have to dismiss before the grid even paints.

1. Build the request

GET https://redsky.target.com/redsky_aggregations/v1/web/plp_search_v2
    ?key=ff457966e64d5e877fdbad070f276d18ecec4a01
    &channel=WEB
    &keyword=<URL-encoded query>
    &page=%2Fs%2F<URL-encoded query>
    &visitor_id=<any non-empty string, e.g. "skill-runner">
    &pricing_store_id=2885
    &default_purchasability_filter=true
    &count=24
    &offset=0
    &platform=desktop

Required params (server returns HTTP 400 if any are missing): key, channel, keyword, page, visitor_id, pricing_store_id. Optional but useful: count (default 24), offset (item-level, not page-level — increment by count to paginate), default_purchasability_filter=true (hides out-of-stock), sort_by (see table below), category (scope to a category id), platform=desktop|mobile.

The page param is required and must look like a real PLP path (/s/<term>); the server validates only that it starts with /s/ — anything after is decorative. visitor_id is required but any non-empty string is accepted; the server doesn't actually validate it against a known device. pricing_store_id=2885 is the Target HQ store (Minneapolis) and yields nationwide pricing — use it as a stable default unless you specifically need store-local pricing.

sort_by valueEffect
relevance (default)Target's relevance ranking
FeaturedFeatured/sponsored bias
PriceLowPrice low → high
PriceHighPrice high → low
RatingHighAverage rating high → low
bestsellingBest-sellers first
newestNewest first

2. Fire the request

URL="https://redsky.target.com/redsky_aggregations/v1/web/plp_search_v2?key=ff457966e64d5e877fdbad070f276d18ecec4a01&channel=WEB&keyword=AirPods+Pro+2&page=%2Fs%2FAirPods+Pro+2&visitor_id=skill-runner&pricing_store_id=2885&default_purchasability_filter=true&count=24"

# Either path works — pick whatever the agent's runtime already has:
browse cloud fetch "$URL"              # Browserbase Fetch API, no proxy needed
# or
curl -fsS -H 'Accept: application/json' "$URL"

A residential proxy is not required for this endpoint. Verified: same response shape, same products, same status 200, with and without --proxies. Save the proxy budget for the browser-fallback path.

3. Detect outcome shape before extracting

.data.search.search_response |
  {
    total_results: .metadata.total_results,
    spell_corrected: (.metadata.auto_corrected_keyword // null),
    real_results: ((.facet_list // []) | length > 0),
    keyword: .metadata.keyword
  }

Branch on real_results:

  • real_results: true — Target found genuine matches for the keyword. Parse data.search.products[].
  • real_results: false — Target found zero matches and is serving generic "recommendation" filler (typically ~200 unrelated bestsellers from books / toys / random categories). Do NOT silently return the first filler item as the match. Emit success: false, reason: "no_results" and pass through metadata.keyword so the caller can decide what to do.
  • spell_corrected non-null — Target auto-corrected the query (e.g. "airpoods" → "airpods"). The returned products correspond to the corrected keyword. Pass the corrected term back so the caller can decide whether the correction is acceptable.

4. Extract the top product

.data.search.products[0] |
  {
    tcin: .tcin,                                                       # e.g. "85978609"
    title: (.item.product_description.title | @html_decode),           # decode &#160;, &#38;, &#34;, &#8482;
    brand: .item.primary_brand.name,                                   # may be null
    price: .price.formatted_current_price,                             # "$249.99" or "See price in cart"
    original_price: .price.formatted_comparison_price,                 # null if not on sale
    rating: .ratings_and_reviews.statistics.rating.average,            # 0–5 float, null if no ratings
    rating_count: .ratings_and_reviews.statistics.rating.count,        # integer, null if no ratings
    product_url: .item.enrichment.buy_url,                             # canonical https://www.target.com/p/.../-/A-<tcin>
    image_url: .item.enrichment.image_info.primary_image.url,          # scene7 CDN URL
    desirability: (.desirability_cues // [] | map(.display))           # e.g. ["Bestseller"], ["5k+ bought in last month"]
  }

Decode HTML entities (&#160; → non-breaking space, &#38;&, &#34;", &#8482;) — Target's API returns titles with entity references intact, not pre-decoded text.

5. (Optional) Filter sponsored

plp_search_v2 already filters most sponsored placements server-side — the field item.is_sponsored is null (not false) across all observed organic results, and sponsored slots come from a sibling aggregation (cf_sponsored_products_search_v1) the browser fetches separately. If you need to be defensive, drop any product whose __typename !== "ProductSummary".

6. Return JSON; do not navigate

Read-only is the rule. Do not hit the add_to_cart redsky aggregation. Do not POST to /checkout. Stop at the product summary.

Browser fallback

If redsky.target.com ever returns 4xx (key rotation, geo-block, etc.) — drive the public site:

  1. Create a Browserbase session with --proxies --verified (PerimeterX / HUMAN sensor at client.px-cloud.net/PXGWPp4wUS/main.min.js will challenge a bare session within a few requests).
  2. browse open "https://www.target.com/s?searchTerm=<URL-encoded query>" --remote.
  3. Dismiss the Health Data Consent modal. On a first-visit session, Target overlays a "Health Data Consent" modal (Virginia VCDPA compliance) that blocks the product grid from being interactable. Click the "Continue shopping" button — selector button:has-text("Continue shopping") — before snapshotting.
  4. browse wait timeout 2500 — the grid lazy-loads after consent dismissal.
  5. browse snapshot — product cards surface as link refs with TCIN-bearing hrefs.
  6. Extract the same fields by parsing the rendered DOM. The product card structure is [data-test="@web/site-top-of-funnel/ProductCardWrapper"] → child [data-test="product-title"] (title), [data-test="product-price"] (price), [data-test="ratings"] (rating).

The browser fallback costs ~6–8 turns and ~30–60s wall vs the API's one HTTP request. Use only when the API path is confirmed broken — not as the default.

Site-Specific Gotchas

  • The redsky API key is public and stable. ff457966e64d5e877fdbad070f276d18ecec4a01 has been observed in Target's web bundle continuously since at least 2021 across third-party scrapers. If it ever rotates, scan the Target SERP HTML for redsky_aggregations references and look for the key in the surrounding JS — historically it's been bundled in a global config object emitted into the SSR HTML, not behind any auth wall.
  • Required-param surface is fragile. Dropping any one of key, channel, keyword, page, visitor_id, pricing_store_id flips the response to HTTP 400 with no error body. Removing default_purchasability_filter, count, offset, platform, store_ids, or sort_by is safe — those default cleanly server-side.
  • page is path-prefix-validated, not echo'd. The server accepts any page starting with /s/. It does not compare page against keyword. You can pass page=%2Fs%2Ftest for every request regardless of the actual keyword and the response is identical to passing the real path — verified across tide+pods, airpods+pro+2, instant+pot+duo+7+in+1.
  • "No results" returns padding, not an error. A nonsense keyword (xkcd12345nonexistent) returns HTTP 200 with total_results: 200 and 24 unrelated bestsellers in products[]. The reliable signal is search_response.facet_list is missing/empty for the padding case but populated for genuine results. total_results is not a reliable zero-results signal — Target pads it.
  • Spell correction is server-side and silent in products[]. When metadata.auto_corrected_keyword is non-null, the returned products are for the corrected keyword, not the typed one. The caller should be told about the correction so they can decide whether to accept it. (Example: keyword=airpoods returns auto_corrected_keyword="airpods" plus 481 AirPod-family products.)
  • Titles contain raw HTML entities, not decoded text. &#160; (nbsp), &#38; (&), &#34; ("), &#8482; () appear verbatim. Always run titles through an HTML-entity decoder before emitting JSON to a consumer.
  • price.formatted_current_price can be "See price in cart" for MAP-restricted items (Apple, Instant Pot RIO line, some appliances). This is a real product, just legally price-suppressed on the PLP — open the PDP via buy_url to see the actual cart price, or read price.current_retail (numeric, sometimes populated even when the formatted string is suppressed).
  • brand is .item.primary_brand.name, but it can be null — observed null for Target-private-label staples (e.g. "up & up"), unbranded commodity items, and grocery. Fall back to extracting the leading token of the title if a brand is required downstream.
  • rating.count is the rating count, not the review count. A separate review_count field at the top of statistics does not exist on plp_search_v2 — the field .ratings_and_reviews.statistics.rating.count is the integer you want.
  • pricing_store_id controls store-localized pricing, not nationwide-vs-store availability. 2885 (Jersey City / NJ) is the value Target's public web bundles use by default. Other valid store IDs (1000 = Minneapolis 50th & France, 3991 = LA Westwood, etc.) are accepted. The default_purchasability_filter parameter independently controls whether out-of-stock items are hidden.
  • Health Data Consent modal blocks the browser-fallback path. Target overlays a Virginia VCDPA compliance modal on every cold-session SERP / PDP that intercepts pointer events on the entire grid. Must be dismissed via "Continue shopping" before any product card is interactable. The API path bypasses this entirely.
  • Anti-bot on the public site is PerimeterX / HUMAN. client.px-cloud.net/PXGWPp4wUS/main.min.js (the HUMAN sensor) is loaded as <script id="humanSensor"> on every page. Bare sessions get challenged within ~5–10 requests; --proxies --verified is mandatory for the browser fallback. The redsky API endpoint is not behind PerimeterX — verified: 200 OK on direct curl from a datacenter IP, no challenge, no _px* cookies required.
  • The PDP URL is canonical and idempotent. https://www.target.com/p/<slug>/-/A-<tcin> is stable — once you have the TCIN you can drop the slug entirely (/-/A-<tcin>) and Target 301s to the canonical slug.
  • Pagination uses offset not page. offset is item-level (0, 24, 48, ...). The redsky endpoint also accepts &page_number=2 but it's a no-op — only offset controls pagination.
  • store_ids filters availability, not pricing. Including store_ids=<id> scopes the result set to items in-stock at that store. Omitting it returns everything Target sells online for the keyword. They're independent dimensions from pricing_store_id.

Expected Output

Three distinct outcome shapes:

// Success — top result is a genuine match
{
  "success": true,
  "query": "AirPods Pro 2",
  "search_keyword": "AirPods Pro 2",
  "spell_corrected_from": null,
  "total_results": 259,
  "product": {
    "tcin": "85978609",
    "title": "Apple AirPods Pro 3 Wireless Earbuds with Active Noise Cancellation",
    "brand": "Apple",
    "price": "$249.99",
    "original_price": null,
    "rating": 3.9,
    "rating_count": 1441,
    "product_url": "https://www.target.com/p/ap2022-true-wireless-bluetooth-headphones/-/A-85978609",
    "image_url": "https://target.scene7.com/is/image/Target/GUEST_d1b8c229-751b-430b-a0fb-521d7777a784",
    "desirability_cues": ["Bestseller"],
    "is_sponsored": false
  },
  "error_reasoning": null
}

// Success with spell correction — caller should decide whether to accept
{
  "success": true,
  "query": "airpoods",
  "search_keyword": "airpods",
  "spell_corrected_from": "airpoods",
  "total_results": 481,
  "product": { /* ... top AirPods product ... */ },
  "error_reasoning": null
}

// No real matches — Target returned recommendation filler
{
  "success": false,
  "query": "xkcd12345nonexistent",
  "search_keyword": "xkcd12345nonexistent",
  "spell_corrected_from": null,
  "total_results": 200,
  "product": null,
  "error_reasoning": "no_results",
  "note": "Target returned 200 unrelated recommendations (no facet_list in search_response — confirmed filler)."
}

// API blocked — fall back to browser path (rare)
{
  "success": false,
  "query": "...",
  "product": null,
  "error_reasoning": "api_blocked",
  "http_status": 403,
  "note": "redsky.target.com returned 403. Switch to the browser-fallback workflow (Health Data Consent modal + Verified session)."
}
how to use find-a-product

How to use find-a-product on Cursor

AI-first code editor with Composer

1

Prerequisites

Before installing skills in Cursor, ensure your development environment meets these requirements:

  • Cursor installed and configured on your development machine
  • Node.js version 16.0+ with npm package manager (verify with node --version)
  • Active project directory or workspace where you want to add find-a-product
2

Execute installation command

Execute the skills CLI command in your project's root directory to begin installation:

$browse install target.com/find-a-product-nn7l9g

The skills CLI fetches find-a-product from GitHub repository target.com/find-a-product-nn7l9g and configures it for Cursor.

3

Select Cursor when prompted

The CLI will show a list of available agents. Use arrow keys to navigate and space to select Cursor:

◆ Which agents do you want to install to?
│ ── Universal (.agents/skills) ── always included ────
│ • Amp
│ • Antigravity
│ • Cline
│ • Codex
│ ●Cursor(selected)
│ • Cursor
│ • Windsurf
4

Verify installation

Confirm successful installation by checking the skill directory location:

.cursor/skills/find-a-product

Reload or restart Cursor to activate find-a-product. Access the skill through slash commands (e.g., /find-a-product) or your agent's skill management interface.

Security & Verification Notice

We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.

Skills execute code in your development environment. Always verify the publisher's identity, review recent commits, and test in isolated environments before production deployment.

List & Monetize Your Skill

Submit your Claude Code skill and start earning

GET_STARTED →

Use Cases

Task Automation & Efficiency

Automate repetitive workflows and reduce manual effort

Example

Generate reports, summarize documents, draft communications

Save 3-5 hours per week on routine tasks

Knowledge Enhancement

Learn new skills, understand complex topics, get expert guidance

Example

Explain concepts, provide examples, suggest learning resources

Accelerate learning and skill development by 2x

Quality Improvement

Enhance output quality through reviews, suggestions, and refinements

Example

Review drafts, suggest improvements, catch errors

Improve work quality by 30-40% with less effort

Implementation Guide

Prerequisites

  • Claude Desktop or compatible AI client with skill support
  • Clear understanding of task or problem to solve
  • Willingness to iterate and refine outputs

Time Estimate

15-45 minutes depending on use case complexity

Installation Steps

  1. 1.Install skill using provided installation command
  2. 2.Test with simple use case relevant to your work
  3. 3.Evaluate output quality and relevance
  4. 4.Iterate on prompts to improve results
  5. 5.Integrate into regular workflow if valuable

Common Pitfalls

  • Expecting perfect results without iteration
  • Not providing enough context in prompts
  • Using skill for tasks outside its intended scope
  • Accepting outputs without review and validation

Best Practices

✓ Do

  • +Start with clear, specific prompts
  • +Provide relevant context and constraints
  • +Review and refine all outputs before using
  • +Iterate to improve output quality
  • +Document successful prompt patterns

✗ Don't

  • Don't use without understanding skill limitations
  • Don't skip validation of outputs
  • Don't share sensitive information in prompts
  • Don't expect skill to replace human judgment

💡 Pro Tips

  • Be specific about desired format and style
  • Ask for multiple options to choose from
  • Request explanations to understand reasoning
  • Combine AI efficiency with human expertise

When to Use This

✓ Use When

Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.

✗ Avoid When

Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.

Learning Path

  1. 1Familiarize yourself with skill capabilities and limitations
  2. 2Start with low-risk, non-critical tasks
  3. 3Progress to more complex and valuable use cases
  4. 4Build expertise through regular use and experimentation

Discussion

Product Hunt–style comments (not star reviews)
  • No comments yet — start the thread.
general reviews

Ratings

4.840 reviews
  • Anaya Mensah· Dec 24, 2024

    find-a-product reduced setup friction for our internal harness; good balance of opinion and flexibility.

  • Anika Khanna· Dec 20, 2024

    Useful defaults in find-a-product — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.

  • Shikha Mishra· Dec 16, 2024

    find-a-product is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.

  • Mateo Reddy· Dec 16, 2024

    find-a-product has been reliable in day-to-day use. Documentation quality is above average for community skills.

  • Anaya Okafor· Nov 11, 2024

    I recommend find-a-product for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

  • Rahul Santra· Nov 7, 2024

    find-a-product fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.

  • Hassan Desai· Nov 7, 2024

    Solid pick for teams standardizing on skills: find-a-product is focused, and the summary matches what you get after install.

  • Aisha Abbas· Nov 7, 2024

    We added find-a-product from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.

  • Pratham Ware· Oct 26, 2024

    find-a-product has been reliable in day-to-day use. Documentation quality is above average for community skills.

  • Luis Taylor· Oct 26, 2024

    find-a-product is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.

showing 1-10 of 40

1 / 4