Ulta Product Scraper
Pricing
from $4.30 / 1,000 overview products
Ulta Product Scraper
Scrape Ulta Beauty products — brand, price, ratings, images, ingredients & shade variants. Browse any category, full detail enrichment, clean JSON/CSV, no code.
Ulta Product Scraper
Pricing
from $4.30 / 1,000 overview products
Scrape Ulta Beauty products — brand, price, ratings, images, ingredients & shade variants. Browse any category, full detail enrichment, clean JSON/CSV, no code.
You can access the Ulta Product Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in Integrations settings in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "1.0", "x-build-id": "P618C6W2gPVFwgdT0" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/sian.agency~ulta-product-scraper/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-sian.agency-ulta-product-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } }, "/acts/sian.agency~ulta-product-scraper/runs": { "post": { "operationId": "runs-sync-sian.agency-ulta-product-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor and returns information about the initiated run in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/runsResponseSchema" } } } } } } }, "/acts/sian.agency~ulta-product-scraper/run-sync": { "post": { "operationId": "run-sync-sian.agency-ulta-product-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } } }, "components": { "schemas": { "inputSchema": { "type": "object", "properties": { "categories": { "title": "🗂️ Category Paths", "type": "array", "description": "🗂️ **CATEGORY BROWSING:** The Ulta category pages to scrape — copy the path straight from any Ulta browse page URL.\n\n📝 **EXAMPLES:** `/shop/makeup/eyes/mascara` · `/shop/skincare/moisturizers` · `/shop/hair/shampoo-conditioner` · `/shop/fragrance/women`\n\n🔧 **HOW TO GET IT:** Open any Ulta category page, then copy the part of the URL after `ulta.com` (e.g. `https://www.ulta.com/shop/makeup/eyes/mascara` → paste `/shop/makeup/eyes/mascara`). A full URL works too.\n\n💡 **TIP:** Add one category per line — each runs as its own browse and all results land in the same dataset.\n\n🖊️ **BULK EDIT:** Click \"Bulk edit\" to paste many categories at once (one per line).\n\n✅ **IMPORTANT:** Provide at least one category (or, in Detail mode, product URLs) so there's something to scrape.", "default": [ "/shop/makeup/eyes/mascara" ], "items": { "type": "string" } }, "scrapeMode": { "title": "⚙️ Scrape Mode", "enum": [ "overview", "detail" ], "type": "string", "description": "⚙️ **SCRAPE DEPTH:** Choose how much data to pull per product.\n\n⚡ **Overview (fast):** Category results only — brand, product name, list/sale price, rating, reviews, image, badges and shade/size variant label. Fastest and cheapest path (64 products per page).\n\n🔬 **Detail (full description):** Everything in Overview PLUS the full product description, ingredients list, how-to-use directions, category breadcrumbs and every shade/size variant scraped from each product page.\n\n💡 **TIP:** Start with Overview to scope your catalog, then switch to Detail when you need descriptions, ingredients or the full variant list.", "default": "overview" }, "sort": { "title": "🔃 Sort Order", "enum": [ "best_sellers", "top_rated", "new_arrivals", "price_low", "price_high" ], "type": "string", "description": "🔃 **RESULT ORDERING:** Order category results using Ulta's own native sort options — so you get the same ranking real shoppers see.\n\n🏆 **Best sellers** surfaces the most popular products first · ⭐ **Top rated** leads with the highest-reviewed items · 🆕 **New arrivals** prioritizes the latest launches · 💲 **Price** sorts ascending or descending.", "default": "best_sellers" }, "gnFilters": { "title": "🎛️ Category Filters (Advanced)", "type": "array", "description": "🎛️ **FACET FILTERING (Advanced):** Narrow a category to a specific segment using Ulta's own filters.\n\n🔧 **HOW TO GET IT:** Apply any filter on an Ulta category page and copy the `gn=` value from the URL (e.g. `?gn=BENEFIT--WATERPROOF` → paste `BENEFIT--WATERPROOF`). Common groups include `BRAND`, `COLOR_EYES`, `BENEFIT`, `PRICE`, `PREFERENCE`.\n\n💡 **TIP:** Leave empty to scrape the full category. Add multiple filters (one per line) to stack them.\n\n🖊️ **BULK EDIT:** Add one filter per line.", "items": { "type": "string" } }, "productUrls": { "title": "🔗 Product URLs (Detail Mode)", "type": "array", "description": "🔗 **DIRECT PRODUCT ENRICHMENT (Detail mode only):** Specific Ulta product pages to scrape directly — full description, ingredients, directions and variants.\n\n📝 **EXAMPLE:** `https://www.ulta.com/p/tartelette-tubing-mascara-pimprod2033171?sku=2596644`\n\n💡 **TIP:** Use this when you already know the exact products you want — no category browse needed. Requires Scrape Mode = Detail.\n\n🖊️ **BULK EDIT:** Add one product URL per line.", "items": { "type": "string" } }, "maxResults": { "title": "🔢 Max Results", "minimum": 1, "type": "integer", "description": "🔢 **RESULT CAP:** Maximum number of products to return across all categories combined.\n\n🎁 **TIER-BASED LIMITS:**\n- **FREE users:** Up to 25 products per run\n- **PAID users:** Unlimited — scrape entire categories in a single run\n\n💡 **TIP:** Keep this low while you dial in your categories, then raise it once the output looks right.", "default": 100 } } }, "runsResponseSchema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string" }, "actId": { "type": "string" }, "userId": { "type": "string" }, "startedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "finishedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "status": { "type": "string", "example": "READY" }, "meta": { "type": "object", "properties": { "origin": { "type": "string", "example": "API" }, "userAgent": { "type": "string" } } }, "stats": { "type": "object", "properties": { "inputBodyLen": { "type": "integer", "example": 2000 }, "rebootCount": { "type": "integer", "example": 0 }, "restartCount": { "type": "integer", "example": 0 }, "resurrectCount": { "type": "integer", "example": 0 }, "computeUnits": { "type": "integer", "example": 0 } } }, "options": { "type": "object", "properties": { "build": { "type": "string", "example": "latest" }, "timeoutSecs": { "type": "integer", "example": 300 }, "memoryMbytes": { "type": "integer", "example": 1024 }, "diskMbytes": { "type": "integer", "example": 2048 } } }, "buildId": { "type": "string" }, "defaultKeyValueStoreId": { "type": "string" }, "defaultDatasetId": { "type": "string" }, "defaultRequestQueueId": { "type": "string" }, "buildNumber": { "type": "string", "example": "1.0.0" }, "containerUrl": { "type": "string" }, "usage": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "integer", "example": 1 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 } } }, "usageTotalUsd": { "type": "number", "example": 0.00005 }, "usageUsd": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "number", "example": 0.00005 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for Ulta Product Scraper from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: