ShopGoodwill Real Time Scraper — Live Thrift & Resale Data
Pricing
from $1.00 / 1,000 results
ShopGoodwill Real Time Scraper — Live Thrift & Resale Data
Live ShopGoodwill thrift & vintage intelligence: keyword search, full listing details, closet inventory, seller profiles, sold comps, and URL collection. Stream structured JSON to your dataset in real time, push Slack/Discord deal alerts, and feed pricing bots or AI agents.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
ShopGoodwill Real Time Scraper
Live ShopGoodwill thrift & vintage market intelligence — keyword search, full listing details, closet inventory, seller profiles, sold comps, and URL collection. Structured JSON streamed to your dataset in real time, one row per product.
⚠️ Free-tier notice: non-paying Apify accounts are limited to a 2-result free trial per run. Upgrade to any paid Apify plan for unlimited exports (see Free tier limits).
Built for:
- Vintage & thrift resellers sourcing undervalued inventory (Poshmark, eBay, Depop, Mercari cross-listers)
- Resale arbitrageurs flipping thrift finds for margin
- Consignment shop owners tracking competitor stock and regional supply
- Fashion market researchers & pricing teams running comps and sell-through analysis
- AI agents that need structured resale data via the Apify MCP server
✨ What you can do with it
- Find undervalued thrift & vintage inventory — scan live ShopGoodwill auctions for vintage single-stitch tees, designer denim, Carhartt workwear, gorpcore Patagonia/Arc'teryx, and Y2K streetwear before anyone else bids.
- Price comps & sell-through analysis — pull completed auctions from the last 1–30 days to calculate real market comps, resale margins, and sell-through rates for any niche.
- Closet inventory monitoring — track the full live inventory of any Goodwill region ("closet") and get alerted the moment new stock drops.
- Instant Slack/Discord deal alerts — every record can be pushed to a webhook the moment it is collected.
- Multi-platform pricing sync — pipe structured rows straight into Sheets, Airtable, Zapier, Make, n8n, or your own pricing bot.
- Regional sourcing — ShopGoodwill inventory is listed by Goodwill region, so you can source by region and estimate local pickup savings.
🧩 Feature matrix
| Feature | What it returns | Row featureType |
|---|---|---|
| 🔍 Listing Search | Live keyword search cards (price, title, brand, size, watchers/bids, condition, ending-soon flags) | listing_search |
| ➕ Enrich with full details | Merges into the same search row: full description, fabric/material tags, style tags, full image gallery, item specifics, shipping discounts (detailsFetched: true) | listing_search |
| 📦 Listing Details | Full records for specific listing IDs or URLs | listing_details |
| 👕 Closet Listings | A Goodwill region's full live inventory, paginated | closet_listings |
| 🏪 Seller Profile | Region stats: items listed, rating, location, bio | seller_profile |
| 🧾 Sold Item Comps | Completed auctions for market comps & sell-through | sold_comps |
| 🔗 Scrape By URL | Auto-detected item / search / seller / category URLs | scrape_by_url |
One product = one row, always. Enrichment never creates duplicates or filters items out — every discovered item goes to the dataset, whether or not full details were available.
🚀 Quick start
- Click Start with the prefilled input — the actor searches three thrift keywords (
carhartt detroit jacket,levis 501 jeans,patagonia fleece) at 10 results each so you get instant results in seconds. - Optional: switch on Enrich with full listing details for richer rows (adds a little extra time per listing to enrich full product details).
- Optional: paste a Webhook URL for real-time alerts.
Example search recipes
| Goal | Keywords & settings |
|---|---|
| Flippable workwear | carhartt detroit jacket, sort: Most bids, Buy It Now only: off |
| Vintage denim | levis 501 jeans, size filter: 32x32, min price: $5, max price: $40 |
| Gorpcore gear | patagonia fleece, arc teryx shell, sort: Newest first |
| Y2K streetwear | vintage nike center swoosh, y2k jersey, sort: Newest first |
| Designer for cheap | coach leather bag, max price: $60, Buy It Now only: on |
| Regional sourcing | enable Closet Listings with the region's seller ID |
📥 Full input schema
🔍 Listing Search
| Field | Type | Default | Notes |
|---|---|---|---|
enableListingSearch | boolean | true | Live keyword search. |
searchKeywords | string[] | ["carhartt detroit jacket", "vintage 90s levis 501", "patagonia fleece"] | One or more search terms. |
searchMaxResults | integer (1–200) | 10 | Max results per keyword — defaults to 10 for fast instant demo runs. |
searchSort | select | newest | relevance, newest, ending-soonest, price-low, price-high, most-bids. |
searchBrand | string | – | e.g. Carhartt, Levi's, Patagonia. Folded into the search text. |
searchSize | string | – | e.g. M, XL, 32x32, 9.5. |
searchCondition | string | – | Keep only listings whose stated condition contains this word (e.g. Excellent). |
searchMinPrice / searchMaxPrice | integer | – | Price range in USD. |
searchBuyNowOnly | boolean | false | Only fixed-price Buy-It-Now listings. |
searchFetchFullDetails | boolean | false | Enrich with full listing details — merges description, fabric/material tags, style tags, full image gallery, and seller shipping discounts into the same row (detailsFetched: true). |
📦 Listing Details
| Field | Type | Default | Notes |
|---|---|---|---|
enableListingDetails | boolean | false | Fetch full records for specific listings. |
listingIds | string[] | – | Numeric listing IDs (90001) or full item URLs (https://shopgoodwill.com/item/90001). |
👕 Closet Listings
| Field | Type | Default | Notes |
|---|---|---|---|
enableClosetListings | boolean | false | Scrape a Goodwill region's live inventory. |
sellerIds | string[] | – | Seller (region) IDs — shared with Seller Profile & Sold Comps. |
closetMaxListings | integer (1–1000) | 50 | Max items per closet. |
closetCategories | string[] | – | Optional category IDs to narrow the closet. |
🏪 Seller Profile
| Field | Type | Default | Notes |
|---|---|---|---|
enableSellerProfile | boolean | false | Region stats & bio details. |
sellerIds | string[] | – | Same list as above. |
🧾 Sold Item Comps / History
| Field | Type | Default | Notes |
|---|---|---|---|
enableSoldComps | boolean | false | Completed auctions for comps & margins. |
soldKeywords | string[] | – | Optional keywords (e.g. carhartt jacket). |
soldDaysBack | integer (1–30) | 7 | How much history to scan. |
soldMaxItems | integer (1–1000) | 50 | Max completed listings. |
🔗 Scrape By URL
| Field | Type | Default | Notes |
|---|---|---|---|
enableScrapeByUrl | boolean | false | Paste any ShopGoodwill URL. |
scrapeUrls | string[] | – | Item, search, seller, or category URLs. |
scrapeMaxPages | integer (1–20) | 3 | How many result batches to collect per search/closet URL. |
⚙️ Delivery
| Field | Type | Default | Notes |
|---|---|---|---|
webhookUrl | string | – | Optional additional real-time push per record (Slack, Discord, Zapier, Make, n8n, custom bot). |
webhookFormat | select | json | json (full record) or slack (message payload). |
Result volume is controlled by each feature's own limits —
searchMaxResultsper keyword,closetMaxListingsper closet,soldMaxItems,scrapeMaxPages, and the size of your ID/URL lists. There is no separate global cap to configure.
🌐 Connection
| Field | Type | Default | Notes |
|---|---|---|---|
proxyConfiguration | object | Apify Residential, US | Residential proxies deliver the most reliable results at scale. Match the country to your target market. |
📤 Full output schema
Every dataset row is one of the featureType values above. Common fields:
Pricing & value
| Field | Type | Description |
|---|---|---|
price | number | null | Current price (highest bid or the listed price). |
currentBid | number | null | Current auction bid. |
startingBid | number | null | Auction starting bid. |
buyItNowPrice | number | null | Buy-It-Now price when available. |
originalPrice | number | null | Estimated retail price, when the marketplace provides it. |
discountPercent | number | null | Discount vs estimated retail (0–100). |
isOnSale | boolean | null | Priced below estimated retail. |
currency | string | Always USD. |
shippingCost | number | null | Listed shipping cost. |
freeShipping | boolean | Free / one-cent shipping offer. |
shippingDiscounts | object | null | Combined-shipping discount offers from the seller (enriched runs). |
Product
| Field | Type | Description |
|---|---|---|
title, shortDescription, fullDescription | string | null | Listing text (fullDescription on details/enriched rows). |
brand | string | null | Detected brand (thrift-tuned dictionary: Carhartt, Levi's, Patagonia, Nike, designer names…). |
size | string | null | Detected size (letter, waist×inseam, shoe). |
condition | string | null | Stated condition. |
color, material | string | null | Detected from title/description (fabric tags). |
styleTags | string[] | Vintage / y2k / gorpcore / workwear / single-stitch / military / designer signals. |
category, subCategory, categoryPath | string | null | Marketplace category. |
itemSpecifics | object | null | Parsed specifics (enriched runs). |
imageUrl, imageUrls | string, string[] | Main image and full gallery. |
isLot | boolean | Lot/bundle listing. |
quantity | number | null | Units available. |
Auction timing & engagement
| Field | Type | Description |
|---|---|---|
listingType | string | auction, buy_it_now, auction_bin, stock. |
bidCount | number | null | Number of bids. |
likes | number | null | Watchlist count (the thrift equivalent of likes) where available. |
views | number | null | View count. |
startTime, endTime, soldAt | string | null | ISO timestamps. |
isEndingSoon | boolean | Ends in under 1 hour — perfect for sniping alerts. |
isNewlyListed | boolean | Listed in the last 24 hours. |
isSold | boolean | null | True on completed-auction rows. |
Seller
| Field | Type | Description |
|---|---|---|
sellerName, sellerId | string | null | Goodwill region name/ID. |
sellerRating, sellerLocation, sellerItemsCount | – | Region stats where available. |
goodwillRegion, itemLocation | string | null | Regional sourcing info. |
Row metadata
| Field | Type | Description |
|---|---|---|
featureType | string | Which feature produced the row. |
scrapedAt | string | ISO timestamp of the row. |
url | string | Source URL. |
position | number | null | Position within the search/page. |
detailsFetched | boolean | True when the search row was enriched in place. |
pageType | string | Detected type on URL rows. |
🔔 Webhook integration guide
Every record is always saved to the dataset. The webhook is an additional real-time push — perfect for deal alerts.
Slack
- In Slack: Apps → Incoming Webhooks → Add to workspace, copy the webhook URL.
- Paste it into Webhook URL, set Webhook format to
slack. - Each record arrives as a formatted message: title, type, price, brand, seller, and a link.
Discord
- Channel settings → Integrations → Webhooks → New Webhook, copy the URL.
- Use format
json— Discord renders the JSON payload; or use a small relay (Zapier/Make) for pretty embeds.
JSON receivers / automation tools
- Point Webhook URL at Zapier, Make, n8n, or your own pricing bot.
- Use format
json— the full record is delivered exactly as it appears in the dataset. - Filter on
featureTypeandisEndingSoon: trueto trigger only hot alerts (e.g. rare thrift items ending within the hour).
🤖 MCP / AI agent usage
This actor works with the Apify MCP server so Claude Desktop, Cursor, LangChain, or any MCP client can call it as a tool.
- In your MCP config, add the Apify MCP server and your API token.
- Expose this actor's tool (
shopgoodwill-real-time-scraper). - Ask natural-language questions, e.g.:
- "What is the average sold price for a 90s Carhartt J97 jacket?" — enable Sold Item Comps, then let the agent aggregate
priceoversold_compsrows filtered by brand/style tags. - "Find Patagonia fleece under $20 ending in the next hour." — Listing Search with
searchMaxPrice, watchingisEndingSoon. - "Which Goodwill region has the most vintage Levi's denim right now?" — Closet Listings across several
sellerIds.
- "What is the average sold price for a 90s Carhartt J97 jacket?" — enable Sold Item Comps, then let the agent aggregate
Example agent input:
{"enableSoldComps": true,"soldKeywords": ["carhartt detroit jacket"],"soldDaysBack": 14,"soldMaxItems": 100}
💰 Free tier limits
| Plan | Behavior |
|---|---|
| Free (not paying) | Capped at 2 results per run (default). Upgrade message in the run log; clean exit, no errors. |
| Any paid plan | Unlimited output, no caps. |
Notes:
- The cap is configurable by the actor owner via Console environment variables (
FREE_TIER_MAX_ITEMS,FREE_TIER_MODE=limit|block). - In
blockmode, free accounts get 0 results with a clear upgrade message. - The run's
OUTPUTobject always discloses the gate:paywall: { detected, isPaying, pricingTier, limited, blocked, freeTierMaxItems }.
❓ FAQ
Which proxies should I use? Residential proxies (default: Apify Residential, US) give the most reliable results at scale. The connection country can be set per run; US is the marketplace's home market.
Why do I only get 2 results? You are on the free Apify plan. Free runs are capped at 2 results as a trial. Upgrade to any paid Apify plan for unlimited exports — the actor tells you in the run log when the cap applied.
How fresh is the data? Every run collects live data in real time. For monitoring, schedule the actor (e.g. every 15 minutes) and use webhooks to get alerted the moment new thrift finds drop.
Am I rate limited?
The actor paces itself: bounded parallel workers plus small randomized pauses between keyword batches. Keep searchMaxResults within the documented ranges and it will stay well behaved even on long 10,000+ item runs.
Does enriching with full details duplicate my rows?
No. Enrichment merges full description, fabric/material tags, style tags, the full image gallery, and shipping discounts into the same row (detailsFetched: true). One product = one row, always.
Can I track a specific Goodwill region's inventory? Yes — Closet Listings takes the region's seller ID (visible in any ShopGoodwill seller page URL) and returns its full live inventory, paginated.
How do I calculate sell-through rate?
Pull Sold Item Comps for your keyword over N days, then divide sold count by live inventory from Listing Search with the same keyword. The styleTags and brand fields make aggregation trivial.
Why did a run return fewer rows than my keywords × results-per-keyword?
The marketplace matches all words in a phrase, so very specific phrases (e.g. vintage 90s levis 501) can match zero listings. The actor handles this for you — it retries transient empty pages, switches to a fresh connection, and finally retries the keyword with filler words stripped (e.g. levis 501), logging delivered via fallback phrase when that kicks in. For the most predictable counts, keep phrases to 2–3 meaningful words.
Is my use case allowed? Collect publicly available marketplace listing data for pricing research, sourcing, and analytics is the intended use. Respect the marketplace's terms and applicable law in your jurisdiction.
🛠️ Support & changelog
- Bugs or feature requests: open an issue on the actor's GitHub repository or contact via the Apify Store page.
- v1.0 — initial release: search, in-place enrichment, listing details, closet listings, seller profiles, sold comps, URL scrape, streaming dataset output, webhooks (JSON & Slack), free-tier gating.
This actor provides structured catalog intelligence with fast per-item collection. It is not affiliated with Goodwill Industries International or ShopGoodwill.