Grailed Scraper — Streetwear Resale & Sold Prices
Pricing
from $3.88 / 1,000 listings
Grailed Scraper — Streetwear Resale & Sold Prices
Collect Grailed listings from Grailed's public search service. Get prices, conditions, seller data, sold status, and URLs. Run with searchQuery; no Grailed login or API key. Pricing: $0.004 per result on Free.
Pricing
from $3.88 / 1,000 listings
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Features
Share
Grailed Listings Scraper
You do not need a Grailed login, API key or proxy to search Grailed listings through its public search service and extract prices, conditions, seller data, sold status, and URLs. The Actor reads at most maxItems × 3 search hits, or maxItems × 10 when designerFilter, categoryFilter or sizeFilter is set, so filters can return fewer than maxItems listings.
- Search by keyword, including brands, styles, items, and designer names.
- Track asking
price,sold_priceandprice_dropsfor resale research and price monitoring. - Analyze categories, designers, and
stratavalues for trends. - Review seller scores, review counts,
parse_confidence, andwarningson every record.
What you get
The Actor returns normalized records. A field is null when the source does not provide its value.
| Field | Type | Description |
|---|---|---|
listing_id | integer | Numeric listing ID; null when objectID and id are missing or not integers. |
title | string | Listing title; null when blank. |
price | number | Current asking price in USD; null when absent or unparseable. |
price_drops | array | Price-drop history; null when not a list, possibly empty when the source list is empty. |
condition | string | Condition; null when blank. is_used → used, is_new → new, not_worn_once → new_with_tags; other values are preserved. |
designers | string | Comma-separated designer names; null when absent. |
category | string | Top-level category; null when absent. |
category_path | string | Full category path; null when absent. |
size | string | Listing size; null when absent. |
color | string | Primary color; null when absent. |
sold | boolean | Whether the listing is marked sold; always boolean. |
sold_price | number | Final sale price; null unless positive. |
seller_username | string | Seller username; null when there is no seller object. |
seller_score | number | Seller rating average; null when unavailable or nonnumeric. |
seller_reviews | integer | Seller review count; null when unavailable or nonnumeric. |
cover_photo | string | Cover photo URL; null when absent. |
location | string | Seller location; null when absent. |
marketplace | string | Marketplace value, such as grailed or hbx; null when absent. |
strata | string | Segment value, such as hype, luxury, sartorial, or basic; null when absent. |
listing_url | string | Canonical listing URL; null when the listing ID cannot be built. |
created_at | ISO 8601 string | Source created_at text with whitespace stripped; null when absent. |
scraped_at | ISO 8601 string | UTC timestamp when the run started; always a string. |
parse_confidence | number | Data-quality score from 0 to 1, rounded to 3 decimals; always a number. |
warnings | array | Quality codes; always an array, possibly empty. Possible codes: listing_id_missing, title_missing, price_missing, designers_missing, url_missing. |
Sample output
The sample below is one complete dataset record from a successful run.
{"listing_id":110903990,"title":"‼️Nike Vintage Windbreaker Y2k Avant Garde Ykk Light Jacket‼️","price":80,"price_drops":[],"condition":"is_gently_used","designers":"Nike, Vintage","category":"outerwear","category_path":"outerwear.light_jackets","size":"xxl","color":"beige","sold":false,"sold_price":null,"seller_username":"asakuratb","seller_score":4.833,"seller_reviews":42,"cover_photo":"https://media-assets.grailed.com/prd/listing/temp/83e3727db8014773a9d3b0d73de9f605","location":"Europe","marketplace":"grailed","strata":"hype","listing_url":"https://www.grailed.com/listings/110903990","created_at":"2026-11-01T19:07:02.888Z","scraped_at":"2026-11-01T21:41:13Z","parse_confidence":1,"warnings":[]}
A listing the source does not mark sold has "sold": false and "sold_price": null.
Pricing
The Free plan uses pay-per-event billing for the events below.
You pay only for the events listed below. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately.
| Plan | Per run start | Per result |
|---|---|---|
| Free | $0.00005 per event on Free | $0.004 per result on Free |
On Free, apify-actor-start is the Per run start event and apify-default-dataset-item is the Per result event. The start event is charged once per GB of run memory, with a minimum of one event; the result event represents one scraped result with all fields.
Using the minimum one start event:
- 1,000 results = $4.00005 on Free (
1,000 × 0.004 + 0.00005) - 10,000 results = $40.00005 on Free (
10,000 × 0.004 + 0.00005) - 1,249 results = $4.99605 on Free (
1,249 × 0.004 + 0.00005)
The Apify Free plan includes $5 of monthly platform usage credit; the $5 credit covers 1,249 results in one run.
The events listing-item and sold-price-data have no price, so you are not charged for them.
How to use
- Open the Actor in your Apify account.
- Enter a Grailed keyword in
searchQuery. - Set
maxItemsand optionally add designer, category, or exact-size filters. - Start the run and inspect the dataset records.
- Review
price,sold_price,seller_score, andparse_confidence; for a one-result check, setmaxItemsto1and read the first record. - Repeat the run through Apify Schedules, using daily as a starting point for listing or price monitoring.
{"searchQuery": "nike vintage jacket","maxItems": 15,"designerFilter": "Nike","categoryFilter": "outerwear","sizeFilter": "xl"}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
searchQuery | Required string used to search Grailed listings. | required |
maxItems | Maximum listings to return, from 1 to 10000. | 100 |
designerFilter | Case-insensitive substring match against designers; records without designers do not pass. | "" |
categoryFilter | Case-insensitive substring match against category or category_path; records without category data do not pass. | "" |
sizeFilter | Case-insensitive exact match against size; records without size data do not pass. | "" |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Filters are applied client-side. Size matches exactly; designer and category filters use substring matching.
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
searchQuery is missing or whitespace | The run ends as Succeeded with an empty dataset and stores {"error": "searchQuery_required"} in the OUTPUT record of the run's default key-value store; the status asks for search text. | Enter a non-empty query. |
maxItems is configured | The input accepts 1 to 10000 listings. Pages contain up to 48 listings; the run stops at maxItems saved listings or when pages end. | Use a value in that range. |
| A query is run with or without filters | The Actor reads at most maxItems × 3 raw hits, or maxItems × 10 when designerFilter, categoryFilter or sizeFilter is set. Filters run after the fetch, so a filtered run can return fewer than maxItems listings. | Use a more specific searchQuery or loosen the filters. |
| The query has no matching listings or all fetched hits fail active filters | The dataset is empty and the run ends as Succeeded. OUTPUT holds only totalItems, searchQuery and scrapedAt; the status message says either that Grailed has no listings for the query or that hits were found but none passed your filters. | Loosen or remove a filter; sizeFilter is an exact match. |
| A network error, HTTP 429, or HTTP 5xx occurs after the retries | The request is attempted up to 3 times, waiting 1 s after the first failure and 3 s after the second. After the third failure, a 429 or 5xx raises a Grailed error and a network error raises Algolia POST failed. The run ends as Succeeded. With no saved row, OUTPUT stores the error and totalItems: 0; the status says nothing was fetched or charged. | Run the same input again if the source remains unavailable. |
| The public search key receives HTTP 403 | The homepage is fetched for a fresh key and the same page is retried once. | If it still fails, run again later. |
| A later request fails after earlier pages were fetched | Rows are pushed only after the whole search fetch finishes. Earlier hits are retained and normalized, then pushed in batches of up to 100 with the remainder at the end. The run succeeds with a short dataset; OUTPUT stores the error and pushed totalItems. The status starts Partial result only when at least one row was saved. If the failure leaves no saved row, the status says nothing was fetched or charged, even when earlier pages were fetched and filtered out. | Use partial data or run the same input again. |
| A timeout or manual abort occurs | Rows already pushed remain in the dataset. The Actor has no handler for this case. | Set maxItems to 1 and read the first record to check the result. |
| A source field is absent or cannot be parsed | The normalized field can be null; warnings or parse_confidence can show a quality issue. | Inspect warnings and parse_confidence. |
| A listing is not sold or has no positive sale price | sold_price is null. | Use sold with sold_price when analyzing sales. |
FAQ
How much does it cost to scrape Grailed listings?
On Free, apify-actor-start costs $0.00005 per event and apify-default-dataset-item costs $0.004 per result. For example, 1,000 results = $4.00005 on Free.
Why did my search return no listings?
A narrow query can return no matches, and filters can remove matching results. Try broader words, partial designer or category values, or remove filters; sizeFilter must match exactly.
What happens if the Grailed search stops responding?
Network, 429, and 5xx responses are retried. A 403 refreshes the public key and retries. A later-page failure can leave partial results in the dataset.
Is collecting public Grailed data legal or allowed?
The Actor uses Grailed's public search service and does not require a login. Whether collection or use is allowed depends on the source's terms and applicable law for your use case; review those requirements before using the data.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.