# ShopGoodwill Real Time Scraper — Live Thrift & Resale Data (`b2b_leads/shopgoodwill-real-time-scraper`) Actor

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.

- **URL**: https://apify.com/b2b\_leads/shopgoodwill-real-time-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 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](#-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

1. 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.
2. Optional: switch on **Enrich with full listing details** for richer rows (adds a little extra time per listing to enrich full product details).
3. 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** — `searchMaxResults` per keyword, `closetMaxListings` per 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

1. In Slack: *Apps → Incoming Webhooks → Add to workspace*, copy the webhook URL.
2. Paste it into **Webhook URL**, set **Webhook format** to `slack`.
3. Each record arrives as a formatted message: title, type, price, brand, seller, and a link.

#### Discord

1. Channel settings → *Integrations → Webhooks → New Webhook*, copy the URL.
2. Use format `json` — Discord renders the JSON payload; or use a small relay (Zapier/Make) for pretty embeds.

#### JSON receivers / automation tools

1. Point **Webhook URL** at Zapier, Make, n8n, or your own pricing bot.
2. Use format `json` — the full record is delivered exactly as it appears in the dataset.
3. Filter on `featureType` and `isEndingSoon: true` to 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](https://docs.apify.com/platform/integrations/mcp) so Claude Desktop, Cursor, LangChain, or any MCP client can call it as a tool.

1. In your MCP config, add the Apify MCP server and your API token.
2. Expose this actor's tool (`shopgoodwill-real-time-scraper`).
3. 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 `price` over `sold_comps` rows filtered by brand/style tags.
   - *"Find Patagonia fleece under $20 ending in the next hour."* — Listing Search with `searchMaxPrice`, watching `isEndingSoon`.
   - *"Which Goodwill region has the most vintage Levi's denim right now?"* — Closet Listings across several `sellerIds`.

Example agent input:

```json
{
    "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 `block` mode, free accounts get 0 results with a clear upgrade message.
- The run's `OUTPUT` object 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.*

# Actor input Schema

## `enableListingSearch` (type: `boolean`):

Live keyword search for thrift brands, streetwear, and vintage finds. On by default — prefilled so you can click Start immediately.

## `searchKeywords` (type: `array`):

One or more search terms (e.g. carhartt detroit jacket, levis 501 jeans, patagonia fleece). Keep phrases short — 2–3 words match best. Required when Listing Search is on.

## `searchMaxResults` (type: `integer`):

Maximum listings to return for each keyword (1–200). Defaults to 10 for fast instant demo runs.

## `searchSort` (type: `string`):

How to order search results.

## `searchBrand` (type: `string`):

Limit results to a brand name (e.g. Carhartt, Levi's, Patagonia, Nike).

## `searchSize` (type: `string`):

e.g. M, L, XL, 32x32, 9.5.

## `searchCondition` (type: `string`):

Only keep listings whose stated condition matches one of these words (e.g. New, Like New, Excellent, Good, Fair, Used).

## `searchMinPrice` (type: `integer`):

Minimum current price in USD.

## `searchMaxPrice` (type: `integer`):

Maximum current price in USD.

## `searchBuyNowOnly` (type: `boolean`):

Only return fixed-price Buy-It-Now listings (skip pure auctions).

## `searchFetchFullDetails` (type: `boolean`):

When on, each search result is one row with full fields merged in (description, fabric/material tags, style tags, full image gallery, shipping discounts). Still featureType listing\_search — not a second row. Adds a little extra time per listing to enrich full product details.

## `enableListingDetails` (type: `boolean`):

Fetch full product data for specific listing IDs or ShopGoodwill URLs.

## `listingIds` (type: `array`):

Numeric ShopGoodwill listing IDs (e.g. 90001) or full item URLs (https://shopgoodwill.com/item/90001).

## `enableClosetListings` (type: `boolean`):

Scrape a Goodwill region's full live inventory to track competitor stock and source in bulk.

## `sellerIds` (type: `array`):

ShopGoodwill seller (Goodwill region) IDs. Used by Closet Listings, Seller Profile, and Sold Comps. Find the ID in any shopgoodwill.com seller page URL.

## `closetMaxListings` (type: `integer`):

Maximum live inventory items to collect per seller (1–1000).

## `closetCategories` (type: `array`):

Optional ShopGoodwill category IDs to narrow the closet inventory (e.g. clothing categories). Leave empty for everything.

## `enableSellerProfile` (type: `boolean`):

Extract Goodwill region stats: items listed, live inventory size, seller rating, location, and bio details.

## `enableSoldComps` (type: `boolean`):

Collect completed auctions for real market comps, resale margins, and sell-through analysis.

## `soldKeywords` (type: `array`):

Optional keywords to narrow completed auctions (e.g. carhartt jacket, levis 501). Leave empty for all completed auctions in your price/category range.

## `soldDaysBack` (type: `integer`):

How many days of completed-auction history to scan (1–30).

## `soldMaxItems` (type: `integer`):

Maximum completed listings to collect (1–1000).

## `enableScrapeByUrl` (type: `boolean`):

Paste any ShopGoodwill URL — item, search, seller, or category.

## `scrapeUrls` (type: `array`):

Any ShopGoodwill item, search, seller, or category URL.

## `scrapeMaxPages` (type: `integer`):

How many result batches to collect per search and closet URL (1–20).

## `webhookUrl` (type: `string`):

Optional. Every record is always saved to the run dataset — this webhook is an ADDITIONAL real-time push. Each new row is also POSTed to this URL (Slack, Discord, Zapier, Make, n8n, custom pricing bot).

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message payload.

## `proxyConfiguration` (type: `object`):

Residential proxy recommended. Match country to your target market (US default).

## Actor input object example

```json
{
  "enableListingSearch": true,
  "searchKeywords": [
    "carhartt detroit jacket",
    "levis 501 jeans",
    "patagonia fleece"
  ],
  "searchMaxResults": 10,
  "searchSort": "newest",
  "searchBrand": "",
  "searchSize": "",
  "searchCondition": "",
  "searchBuyNowOnly": false,
  "searchFetchFullDetails": false,
  "enableListingDetails": false,
  "listingIds": [],
  "enableClosetListings": false,
  "sellerIds": [],
  "closetMaxListings": 50,
  "closetCategories": [],
  "enableSellerProfile": false,
  "enableSoldComps": false,
  "soldKeywords": [],
  "soldDaysBack": 7,
  "soldMaxItems": 50,
  "enableScrapeByUrl": false,
  "scrapeUrls": [
    "https://shopgoodwill.com/search?q=vintage+levis"
  ],
  "scrapeMaxPages": 3,
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Full dataset for this run (every featureType).

## `overview` (type: `string`):

Core fields across features, including detailsFetched for search rows.

## `search` (type: `string`):

featureType=listing\_search only. One product = one row; full details are merged when “Enrich with full listing details” is enabled.

## `listing_details` (type: `string`):

featureType=listing\_details — full records for specific listing IDs/URLs.

## `closet_listings` (type: `string`):

No description

## `seller_profile` (type: `string`):

No description

## `sold_comps` (type: `string`):

No description

## `scrape_by_url` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "enableListingSearch": true,
    "searchKeywords": [
        "carhartt detroit jacket",
        "levis 501 jeans",
        "patagonia fleece"
    ],
    "searchMaxResults": 10,
    "searchSort": "newest",
    "searchBuyNowOnly": false,
    "searchFetchFullDetails": false,
    "enableListingDetails": false,
    "listingIds": [],
    "enableClosetListings": false,
    "sellerIds": [],
    "closetMaxListings": 50,
    "closetCategories": [],
    "enableSellerProfile": false,
    "enableSoldComps": false,
    "soldKeywords": [],
    "soldDaysBack": 7,
    "soldMaxItems": 50,
    "enableScrapeByUrl": false,
    "scrapeUrls": [
        "https://shopgoodwill.com/search?q=vintage+levis"
    ],
    "scrapeMaxPages": 3,
    "webhookFormat": "json",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/shopgoodwill-real-time-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "enableListingSearch": True,
    "searchKeywords": [
        "carhartt detroit jacket",
        "levis 501 jeans",
        "patagonia fleece",
    ],
    "searchMaxResults": 10,
    "searchSort": "newest",
    "searchBuyNowOnly": False,
    "searchFetchFullDetails": False,
    "enableListingDetails": False,
    "listingIds": [],
    "enableClosetListings": False,
    "sellerIds": [],
    "closetMaxListings": 50,
    "closetCategories": [],
    "enableSellerProfile": False,
    "enableSoldComps": False,
    "soldKeywords": [],
    "soldDaysBack": 7,
    "soldMaxItems": 50,
    "enableScrapeByUrl": False,
    "scrapeUrls": ["https://shopgoodwill.com/search?q=vintage+levis"],
    "scrapeMaxPages": 3,
    "webhookFormat": "json",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/shopgoodwill-real-time-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "enableListingSearch": true,
  "searchKeywords": [
    "carhartt detroit jacket",
    "levis 501 jeans",
    "patagonia fleece"
  ],
  "searchMaxResults": 10,
  "searchSort": "newest",
  "searchBuyNowOnly": false,
  "searchFetchFullDetails": false,
  "enableListingDetails": false,
  "listingIds": [],
  "enableClosetListings": false,
  "sellerIds": [],
  "closetMaxListings": 50,
  "closetCategories": [],
  "enableSellerProfile": false,
  "enableSoldComps": false,
  "soldKeywords": [],
  "soldDaysBack": 7,
  "soldMaxItems": 50,
  "enableScrapeByUrl": false,
  "scrapeUrls": [
    "https://shopgoodwill.com/search?q=vintage+levis"
  ],
  "scrapeMaxPages": 3,
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/shopgoodwill-real-time-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/shopgoodwill-real-time-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/33scm62giSMAvjXSh/builds/rkqD1ZDudb1Wd1waB/openapi.json
