GETapiKeyexample
/oldnavy/search DetailsSearch Old Navy, Gap, Banana Republic, or Athleta products
Searches product listings across Old Navy, Gap, Banana Republic, and Athleta -- select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns normalized product summaries with pricing, review scores, and every purchasable color variant. This search is best-effort relevance, not a guaranteed keyword match: for an obscure or nonsense keyword the upstream search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable signal in the response to distinguish a true keyword match from that fallback behavior.
Response notes
- This search is best-effort relevance, not a guaranteed keyword match. For an obscure or nonsense `keyword`, the upstream search index falls back to its own recommended results instead of returning an empty list, and there is currently no reliable field in the response (no relevance score, no fallback flag, no zero total) to distinguish a true keyword match from that fallback behavior. Treat every response as "what the storefront's own search would show", not as a filtered exact-match result set.
- `total_products` and `total_pages` reflect the upstream's own pagination metadata for the current `keyword`/`brand` combination.
- Each product's `colors[].id` is the value to pass as `pid` to `oldnavy-product` for full product-detail data on that color.
- Requesting a `page` beyond the upstream's own last page returns `404`.
- `facets` lists the available filters (price range, department, review score, color, fit, wash, and others) with live per-option result counts. A range facet (e.g. price) sets `is_range` true and carries `range_min`/`range_max` instead of `options`.
Example response:
```json
{"code":200,"msg":"OK","data":{"keyword":"jeans","brand":"on","page":1,"page_size":60,"total_pages":12,"total_products":699,"count":1,"products":[{"id":"788099","name":"Mid-Rise Wow Baggy Wide-Leg Jeans","review_score":4.62,"review_count":4348,"price_min":39.99,"price_max":39.99,"sale_price_min":26,"sale_price_max":26,"thumbnail_url":"https://content.gapinc.com/b/0060/143/994/cn60143994.png?width=258","url":"https://oldnavy.gap.com/browse/product.do?pid=788099002","colors":[{"id":"788099002","name":"Black","short_description":"Licorice","price":26,"regular_price":39.99,"percentage_off":35,"image_url":"https://content.gapinc.com/b/0060/143/994/cn60143994.png?width=520"}]}],"facets":[{"name":"price","type":"range","range_min":4.99,"range_max":64.99,"is_range":true},{"name":"department","label":"department","type":"single-select","options":[{"label":"Women","value":"Women","count":282}]}]}}
```
keyword:querybrand:querypage:query+1 more
GETapiKeyexample
/oldnavy/product DetailsGet an Old Navy, Gap, Banana Republic, or Athleta product
Returns normalized product-detail data for one color variant: name, description, images, aggregate rating, and every size offered in that color as a separate priced offer. pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id). Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under.
Response notes
- `offers` lists every size available in the requested color, each with its own `sku`, `price`, `currency`, and `availability`. `availability` is normalized from the upstream's full schema.org URL form (e.g. `https://schema.org/InStock`) down to its bare name, e.g. `InStock`, `OutOfStock`.
- `related_items` lists this product's own "Related items" cross-sell links -- each with the linked product's name, `pid`, and URL. It may be empty if the page carries none.
- An unknown or invalid `pid` returns `404`.
- A non-numeric or missing `pid` returns `400` before any upstream request is made.
Example response:
```json
{
"code": 200,
"msg": "OK",
"data": {
"pid": "907290012",
"brand": "on",
"name": "Full-Zip Faux-Suede Harrington Jacket",
"description": "spread collar zip front elastic waist flap front pockets Product #907290",
"color": "Dark Brown",
"images": [
"https://oldnavy.gap.com/webcontent/0062/975/342/cn62975342.jpg",
"https://oldnavy.gap.com/webcontent/0062/975/375/cn62975375.jpg"
],
"rating_value": 3.71,
"rating_count": 7,
"url": "https://oldnavy.gap.com/browse/product.do?pid=907290012",
"offers": [
{
"sku": "9072900120004",
"price": 69.99,
"currency": "USD",
"availability": "InStock",
"url": "https://oldnavy.gap.com/browse/product.do?pid=9072900120004"
}
],
"related_items": [
{
"name": "Full-Zip Poplin Jacket",
"pid": "902599012",
"url": "https://oldnavy.gap.com/browse/product.do?pid=902599012&cl=true&nav=smartlink:Women::Coats%20%26%20Jackets"
}
]
}
}
```
pid:querybrand:queryx-api-key:header
GETapiKeyexample
/oldnavy/category DetailsBrowse an Old Navy, Gap, Banana Republic, or Athleta category
Returns a category/browse listing for one storefront category id (cid). cid is an opaque Gap Inc category id assigned by the storefront's own navigation -- neither oldnavy-search nor oldnavy-category currently surface a category-id list, so find one from the storefront's own category page URLs (the cid query parameter on a /browse/... page) for now. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the cid was found under. Returns the category's subcategory breakdown, normalized product summaries with per-color inventory data, and available search facets with live counts.
Response notes
- `categories` breaks the listing into its subcategory groups (e.g. "Slim Jeans" within a "Jeans" category), each with the specific color-level product ids (`items[].cc_id`) that belong to it.
- Each product's `colors[].id` is the value to pass as `pid` to `oldnavy-product` for full product-detail data on that color -- the same id space as `oldnavy-search`'s `colors[].id`.
- Each color additionally carries live inventory data not present on `oldnavy-search`: `inventory_count`, `inventory_status`, `back_order_inventory_count`, and `back_order_inventory_status`.
- `facets` lists the available filters (price range, department, review score, color, fit, and others) with live per-option result counts.
- An unknown `cid` returns `404`. A `page` beyond the upstream's own last page returns a `200` with an empty `products` array (not a `404`) -- this differs from `oldnavy-search`'s own overflow behavior.
- A non-numeric or missing `cid` returns `400` before any upstream request is made.
Example response:
```json
{"code":200,"msg":"OK","data":{"category_id":"85729","brand":"on","page":1,"page_size":200,"total_pages":2,"total_colors":392,"count":1,"categories":[{"category_id":"85729","category_name":"Jeans","sub_category_id":"3051473","sub_category_name":"Slim Jeans","items":[{"cc_id":"896223002","style_id":"431453"}]}],"products":[{"id":"734897","name":"High-Waisted Wow Super-Skinny Jeans","review_score":4.6,"review_count":38414,"url":"https://oldnavy.gap.com/browse/product.do?pid=886872002","colors":[{"id":"886872002","name":"White","short_description":"Calla Lily White","price":22.0,"regular_price":34.99,"percentage_off":37,"image_url":"https://oldnavy.gap.com/webcontent/0061/704/456/cn61704456.jpg","inventory_count":55,"inventory_status":"In Stock","back_order_inventory_count":0,"back_order_inventory_status":"Out of Stock"}]}],"facets":[{"name":"price","type":"range","range_min":4.99,"range_max":64.99,"is_range":true},{"name":"department","label":"department","type":"single-select","options":[{"label":"Women","value":"Women","count":282}]}]}}
```
cid:querybrand:querypage:query+1 more
GETapiKeyexample
/oldnavy/categories DetailsList Old Navy storefront categories
Lists Old Navy's own storefront navigation as name/cid pairs, resolving the cid-discovery gap oldnavy-search, oldnavy-product, and oldnavy-category all document. Omit cid to list Old Navy's top-level divisions (e.g. Women, Men, Boys, Toddler). Pass a cid (a division's own, or any deeper category's) to list the related categories for that part of the storefront instead, in the same order the live storefront menu shows them -- this is section-level, not necessarily unique per leaf category. Currently only available for brand=on (Old Navy) -- Gap, Banana Republic, and Athleta render their storefront navigation as client-side-only JavaScript with no server-rendered category id to scrape.
Response notes
- Omit `cid` to list Old Navy's top-level divisions (New & Trending!,
Uniforms, Activewear, Women, Men, Girls, Boys, Toddler, Baby, Maternity,
Today's Deals!), sourced from the storefront's own homepage top nav.
- Pass a `cid` -- a division's own, or any deeper category's -- to list
the related categories for that part of the storefront instead, in the
same order the live storefront menu shows them. This is section-level,
not necessarily unique per leaf: a narrow subcategory's `cid` (e.g.
Boys T-Shirts) currently returns the same list as its parent division
(Boys), since Old Navy serves this block once per section rather than
once per category. Each returned entry's `cid` is usable directly as
the `cid` query parameter to [`oldnavy-category`](oldnavy-category.md).
- **Currently only available for `brand=on` (Old Navy).** Gap, Banana
Republic, and Athleta render their storefront navigation as client-side-only
JavaScript with no server-rendered category id to scrape -- passing any
other `brand` value returns `400`.
- A non-numeric `cid` returns `400` before any upstream request is made.
- Old Navy does not return a distinct not-found signal for an unrecognized
`cid` on this page (unlike `oldnavy-category`'s own commerce-API lookup,
which does 404 cleanly) -- an unrecognized `cid` and a genuinely
leaf-level category with no further children both look the same
(`503`). If you need a hard not-found check for a specific `cid`, use
`oldnavy-category` instead.
Example response (`cid` omitted -- top-level divisions):
```json
{"code":200,"msg":"OK","data":{"brand":"on","source_url":"https://oldnavy.gap.com/","fetched_at":"2026-08-10T00:00:00Z","categories":[{"name":"New & Trending!","cid":"3028309","url":"https://oldnavy.gap.com/browse/category.do?cid=3028309&mlink=5151,topNav,visnav&nav=meganav%3ANew%20%26%20Trending!%3A%3A"},{"name":"Women","cid":"1185233","url":"https://oldnavy.gap.com/browse/category.do?cid=1185233&mlink=5151,topNav,visnav&nav=meganav%3AWomen%3A%3A"},{"name":"Boys","cid":"1185232","url":"https://oldnavy.gap.com/browse/category.do?cid=1185232&mlink=5151,topNav,visnav&nav=meganav%3ABoys%3A%3A"}]}}
```
Example response (`cid=1185232`, Boys -- subcategories):
```json
{"code":200,"msg":"OK","data":{"brand":"on","cid":"1185232","source_url":"https://oldnavy.gap.com/browse/category.do?cid=1185232","fetched_at":"2026-08-10T00:00:00Z","categories":[{"name":"T-Shirts","cid":"36097","url":"https://oldnavy.gap.com/browse/category.do?cid=36097&cl=true#department=16"},{"name":"Jeans","cid":"5936","url":"https://oldnavy.gap.com/browse/category.do?cid=5936&cl=true#department=16"},{"name":"Boys Shop by Size 5-20","cid":"39659","url":"https://oldnavy.gap.com/browse/category.do?cid=39659&cl=true#department=16"}]}}
```
brand:querycid:queryx-api-key:header
GETapiKeyexample
/oldnavy/stores DetailsFind Old Navy, Gap, Banana Republic, or Athleta store locations
Searches physical store locations for one storefront by free-text search (zip code or city) and/or coordinates. Provide search, or both lat and lng. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Returns each nearby store's name, full address, phone number, coordinates, distance, and specialties (e.g. "In-Store Shopping", "Outlet"). This is location search only -- it does not report per-item, per-store stock levels; use oldnavy-product-availability for that.
Response notes
- Each store includes its name, full street address, phone number, coordinates, distance from the search location (miles), and `specialties` (e.g. `"In-Store Shopping"`, `"Outlet"`, `"ON Beauty"`).
- This endpoint is location search only -- it does not report per-item, per-store stock availability.
- A search with no nearby matches returns `200` with an empty `stores` array, not an error.
- Neither `search` nor a complete `lat`/`lng` pair returns `400` before any upstream request is made. `lat` and `lng` must be given together.
Example response:
```json
{"code":200,"msg":"OK","data":{"brand":"on","search":"10001","count":1,"stores":[{"name":"TIMES SQUARE","address":"1516 Broadway","city":"New York","region":"NY","postal_code":"10036","country":"US","phone":"(646) 866-5935","latitude":40.7574365,"longitude":-73.9854489,"distance_miles":0.8,"specialties":["ON Beauty","In-Store Shopping"],"url":"https://stores.oldnavy.gap.com.prod.rioseo.com/ny/newyork/oldnavy-3444.html"}]}}
```
search:querylat:querylng:query+2 more
GETapiKeyexample
/oldnavy/product/availability DetailsCheck in-store pickup stock for an Old Navy, Gap, Banana Republic, or Athleta product
Checks per-size, in-store pickup stock status for one color (pid) at one or more physical stores. pid matches oldnavy-product's own color-level id. Give store location either directly with store_id (one or more comma-separated store ids, e.g. from a prior call to this endpoint or a value you already have) or with zip or both lat and lng, which resolves the nearest stores automatically. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`). Each returned store lists every offered size's stock status: `in_stock`, `out_of_stock`, or `low_stock`.
Response notes
- Each store's `sizes` array lists every offered size's stock status: `IN_STOCK`, `OUT_OF_STOCK`, or `LOW_STOCK`.
- `name`, `address`, `city`, `region`, `postal_code`, `phone`, and `distance_miles` are only populated when the store was resolved via `zip` or `lat`/`lng` -- a caller-supplied `store_id` has no accompanying store metadata from this source.
- A `zip`/`lat`/`lng` search with no nearby stores returns a normal `200` with an empty `stores` array, not an error.
- An unrecognized `pid` returns `404`.
- An unrecognized `store_id` given directly (not resolved via `zip`/`lat`/`lng`) is not detectable as an error from this endpoint -- it returns every size as `OUT_OF_STOCK` rather than an error, a known upstream limitation.
Example response:
```json
{
"code": 200,
"msg": "OK",
"data": {
"pid": "907290012",
"brand": "on",
"style_id": "907290",
"count": 1,
"stores": [
{
"store_id": "3444",
"name": "TIMES SQUARE",
"address": "1516 Broadway",
"city": "New York",
"region": "NY",
"postal_code": "10036",
"phone": "(646) 866-5935",
"distance_miles": 0.77,
"sizes": [
{"sku": "9072900120004", "fit": "REGULAR", "status": "IN_STOCK"},
{"sku": "9072900120000", "fit": "REGULAR", "status": "LOW_STOCK"}
]
}
]
}
}
```
pid:querybrand:querystore_id:query+4 more
GETapiKeyexample
/oldnavy/product/reviews DetailsGet reviews for an Old Navy, Gap, Banana Republic, or Athleta product
Returns one page of a product's customer reviews (author, date, rating, headline, body, and verified-purchase flag), plus the product's overall rating summary (average rating, rating count, per-star histogram, and recommended ratio). pid is a color-specific product id, as returned by oldnavy-search's product colors[].id field (not the bare base product id) -- the same pid oldnavy-product accepts. Select the storefront with the brand parameter (`on` for Old Navy, `gap` for Gap, `br` for Banana Republic, `at` for Athleta; defaults to `on`) -- it must match the brand the pid was found under. A product with no reviews yet returns a well-formed empty result, not an error.
Response notes
- A product with no reviews yet returns a well-formed empty result (`total_reviews: 0`, `reviews: []`), not an error.
- `rating_histogram` is the count of ratings per star, ascending: index `0` is 1-star, index `4` is 5-star. It is omitted along with `rating_count`/`average_rating`/`recommended_ratio` when the product has no reviews at all.
- `total_reviews`/`total_pages` describe the full review set, independent of how many reviews are returned on this page.
- An unknown or invalid `pid` returns `404`.
- A non-numeric or missing `pid` returns `400` before any upstream request is made.
Example response:
```json
{
"code": 200,
"msg": "OK",
"data": {
"pid": "788099002",
"brand": "on",
"page": 1,
"page_size": 10,
"total_pages": 386,
"total_reviews": 3856,
"rating_count": 3856,
"average_rating": 4.6154045643153525,
"recommended_ratio": 1,
"rating_histogram": [122, 62, 183, 443, 3046],
"count": 1,
"reviews": [
{
"id": "270852250",
"rating": 1,
"headline": "Too large",
"body": "I normally wear a size 4, I ordered these online and the waist band is huge!...",
"author": "Sadie, P",
"location": "Undisclosed",
"verified_purchase": false,
"helpful_votes": 0,
"not_helpful_votes": 0,
"created_at": "2026-08-18T08:43:32Z",
"updated_at": "2026-08-18T10:16:20Z"
}
]
}
}
```
pid:querybrand:querypage:query+1 more