Curtsy Fashion Resale Scraper icon

Curtsy Fashion Resale Scraper

Scrape Curtsy, the US secondhand fashion marketplace: listings with brand, size, list vs original retail price, condition, photos and seller profile.…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

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.

Supported input fields
InputWhat it controls
modestring · requiredSearch walks the marketplace feed by keyword, brand or category. URL mode reads the specific item, closet or collection links you paste.

Choices: search, url

querystringSearch 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.
brandstringSearch mode: brand name, e.g. Lululemon, Free People, Zara. Spaces and capitalization are normalized automatically.
categorystringSearch mode: browse one category of the marketplace.

Choices: , dresses, tops, pants, skirts, shorts, sweats, set, sweater, jumpsuit, romper, shoes, handbag, accessory, activewear, swimwear, intimates, lounge, outerwear, denim, jewelry, costumes

startUrlsarrayURL 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.
urlsarrayAlias for the links field above, accepted under the name other Apify actors use for URL mode. Entries are read in order.
priceMinintegerKeep listings listed at or above this price. Applied to the browse feed.
Show 18 more inputs
More input fields
InputWhat it controls
priceMaxintegerKeep listings listed at or below this price. Applied to the browse feed.
colorstringSingle color word, e.g. yellow, black, floral. Applied to the browse feed (keyword searches ignore it).
freeShippingOnlybooleanKeep only listings the seller ships for free.
nwtOnlybooleanKeep only listings marked New With Tags. Evaluated per listing after it is read.
fetchDetailsbooleanRead 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.
fetchReviewsbooleanAttach 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.
maxReviewsintegerCap the seller review entries attached to each listing. 0 skips reviews entirely.
maxItemsintegerStop after this many records. This is THE cap: the run stops when it is reached or when listings run out.
maxPagesintegerAdvanced. Rarely needed: cap the listing pages read per scope. Zero means no page cap; Max items still stops the run.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large pull without returning items already collected there.
incrementalModebooleanTurn 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.
stateKeystringOptional. 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.
emitUnchangedbooleanOff 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.
emitExpiredbooleanOff 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.
ignoreFieldsForChangesarrayIncremental 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.
mcpConnectorsarrayOptionally 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.
notionParentPageUrlstringURL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap 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 id
titleTitle
brandBrand
categorycategory
sizesize
sizeCategorysizeCategory
priceList price
retailPriceOriginal retail
suggestedPricesuggestedPrice
priceWithFeespriceWithFees
conditionCondition
isNWTisNWT
Show 68 more fields
soldsold
lovesloves
freeShippingfreeShipping
sellerIdsellerId
sellerNamesellerName
sellerPositiveRatingssellerPositiveRatings
sellerSalessellerSales
postedAtpostedAt
imageUrlPhoto (image)
imageUrlsimageUrls
numImagesnumImages
urlLink (link)
detailUrldetailUrl
changeTypechangeType
changedFieldschangedFields
firstSeenAtfirstSeenAt
lastSeenAtlastSeenAt
titleCleantitleClean
brandIdbrandId
stylestyle
availableavailable
rentalPricerentalPrice
buyerFeebuyerFee
subtotalsubtotal
totaltotal
totalWithFeestotalWithFees
discountdiscount
offersAllowedoffersAllowed
isStealisSteal
hothot
isNewisNew
justListedjustListed
fiveStarRatiofiveStarRatio
detailBadgesdetailBadges
descriptionSeller description
userSizinguserSizing
metaTitlemetaTitle
metaDescmetaDesc
shippingPriceshippingPrice
shippingCostshippingCost
shippingWeightshippingWeight
shippingKitshippingKit
sellerFirstNamesellerFirstName
sellerLastNamesellerLastName
sellerAvatarsellerAvatar
sellerJoinedsellerJoined
sellerLastSeensellerLastSeen
sellerNumLovessellerNumLoves
sellerPurchasessellerPurchases
sellerResponseTimesellerResponseTime
sellerTimeToShipsellerTimeToShip
sellerAddressStatesellerAddressState
firstApprovedAtfirstApprovedAt
postedAgopostedAgo
thumbWthumbW
thumbHthumbH
sellerReviewssellerReviews
sellerReviewsCountsellerReviewsCount
commentscomments
commentsCountcommentsCount
reviewRatingRating
reviewTextReview
reviewDateReview date
reviewerAvatarreviewerAvatar
commentTypecommentType
commentAuthorAuthor
commentTextComment
commentDateDate

Example 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.

Ready to collect with Curtsy Fashion Resale Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.