---
title: "Browse an Ulta Beauty category page"
method: GET
path: "/ulta/category"
tags: ["Ulta Beauty"]
---

# Browse an Ulta Beauty category page

`GET /ulta/category`

## Request

- Base URL: `https://api.crawlora.net/api/v1`
- URL: `https://api.crawlora.net/api/v1/ulta/category`
- Auth: API key in header `x-api-key`

Browses an Ulta Beauty category page's product grid, with real page-based pagination and the category's own guided-navigation refinement options. category accepts a category path or full URL copied from Ulta's own site navigation (e.g. shop/makeup/eyes/mascara). filter narrows results using Ulta's own guided-navigation facet-code shape (e.g. BENEFIT--WATERPROOF, or a comma-joined combination of codes) -- discover valid codes for a category from that category's own response facets field, whose value is ready to use directly as this parameter. An unrecognized category returns 404.

## Query parameters

- `category` string, required
- `filter` string
- `page` integer

## Headers

- `x-api-key` string, required

## Response `200`

OK

- UltaCategoryResponseDoc
  - `code` integer
  - `data` UltaCategoryResponse
    - `category` string
    - `count` integer
    - `facets` UltaCategoryFacet[]: Facets is the category's own guided-navigation refinement options, read from the same response this package already fetches -- no separate upstream call needed. Confirmed live 2026-08-11 present and non-empty (46 options on an unfiltered category, 17 on a filtered one) on every case tried (unfiltered, filtered, and page 2), so this field is populated whenever the upstream returns it, nil otherwise. Ulta's own guidedNavigation does not carry a live per-option result count (unlike this repo's Nike/Zappos facet shapes), so CategoryFacet has no result-count field.
      - `label` string
      - `selected` boolean
      - `value` string
    - `fetched_at` string
    - `filter` string
    - `has_more` boolean
    - `page` integer
    - `page_size` integer
    - `products` UltaProductSummary[]
      - `brand_name` string
      - `discount` string
      - `image_url` string
      - `is_limited_stock` boolean
      - `list_price` string
      - `product_id` string
      - `product_name` string
      - `promo_text` string
      - `rating` number
      - `review_count` integer
      - `sale_price` string
      - `sku_id` string
      - `sponsored` boolean
      - `url` string
      - `variant_label` string
    - `result_count` integer
    - `source_url` string
  - `msg` string

## Other responses

- `400`: Bad Request
- `404`: Not Found
- `429`: Too Many Requests
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crawlora/apis/crawlora-api.md) · [All operations](https://skmtc.dev/crawlora/apis/crawlora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crawlora/apis/crawlora-api/revisions/afac9b012a27?raw)
