Curtsy Fashion Resale Scraper at a glance
Curtsy Fashion Resale Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes listing id, title, brand, category and size, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.10 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.10 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
Scrape Curtsy, the US secondhand fashion marketplace: listings with brand, size, list vs original retail price, condition, photos and seller profile. Keyword and brand search, category browse, item and closet links, seller reviews, incremental monitoring, resume, MCP export.
What Curtsy Fashion Resale Scraper can do
- Three ways in. Keyword search, brand or category browse, or paste item, closet and collection links. No need to build URLs by hand.
- List vs retail pricing. Every record carries the list price, the original retail price and the suggested price, so resale margins are computable straight from the dataset.
- Seller trust signals. Seller name, sales and purchase counts, positive rating percentage, response time, time to ship and state, plus seller review entries (rating, date, text) and listing comments.
- Detail depth on demand. Switch the detail record, seller reviews and comments on or off per run, and pay only for what you use.
- Built for schedules. Incremental mode returns only new and changed listings on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
- Full photo sets. Every listing ships the complete photo gallery, not just the cover thumbnail.
Choose what to collect
These inputs let you configure Curtsy Fashion Resale Scraper - Listings, Sellers & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search walks the marketplace feed by keyword, brand or category. URL mode reads the specific item, closet or collection links you paste. |
querystring | Search mode: free-text search, e.g. yellow dress or scrub top. The marketplace matches titles, brands and descriptions. The keyword feed ignores the brand, category, color and price narrowing, and returns a fixed-size result set; the per-listing bounds below still apply. |
brandstring | Search mode: brand name, e.g. Lululemon, Free People, Zara. Spaces and capitalization are normalized automatically. |
categorystring | Search mode: browse one category of the marketplace. |
startUrlsarray | URL mode: listing links (curtsyapp.com/item//), seller closet links (curtsyapp.com/closet/, every listing in the closet is read), collection links (curtsyapp.com/collection//), or a bare listing id. Entries are read in order. |
urlsarray | Alias for the links field above, accepted under the name other Apify actors use for URL mode. Entries are read in order. |
priceMininteger | Keep listings listed at or above this price. Applied to the browse feed. |
Show 18 more inputs
| Input | What it controls |
|---|---|
priceMaxinteger | Keep listings listed at or below this price. Applied to the browse feed. |
colorstring | Single color word, e.g. yellow, black, floral. Applied to the browse feed (keyword searches ignore it). |
freeShippingOnlyboolean | Keep only listings the seller ships for free. |
nwtOnlyboolean | Keep only listings marked New With Tags. Evaluated per listing after it is read. |
fetchDetailsboolean | Read each listing's detail record: seller description, sizing note, full photo set, fees, and the seller's sales/rating stats. Turn off for a faster card-only run. Each enriched listing is billed once as detail enrichment. |
fetchReviewsboolean | Attach each listing's seller review entries (rating, date, text, reviewer avatar) and listing comments, up to Max reviews per listing. Requires Read listing details. Reviews are billed per 10 entries as review enrichment; comments likewise as comment enrichment. |
maxReviewsinteger | Cap the seller review entries attached to each listing. 0 skips reviews entirely. |
maxItemsinteger | Stop after this many records. This is THE cap: the run stops when it is reached or when listings run out. |
maxPagesinteger | Advanced. Rarely needed: cap the listing pages read per scope. Zero means no page cap; Max items still stops the run. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning items already collected there. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching listing as NEW. Later runs compare the full listing snapshot (price, retail price, size, condition, seller stats, review and comment counts) against the stored baseline and return only NEW and UPDATED listings. Fast-moving fields that move without the listing changing (heart count, relative time labels) are excluded from the comparison by default, and Ignore fields (below) adds more. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and link setup; use State key to name or deliberately share a monitoring campaign. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search, filters and links. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search. |
ignoreFieldsForChangesarray | Incremental mode: changes to only these fields do not mark a record UPDATED. Defaults cover the free-running heart counter and relative time labels; seller review and comment entries count through their totals, so a new review still marks the listing UPDATED. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idListing idtitleTitlebrandBrandcategorycategorysizesizesizeCategorysizeCategorypriceList priceretailPriceOriginal retailsuggestedPricesuggestedPricepriceWithFeespriceWithFeesconditionConditionisNWTisNWTShow 68 more fields
soldsoldloveslovesfreeShippingfreeShippingsellerIdsellerIdsellerNamesellerNamesellerPositiveRatingssellerPositiveRatingssellerSalessellerSalespostedAtpostedAtimageUrlPhoto (image)imageUrlsimageUrlsnumImagesnumImagesurlLink (link)detailUrldetailUrlchangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAttitleCleantitleCleanbrandIdbrandIdstylestyleavailableavailablerentalPricerentalPricebuyerFeebuyerFeesubtotalsubtotaltotaltotaltotalWithFeestotalWithFeesdiscountdiscountoffersAllowedoffersAllowedisStealisStealhothotisNewisNewjustListedjustListedfiveStarRatiofiveStarRatiodetailBadgesdetailBadgesdescriptionSeller descriptionuserSizinguserSizingmetaTitlemetaTitlemetaDescmetaDescshippingPriceshippingPriceshippingCostshippingCostshippingWeightshippingWeightshippingKitshippingKitsellerFirstNamesellerFirstNamesellerLastNamesellerLastNamesellerAvatarsellerAvatarsellerJoinedsellerJoinedsellerLastSeensellerLastSeensellerNumLovessellerNumLovessellerPurchasessellerPurchasessellerResponseTimesellerResponseTimesellerTimeToShipsellerTimeToShipsellerAddressStatesellerAddressStatefirstApprovedAtfirstApprovedAtpostedAgopostedAgothumbWthumbWthumbHthumbHsellerReviewssellerReviewssellerReviewsCountsellerReviewsCountcommentscommentscommentsCountcommentsCountreviewRatingRatingreviewTextReviewreviewDateReview datereviewerAvatarreviewerAvatarcommentTypecommentTypecommentAuthorAuthorcommentTextCommentcommentDateDateExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "Ab12Cd34Ef",
"title": "Sample Midi Dress",
"brand": "Sample Brand",
"category": "Dresses",
"size": "M",
"sizeCategory": "women",
"condition": "Pre-owned",
"price": 35,
"retailPrice": 98,
"suggestedPrice": 40,
"priceWithFees": 37.75,
"sold": false,
"loves": 12,
"isNWT": false,
"freeShipping": false,
"imageUrl": "https://assets.example.com/tr:f-webp,w-180/sample-photo.jpg",
"imageUrls": [
"https://assets.example.com/tr:f-webp,w-180/sample-photo.jpg"
],
"numImages": 4,
"description": "Full seller description text appears here when details are on.",
"userSizing": "Seller is 5'6\", 130lbs",
"sellerId": "SampleId2",
"sellerName": "Seller Name",
"sellerPositiveRatings": "98%",
"sellerSales": 22,
"sellerPurchases": 54,
"sellerTimeToShip": "2.4 days",
"postedAt": "2026-01-01T00:00:00.000Z",
"sellerReviews": [
{
"reviewRating": 5,
"reviewText": "Great seller, fast shipping!",
"reviewDate": "2026-07-02",
"reviewerAvatar": "https://assets.example.com/sample-avatar.jpg"
}
],
"sellerReviewsCount": 27,
"comments": [],
"commentsCount": 0,
"url": "https://curtsyapp.com/item/sample-route/Ab12Cd34Ef",
"detailUrl": "https://curtsyapp.com/item/sample-route/Ab12Cd34Ef",
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00.000Z",
"lastSeenAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Resale arbitrage and sourcing: track list prices against original retail across brands and categories to find underpriced listings early.
- Market and pricing research: build price histories per brand, category or size for fashion-resale analytics.
- Inventory monitoring: watch a seller's closet or a collection and get only the new or changed listings on each scheduled run.
- Trend and demand analysis: correlate heart counts, review volume and time-on-market by brand, color and category.
- App and dashboard builders: feed clean listing records into your own tooling through the API or MCP connectors.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Curtsy Fashion Resale Scraper return?
The documented output for Curtsy Fashion Resale Scraper includes listing id, title, brand, category, size, sizecategory, list price and original retail. Availability of each field depends on the source page and the selected mode.
How much does Curtsy Fashion Resale Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.10 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Turn on Incremental changes for scheduled runs: the first run returns everything as NEW, later runs return only NEW and UPDATED listings, and optionally EXPIRED ones with Emit expired records. Use State key to keep a monitoring campaign stable across configuration edits.
Why did a run return fewer results than Max items?
Searches and filters can legitimately match fewer listings than the cap, and keyword searches return a fixed-size result set (the marketplace caps them), so a keyword run stops once that set is delivered. Raise Max items or widen the filters to collect more.
Why did my run fail instead of returning an empty dataset?
If the marketplace refuses every read (a connection problem rather than an empty search), the run fails loudly with a message instead of pretending nothing matched. Re-run it shortly; transient connection problems usually clear on their own.
Can I use it with AI agents or MCP?
Yes. The actor ships an MCP connector surface: authorize a connector under Apify, Settings, API & Integrations, select it in the input, and results are written to your app after every run. The dataset is also readable through the API for any agent framework.
