A curated list of publicly discoverable web APIs used by major U.S. beauty and department store retailers. Inspired by public-apis/public-apis, this repository documents endpoints, request patterns, and headers needed to experiment with Macy's, Sephora, Ulta, and Nordstrom data.
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Listing | https://www.macys.com/xapi/discover/v1/catalog/category/{categoryId} |
GET |
?page=1&pageSize=40&sortBy=ORIGINAL&include=FACETS,PRODUCTS |
JSON{"Accept":"application/json, text/plain, /","Content-Type":"application/json","Origin":"https://www.macys.com","Referer":"https://www.macys.com/shop/makeup","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Replace {categoryId} with Macy's numeric ID from nav links (e.g. 46345). Supports sortBy, page, pageSize, and include to control grids/facets. |
| Product Details | https://www.macys.com/xapi/product/v3/pdp/{productId} |
GET |
?experience=pdp&include=AVAILABLE_SIZES,MEDIA,PRICES |
JSON{"Accept":"application/json, text/plain, /","Content-Type":"application/json","Origin":"https://www.macys.com","Referer":"https://www.macys.com/shop/product?ID=5607075","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
{productId} aligns with the ID query param on PDP URLs. include toggles payload slices (images, price blocks, availability, etc.). |
| Product Search | https://www.macys.com/xapi/discover/v1/catalog/search |
GET |
?searchphrase=lipstick&page=1&pageSize=40&sortBy=ORIGINAL |
JSON{"Accept":"application/json, text/plain, /","Content-Type":"application/json","Origin":"https://www.macys.com","Referer":"https://www.macys.com/shop/featured/lipstick","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Pagination controlled via page/pageSize. Browser-like User-Agent prevents 403 responses. |
| Product Reviews | https://api.bazaarvoice.com/data/reviews.json |
GET |
?apiversion=5.5&passkey=<public-key>&displaycode=macys-en_us&filter=productid:eq:5607075&page=1&page_size=20&sort=submissiontime:desc |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.macys.com","Referer":"https://www.macys.com/shop/product?ID=5607075","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Reviews powered by Bazaarvoice; harvest the passkey/displaycode from the BV script tag. Supports rich filters (photos/videos, rating ranges, locale). |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Listing | https://www.sephora.com/api/catalog/categories/{categoryId}/products |
GET |
?currentPage=1&pageSize=60&sortBy=bestSelling |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.sephora.com","Referer":"https://www.sephora.com/shop/makeup","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","X-Requested-With":"XMLHttpRequest"} |
Swap {categoryId} with Sephora's catXXXXX identifier (inspect nav links). Query params paginate/sort results. |
| Product Search | https://www.sephora.com/api/catalog/search |
GET |
?keyword=lipstick&pageSize=60¤tPage=1 |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.sephora.com","Referer":"https://www.sephora.com/search?keyword=lipstick","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","X-Requested-With":"XMLHttpRequest"} |
keyword parameter required; pagination uses currentPage + pageSize. Keep origin/referer aligned with onsite search page. |
| Product Reviews | https://api.bazaarvoice.com/data/reviews.json |
GET |
?apiversion=5.5&passkey=<public-key>&displaycode=sephora-en_us&filter=productid:eq:P379884&page=1&page_size=20&sort=submissiontime:desc |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.sephora.com","Referer":"https://www.sephora.com/product/rare-beauty?_sku=P379884","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Bazaarvoice hosts Sephora's UGC. Grab passkey/displaycode from network tab (Bazaarvoice.config). Filters can include rating and contentlocale. |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Listing | https://services.ulta.com/search/v2/search/category |
GET |
?categoryId=cat90004&page=1&pageSize=24&sortBy=bestSeller |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.ulta.com","Referer":"https://www.ulta.com/shop/makeup","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","x-ulta-api-version":"2","x-ulta-platform":"web"} |
Same payload as onsite category grids; categoryId matches cat##### value in URL. sortBy accepts topRated, priceLow, etc. |
| Product Search | https://services.ulta.com/search/v2/search/product |
GET |
?keyword=lipstick&page=1&pageSize=24&sortBy=bestSeller |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.ulta.com","Referer":"https://www.ulta.com/search?keyword=lipstick","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","x-ulta-api-version":"2","x-ulta-platform":"web"} |
keyword drives base search; optional filters include sortBy, categoryIds, pageSize. Custom lowercase headers required. |
| Product Reviews | https://api.bazaarvoice.com/data/reviews.json |
GET |
?apiversion=5.5&passkey=<public-key>&displaycode=ulta-1&filter=productid:eq:2564014&page=1&page_size=20&include=authors |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.ulta.com","Referer":"https://www.ulta.com/p/lipstick?productId=2564014","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Ulta also fronts Bazaarvoice; passkey/displaycode rendered in BV script tag. Supports incentivizedstats, ratingdistribution, etc. |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Listing | https://www.nordstrom.com/api/category/{categoryId} |
GET |
?page=1&pageSize=24&sort=featured |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.nordstrom.com","Referer":"https://www.nordstrom.com/browse/women","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","x-country-code":"US","x-language":"en-US"} |
Swap {categoryId} with numeric dept ID (e.g. 6000002). Response includes products + facets; page/pageSize paginate grid results. |
| Search Suggestions | https://www.nordstrom.com/api/search/data |
GET |
?keyword=lipstick&top=20&skip=0 |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.nordstrom.com","Referer":"https://www.nordstrom.com/sr?keyword=lipstick","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","x-country-code":"US","x-language":"en-US"} |
top controls returned records; skip is the offset. Match locale headers to target site language. |
| Product Reviews | https://api.bazaarvoice.com/data/reviews.json |
GET |
?apiversion=5.5&passkey=<public-key>&displaycode=nordstrom-en_us&filter=productid:eq:6525612&page=1&page_size=20&sort=relevancy:desc |
JSON{"Accept":"application/json, text/plain, /","Origin":"https://www.nordstrom.com","Referer":"https://www.nordstrom.com/s/product/6525612","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Nordstrom exposes Bazaarvoice behind the scenes. Identify the passkey/displaycode from Bazaarvoice script tags. Supports Filter=HasPhotos:eq:true for UGC media pulls. |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Search (PA-API 5) | https://webservices.amazon.com/paapi5/searchitems |
POST |
Body: {"Keywords":"vitamin c serum","SearchIndex":"Beauty","ItemPage":1,"Resources":["Images.Primary.Medium","ItemInfo.Title","Offers.Listings.Price"],"PartnerTag":"exampletag-20","PartnerType":"Associates","Marketplace":"www.amazon.com"} |
JSON{"Content-Type":"application/json; charset=UTF-8","Accept":"application/json","Host":"webservices.amazon.com","X-Amz-Date":"20240517T193455Z","X-Amz-Target":"com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems","Authorization":"AWS4-HMAC-SHA256 Credential=/20240517/us-east-1/ProductAdvertisingAPI/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature="} |
Requires approved Product Advertising API (PA-API 5.0) keys + PartnerTag. SearchIndex must match an allowed browse node (e.g. Beauty). Requests are SigV4 signed and limited to 1 TPS/8640 per day by default. |
| Product Details (GetItems) | https://webservices.amazon.com/paapi5/getitems |
POST |
Body: {"ItemIds":["B09V3JGQJ8"],"Resources":["ItemInfo.Title","ItemInfo.Features","Offers.Listings.Price"],"PartnerTag":"exampletag-20","PartnerType":"Associates","Marketplace":"www.amazon.com"} |
JSON{"Content-Type":"application/json; charset=UTF-8","Accept":"application/json","Host":"webservices.amazon.com","X-Amz-Date":"20240517T193455Z","X-Amz-Target":"com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems","Authorization":"AWS4-HMAC-SHA256 Credential=/20240517/us-east-1/ProductAdvertisingAPI/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature="} |
Returns all attributes for up to 10 ASINs per call. Batch lookups move faster when you only request the Resources you actually need (e.g. ItemInfo.Title, Offers.Listings.Availability.Message). |
| Variation Grid (GetVariations) | https://webservices.amazon.com/paapi5/getvariations |
POST |
Body: {"ASIN":"B07PGL2ZSL","VariationPage":1,"Resources":["Images.Variants.Medium","ItemInfo.Title","Offers.Listings.Price"],"PartnerTag":"exampletag-20","PartnerType":"Associates","Marketplace":"www.amazon.com"} |
JSON{"Content-Type":"application/json; charset=UTF-8","Accept":"application/json","Host":"webservices.amazon.com","X-Amz-Date":"20240517T193455Z","X-Amz-Target":"com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetVariations","Authorization":"AWS4-HMAC-SHA256 Credential=/20240517/us-east-1/ProductAdvertisingAPI/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature="} |
Surface child ASINs (shades, sizes, bundles) for a parent product. Paginate with VariationPage (1–10) and use VariationFilters to focus on specific dimensions. |
| Product Reviews (AJAX) | https://www.amazon.com/hz/reviews-render/ajax/reviews/get/ |
GET |
?asin=B09V3JGQJ8&sortBy=recent&reviewerType=all_reviews&pageNumber=1&scope=reviews_widget |
JSON{"Accept":"text/html, /","X-Requested-With":"XMLHttpRequest","Referer":"https://www.amazon.com/dp/B09V3JGQJ8","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","Cookie":"session-id=; session-id-time=; ubid-main="} |
Same endpoint Amazon uses for the PDP review widget. Requires valid session cookies (captured from any amazon.com page) and a browser-like UA to avoid 404/robots blocks. Supports filterByStar=one_star, formatType=current_format, etc. |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Search / PLP | https://horizon-api.www.dermstore.com/graphql |
POST |
Body: {"query":"query Search($query:String!,$options:ProductListInput!){search(query:$query,options:$options){productList{total products{sku title brand{name} priceRange{min{value currency}}}}}}","variables":{"query":"sunscreen","options":{"currency":"USD","shippingDestination":"US","limit":32,"offset":0,"sort":"RELEVANCE","facets":[]}}} |
JSON{"Accept":"application/json","Content-Type":"application/json","Origin":"https://www.dermstore.com","Referer":"https://www.dermstore.com/","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
ProductListInput drives pagination (limit/offset), locale (currency, shippingDestination), sorting, and facet filters (facets:[{facetName:"brand",selections:["SkinCeuticals"]}]). Response returns total hits, corrected queries, sponsored placements, etc. |
| Product Details | https://horizon-api.www.dermstore.com/graphql |
POST |
Body: {"query":"query Product($sku:SKU!){product(sku:$sku,strict:true){sku title url priceRange{min{value currency}} brand{name} content{...on RichContent{text}} reviews{averageScore total}}}","variables":{"sku":"DS3002"}} |
JSON{"Accept":"application/json","Content-Type":"application/json","Origin":"https://www.dermstore.com","Referer":"https://www.dermstore.com/","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
The product query exposes full PDP content (variants, marketing copy, reviews histogram, gallery assets). Pass strict:true to suppress redirects when SKUs are discontinued. |
| Bulk SKU Lookup | https://horizon-api.www.dermstore.com/graphql |
POST |
Body: {"query":"query Products($skus:[SKU!]!){products(skus:$skus){sku title brand{name} priceRange{min{value currency}} defaultVariant{availability{stockStatus}}}}","variables":{"skus":["DS3002","DS1034"]}} |
JSON{"Accept":"application/json","Content-Type":"application/json","Origin":"https://www.dermstore.com","Referer":"https://www.dermstore.com/","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Ideal for syncing price/availability across multiple SKUs. Returns an array ordered as requested; useful fields include cheapestVariant, mostExpensiveVariant, and associatedProducts. |
| Instant Search Suggestions | https://horizon-api.www.dermstore.com/graphql |
POST |
Body: {"query":"query Instant($query:String!){instantSearch(query:$query,currency:USD,shippingDestination:US,limit:6){suggestions{value type} products{sku title}}}","variables":{"query":"retinol"}} |
JSON{"Accept":"application/json","Content-Type":"application/json","Origin":"https://www.dermstore.com","Referer":"https://www.dermstore.com/","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Mirrors the header search-as-you-type widget. instantSearch returns keyword suggestions plus lightweight product hits. Increase limit up to 20 per request. |
| API | Base URL | Method | Example Query | Required Headers | Notes |
|---|---|---|---|---|---|
| Product Listing (PLP) | https://redsky.target.com/redsky_aggregations/v1/web/plp_search_v1 |
GET |
?count=24&offset=0&keyword=lipstick&channel=WEB&default_purchasability_filter=true&include_sponsored=true&page=%2Fs%2Flipstick&platform=desktop&pricing_store_id=3991&store_ids=3991&visitor_id=019B251831DD0201B5414FCCEBA263BA&key=9f36aeafbe60771e321a7cc95a78140772ab3e96 |
JSON{"Accept":"application/json","Origin":"https://www.target.com","Referer":"https://www.target.com/s?searchTerm=lipstick","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","redsky-client-name":"browse","redsky-client-version":"1.0.0"} |
Core RedSky search endpoint. count sets page size (up to 96) and offset is zero-based. visitor_id, preferred store IDs, and the long-lived public key can be copied from window.__TGT_DATA__ in view-source. |
| Product Details (PDP client) | https://redsky.target.com/redsky_aggregations/v1/web/pdp_client_v1 |
GET |
?tcin=13860428&pricing_store_id=3991&store_id=3991&has_store_id=true&key=9f36aeafbe60771e321a7cc95a78140772ab3e96&visitor_id=019B251831DD0201B5414FCCEBA263BA |
JSON{"Accept":"application/json","Origin":"https://www.target.com","Referer":"https://www.target.com/p/13860428","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","redsky-client-name":"pdp","redsky-client-version":"1.0.0"} |
Returns complete PDP payload (fulfillment, price, bullets, media, variation hierarchy). Add scheduled_delivery_store_id or has_financing_options=true to surface additional sections. |
| Product Summaries | https://redsky.target.com/redsky_aggregations/v1/web/product_summary_with_fulfillment_v1 |
GET |
?tcins=13860428%2C12940253&key=9f36aeafbe60771e321a7cc95a78140772ab3e96&pricing_store_id=3991&store_id=3991&channel=WEB |
JSON{"Accept":"application/json","Origin":"https://www.target.com","Referer":"https://www.target.com/","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36","redsky-client-name":"browse","redsky-client-version":"1.0.0"} |
Lightweight endpoint for cart/quick-view experiences. Supports up to 40 tcins per call and returns availability per store/ship method. |
| Search Suggestions (Typeahead) | https://typeahead.target.com/search_box/v3/suggestions |
GET |
?query=lipstick&client=web&channel=WEB&count=6&visitor_id=019B251831DD0201B5414FCCEBA263BA&key=9f36aeafbe60771e321a7cc95a78140772ab3e96 |
JSON{"Accept":"application/json","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Exposes the auto-complete service. count caps returned suggestions (default 10). visitor_id keeps personalization consistent with other calls. |
| Product Reviews | https://api.bazaarvoice.com/data/reviews.json |
GET |
?apiversion=5.5&passkey=<target-passkey>&displaycode=2070-en_us&filter=productid:eq:13860428&page=1&page_size=20&sort=submissiontime:desc |
JSON{"Accept":"application/json","Origin":"https://www.target.com","Referer":"https://www.target.com/p/13860428","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36"} |
Target’s PDP widgets are powered by Bazaarvoice. The passkey + displaycode pair ship in apps.bazaarvoice.com/deployments/targetcom/main_site/production/en_US/bv.js. Use filter=rating:eq:5 or include=authors,products for richer payloads. |
- ✅ Provide a single, version-controlled index of high-value retail API endpoints.
- ✅ Document practical request examples (URL + headers) that community members can reproduce.
- ✅ Encourage contributions via Pull Requests, similar to other public API catalogs.
- Fork the repository and create a topical branch (e.g.
feature/add-kohls-api). - Add or update rows in the "Contents" table above (keep columns in the documented order).
- Include a short description, verified sample query, and minimum headers required to replay the request.
- Run any linters or formatters you've configured (none are imposed by default).
- Open a Pull Request that briefly explains how you discovered or tested the endpoint.
Need help structuring a new entry? Copy/paste an existing table row and adjust the cells for the new API. Feel free to open issues for discussion or share additional context before submitting a PR.
All original content in this repository is released under the MIT License. API responses belong to their respective owners; please follow each retailer's Terms of Service.