# 🛍️ Whop Marketplace Data Scraper (`citrine_venus/whop-marketplace-data-scraper`) Actor

Turn any Whop.com search, category, or listing into structured data: pricing, plans, company and owner profiles, growth metrics, affiliate terms, and reviews. Self-healing GraphQL scraper that keeps working through Whop backend changes.

- **URL**: https://apify.com/citrine\_venus/whop-marketplace-data-scraper.md
- **Developed by:** [Data Minds](https://apify.com/citrine_venus) (community)
- **Categories:**
- **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 and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🛍️ Whop Marketplace Data Scraper

Turn any Whop.com search, category, or listing link into a clean, structured dataset — pricing, plans, company and owner profiles, growth metrics, affiliate terms, and reviews, streamed live to your Apify dataset.

🔗 **[View this Actor on Apify Store](https://apify.com/citrine_venus/whop-marketplace-data-scraper)**

### 📑 Table of Contents

- [What Is the Whop Marketplace Data Scraper?](#-what-is-the-whop-marketplace-data-scraper)
- [What Data Can You Extract from the Whop Marketplace?](#-what-data-can-you-extract-from-the-whop-marketplace)
- [How the Whop Scraper Works](#-how-the-whop-scraper-works)
- [Input Parameters](#-input-parameters)
- [Output Example](#-output-example)
- [Related Actors](#-related-actors)
- [Frequently Asked Questions](#-frequently-asked-questions)
- [Support and Feedback](#-support-and-feedback)

### 🧭 What Is the Whop Marketplace Data Scraper?

The **Whop Marketplace Data Scraper** is an Apify Actor that turns Whop.com's public product, course, and membership storefront into a structured, exportable dataset. It talks directly to **Whop's public GraphQL API** and re-introspects the live schema on every run, so the scraper keeps working even after Whop ships a backend change — a **self-healing** design that quietly drops a renamed or removed field instead of breaking the whole run. Point it at a Whop URL, a search keyword, a category, or nothing at all — leaving everything blank makes it walk the entire live catalog. Either way, it returns **pricing and plans**, **company and owner profiles**, **growth metrics**, **affiliate terms**, **contact links**, and **reviews** for every listing it finds.

Because it runs on the **Apify platform**, you get more than a one-off script: built-in **proxy rotation** with automatic escalation, **scheduling** to re-run the same search daily or weekly, a REST **API** and webhooks for every run, and dataset exports to JSON, CSV, XLSX, and Excel — no code required.

### 📊 What Data Can You Extract from the Whop Marketplace?

In plain terms, every record this Whop scraper produces is built from five groups of information:

- 📝 **Listing basics** — title, headline, description, category, business/industry type, and the live URL and checkout link.
- 💲 **Pricing and plans** — the default plan plus every visible pricing plan (one-time, subscription, trial), in the listing's own currency, with both the signup price and the effective price a buyer actually pays.
- 🏢 **Company and owner profile** — the business behind the listing (name, route, member count, verification status, description) and the person running it (name, bio, city, country, follower count).
- 📈 **Growth and engagement metrics** — 3-hour / 24-hour / 30-day new users, 24-hour GMV, store page views and clicks, likes, shares, and review counts, so you can track momentum over time.
- 🤝 **Affiliate terms and reviews** — the affiliate commission percentage and program status, plus star ratings and (optionally) full review text.

The technical field-by-field reference for all of the above is in the [Output Example](#-output-example) section below.

### 🔧 How the Whop Scraper Works

This whop.com scraper follows the same repeatable process on every run:

1. **Give it something to look for.** Paste one or more Whop URLs (search pages, category pages, product pages, company pages, or bare `prod_*` / `biz_*` IDs), type search keywords, or leave both empty to browse the live catalog.
2. **The Actor connects to Whop's GraphQL gateway** and introspects the current schema, so every query it builds is verified against what Whop's servers accept *right now*.
3. **It walks results page by page** — search results, a category listing, or the full catalog — applying your sort order and any server-side filters (price range, affiliate %, discoverable-only) as it goes.
4. **Each listing (or company) is enriched** according to your toggles: owner profile, company details, growth metrics, affiliate terms, gallery images, FAQ, bundled apps, and full review text.
5. **Quality filters run client-side** — minimum rating, minimum reviews, minimum members, verified-only, date range, free/paid-only, title contains, contact-link-only — to drop anything that doesn't match before it's saved.
6. **Every finished record streams straight to your dataset**, live, as soon as it's ready — you don't wait for the whole run to finish to start using the data.
7. **Optionally, keyword market-sizing data** (search volume and marketplace-wide daily revenue per keyword) is written to the run's key-value store under `keyword-analytics`.

### 📋 Input Parameters

All fields are optional except that at least one of `urls`, `queries`, or `catalogBrowse` must produce something to search — the default configuration (`catalogBrowse: true`) browses the full catalog if you leave everything else blank.

#### 🔍 Discovery — what to scrape

| Field | Type | Description | Default |
|---|---|---|---|
| `urls` | array | Whop search, category, product, or company page URLs — one per line or upload a file. Bare `prod_*` / `biz_*` IDs also work. | `[]` |
| `queries` | array | Search keywords to look up on Whop.com — e.g. `trading`, `ai agency`, `fitness coaching`. Each is searched separately. | `[]` |
| `catalogBrowse` | boolean | When no URL or keyword is given, walk the entire live Whop marketplace catalog instead of doing nothing. | `true` |
| `scrapeCompanies` | boolean | Collect one record per business/company (with its product list) instead of one record per listing. | `false` |

#### 🗂️ Catalog browsing — sort and server-side filters

| Field | Type | Description | Default |
|---|---|---|---|
| `sortBy` | string (enum) | Catalog order: `trending`, `newest_arrivals`, `most_money_made_24_hours`, `average_review_rating`, `most_reviews_7_days`, `most_reviews_24_hours`, `highest_bounties`, `trending_3_hours`, `created_at`, `global_affiliate_percentage`, `average_time_spent_24_hours`, `most_affiliate_earnings_24_hours`, `last_24_hours_total_seconds`, `id`. | `trending` |
| `sortDirection` | string (enum) | `""` (Whop's own default), `asc`, or `desc`. | `""` (Whop's default) |
| `categories` | array | Top-level Whop category routes, e.g. `ai`, `trading`, `personal-development`. Each category runs as its own pass — `limit` applies per category. | `[]` |
| `priceMin` / `priceMax` | number | Price range filter, in the listing's own currency. | not set |
| `affiliatePercentageMin` | number | Only listings offering at least this affiliate commission. | not set |
| `affiliateEnabledOnly` | boolean | Keep only listings that currently run an affiliate program. | `false` |
| `discoverableOnly` | boolean | Keep only listings Whop has published to its public Discover feed. | `true` |

#### ✅ Quality filters — applied after fetching

| Field | Type | Description | Default |
|---|---|---|---|
| `minRating` | number | Drop listings rated below this (0–5). | not set |
| `minReviews` | integer | Drop listings with fewer published reviews than this. | not set |
| `minMembers` | integer | Drop listings with fewer active members than this. | not set |
| `verifiedOnly` | boolean | Keep only listings that carry Whop's verified badge. | `false` |
| `createdAfter` / `createdBefore` | string | Date filters, `YYYY-MM-DD`. | not set |
| `freeOnly` / `paidOnly` | boolean | Restrict to free or paid listings only (mutually exclusive). | `false` |
| `titleContains` | string | Keep only listings whose title, headline, or description contains this text. | not set |
| `withSocialsOnly` | boolean | Lead-gen mode — drop anything with no social/contact link at all. | `false` |

#### ➕ Enrichment toggles — what to include per listing

| Field | Type | Description | Default |
|---|---|---|---|
| `includeSocials` | boolean | Creator and company social handles and contact links. | `true` |
| `includeOwner` | boolean | Name, bio, city, country, and follower count of the person behind the listing. | `true` |
| `includeCompanyDetails` | boolean | Company description, member count, views, review stats. | `true` |
| `includeGrowthMetrics` | boolean | 3h/24h/30d new users, 24h GMV, impressions, clicks, likes, shares. | `true` |
| `includeAffiliate` | boolean | Affiliate commission percentage and program status. | `true` |
| `includePlans` | boolean | Every visible pricing plan, not just the default one. | `true` |
| `maxPlansPerProduct` | integer | Cap on plans fetched per listing when `includePlans` is on. | `5` |
| `includeImages` | boolean | Gallery images and videos for the listing. | `true` |
| `includeFaq` | boolean | The listing's published FAQ questions and answers. | `false` |
| `includeExperiences` | boolean | Apps/experiences bundled inside the listing. | `false` |
| `includeReviews` | boolean | Fetch actual review text and star breakdown per listing (a little slower). | `false` |
| `maxReviewsPerProduct` | integer | Cap on reviews fetched per listing when `includeReviews` is on. | `5` |

> **Default discrepancy to be aware of:** the Apify Console input form pre-fills `maxReviewsPerProduct` with `5` (the value above, taken from the input schema — what you'll actually see when configuring the Actor). However, if a run is triggered programmatically (e.g. via the API) with the `maxReviewsPerProduct` key left out of the input JSON entirely, the Actor's own internal fallback in `build_config()` resolves it to `20`, not `5`. In practice: configuring through the Console always sends `5` explicitly, so that's the effective value there; only a fully-omitted field on a raw API call falls back to `20`.

#### 🏢 Company mode extras

Only used when `scrapeCompanies` is `true`.

| Field | Type | Description | Default |
|---|---|---|---|
| `includeCompanyProducts` | boolean | Nest each company's own product catalog inside its record. | `false` |

#### 🔑 Keyword market sizing — saved to the key-value store, not the dataset

| Field | Type | Description | Default |
|---|---|---|---|
| `getKeywordRevenueDetails` | boolean | Marketplace-wide daily GMV for each search keyword. | `false` |
| `getKeywordSearchVolume` | boolean | How often each keyword is searched on Whop (last 30 days). | `false` |
| `keywordRevenueDays` | integer | How many days of daily revenue history to fetch per keyword. | `90` |
| `getTopKeywords` | boolean | Fetch Whop's own top-keywords-by-search-volume list. | `false` |

#### 🚀 Performance, run control, and proxy

| Field | Type | Description | Default |
|---|---|---|---|
| `limit` | integer | Stop after this many listings have been saved for each URL/keyword/category. Exact, not approximate. | `10` |
| `concurrency` | integer | How many requests can be in flight at once (1–20). | `8` |
| `maxRetries` | integer | Attempts per request on the current connection route before falling back or giving up. | `3` |
| `requestDelay` | number | Seconds paused between requests, for a politer run. | `0` |
| `resumeOffset` | integer | Skip the first N catalog rows to continue a previous run. | `0` |
| `maxScanned` | integer | Give up after examining this many listings when quality filters are very narrow. `0` = no cap. | `50000` |
| `proxyConfiguration` | object | By default the run connects with no proxy at all, and only escalates to a datacenter then a residential route if Whop pushes back — then stays on that route. Override here to force a specific route. | No proxy |

> **Default discrepancy to be aware of:** the same pattern applies to `limit`. The input schema — and therefore the Apify Console's pre-filled value — defaults it to `10`. But the Actor's internal `DEFAULTS` dictionary, used as the fallback inside `build_config()` when the `limit` key is missing from the raw input altogether, is `1000`. A Console run always sends the pre-filled `10` unless you change it; a bare API call with no `limit` key in the JSON body will actually run with an effective limit of `1000` per input. If you're calling the API directly and want a small test run, pass `limit` explicitly rather than relying on omission.

### 📦 Output Example

By default (product/listing mode, `scrapeCompanies: false`), each dataset item looks like this — field names below are exact, straight out of `parser.py`'s `assemble_product()`:

```json
{
  "id": "prod_dZupVMFqJmV2o",
  "title": "Sober Living Riches",
  "headline": "Build wealth while transforming lives w/ sober living homes",
  "route": "soberlivingriches",
  "url": "https://whop.com/discover/soberlivingriches/soberlivingriches/",
  "description": "Overcome sober living investing fears with our supportive community...",
  "company": {
    "id": "biz_P4W5cGytpsnunM",
    "route": "soberlivingriches",
    "hubRoute": "soberlivingriches",
    "businessType": "coaching_and_courses",
    "industryType": "rental_property",
    "logo": { "url": "https://img-v2-prod.whop.com/...", "doubleUrl": "https://img-v2-prod.whop.com/..." }
  },
  "pricing": { "id": "plan_cT1jck0rofzBd", "planType": "one_time", "rawInitialPrice": 3500.0, "baseCurrency": "usd", "free": false },
  "price": 3500.0,
  "currency": "usd",
  "metrics": { "reviewsAverage": 4.83, "publishedReviewsCount": 6, "verified": false, "activeUsersCount": 0, "usdGmv": 21000.0 },
  "marketplaceCategory": { "id": "mcat_w35XJPqgMxQMx", "name": "Real Estate" },
  "images": [ { "isVideo": false, "isAnimated": false, "image": { "original": "https://img-v2-prod.whop.com/...", "double": null } } ],
  "renewalPrice": 0.0,
  "effectivePrice": 3500.0,
  "priceRange": { "min": 3500.0, "max": 9800.0 },
  "productUrl": "https://whop.com/soberlivingriches/",
  "checkoutUrl": "https://whop.com/soberlivingriches?pass=prod_dZupVMFqJmV2o",
  "status": "live_marketplace",
  "visibility": "visible",
  "accessPassType": "app",
  "businessType": "coaching_and_courses",
  "industryType": "rental_property",
  "industryGroup": "real_estate",
  "fullDescription": "Overcome sober living investing fears with our supportive community...",
  "creatorPitch": "Learn to build a sober living empire.",
  "growth": {
    "memberCount": 0, "likeCount": 12, "shareCount": 3,
    "storePageViewsCount": 4820, "storePageClicksCount": 640,
    "cardImpressionCount": 15200, "cardClickCount": 980,
    "last3HoursNewUsers": 0, "last24HoursNewUsers": 0, "last30DaysNewUsers": 125,
    "last24HoursGmv": 0.0, "last24HoursTotalUsers": 864,
    "last24HoursAverageTimeSpent": 340, "last24HoursAffiliateEarnings": 0.0,
    "last7DaysPublishedReviews": 1, "totalBountyAmount": 0,
    "visiblePlansCount": 2, "hasFreeAvailablePlan": false, "hasPaidAvailablePlan": true,
    "discoverableAt": 1701000000, "updatedAt": 1785500000
  },
  "reviewsBreakdown": { "5": 5, "4": 1 },
  "reviewCounts": { "total": 6 },
  "affiliate": {
    "globalAffiliatePercentage": 10.0, "globalAffiliateStatus": "enabled",
    "memberAffiliatePercentage": null, "memberAffiliateStatus": null
  },
  "socials": [
    { "platform": "instagram", "handle": "soberlivingriches", "url": "https://www.instagram.com/soberlivingriches", "verified": false }
  ],
  "owner": { "id": "user_abc123", "username": "andrewlamb", "name": "Andrew Lamb", "bio": "Investor & coach", "city": "Los Angeles", "country": "US", "followersCount": 9 },
  "companyDetails": {
    "createdAt": 1650000000, "updatedAt": 1785500000, "verified": false, "memberCount": 864,
    "description": "A community for sober living investors.", "publishedReviewsCount": 6,
    "reviewsAverage": 4.83, "cachedTotalViewsCount": 15200, "hasGlobalAffiliatesEnabled": true,
    "launched": true, "url": "https://whop.com/soberlivingriches/"
  },
  "plans": [ { "id": "plan_cT1jck0rofzBd", "planType": "one_time", "rawInitialPrice": 3500.0, "baseCurrency": "usd", "free": false, "title": "Full Access" } ],
  "searchSource": "catalog",
  "scrapedAt": 1785598641
}
```

`reviews` (an array of `{ id, stars, title, description, createdAt, upvotes, reviewer: { username, name } }` objects), `faq`, and `experiences` are appended in the same way when their respective `include*` toggles are switched on.

#### 🏬 Company-mode record shape

With `scrapeCompanies: true`, each record is one business instead of one listing, built by `assemble_company()`. It carries: `id`, `title`, `route`, `hubRoute`, `url`, `businessType`, `industryType`, `industryGroup`, `verified`, `memberCount`, `description`, `businessDescription`, `creatorPitch`, `targetAudience`, `createdAt`, `updatedAt`, `reviewsAverage`, `publishedReviewsCount`, `totalViewsCount`, `hasGlobalAffiliatesEnabled`, `registeredCompanyNumber`, `logo`, plus `socials` and `owner` (when those toggles are on), an optional nested `products[]` array (when `includeCompanyProducts` is on — each with `id`, `title`, `route`, `whopRanking`, `activeUsersCount`, `reviewsAverage`, `publishedReviewsCount`, `pricing`), and `scrapedAt`.

### 🔗 Related Actors

If you're looking at this Actor, you may also want **[Whop Content Rewards Scraper](https://apify.com/citrine_venus/whop-content-rewards-scraper)** — but the two solve different problems, and the similar naming makes them easy to confuse:

- **This Actor (Whop Marketplace Data Scraper)** scrapes Whop.com's general **product, course, and membership storefront catalog** — the public marketplace where buyers browse and purchase digital products. Use it for pricing research, company/owner discovery, growth tracking, and affiliate-program sourcing across the whole marketplace.
- **[Whop Content Rewards Scraper](https://apify.com/citrine_venus/whop-content-rewards-scraper)** targets **Whop Content Rewards** — the creator payout and clipping-campaign boards where brands pay creators per view/engagement for promotional clips. It's built for influencer/UGC campaign discovery, not for the storefront catalog.

If your goal is "what products sell on Whop and who owns them," you want this Actor. If your goal is "what brands are running paid clipping/content campaigns on Whop," you want the Content Rewards scraper instead.

### ❓ Frequently Asked Questions

#### ⚖️ Is it legal to scrape Whop.com?

Scraping publicly accessible pages is generally permissible, but you're responsible for complying with Whop's Terms of Service and any applicable law in your jurisdiction, and for how you use the data (e.g. respecting opt-outs for outreach). This Actor only reads data Whop already serves publicly through its own GraphQL API — the same data a browser loads when you visit whop.com.

#### 🔎 How is this different from just using Whop's own search?

Whop's own public keyword search caps out at roughly **1,000 results per query**. This Actor's catalog-browsing mode paginates through the entire live marketplace with no such ceiling, so a category, price range, or date-range pull can return far more than search alone would ever surface. Combined with server-side sorting and filters, it's built specifically for **whop competitor research** and **digital product market research on Whop** at a scale the built-in search UI can't reach.

#### 🔌 Does it work with Whop's own public API, or is this unofficial?

It talks to Whop's **public GraphQL API** — the same endpoint whop.com's own web app uses — over the public internet, with no authentication or private credentials involved. Because the schema is introspected fresh on every run, the query set adapts automatically if Whop adds, renames, or removes fields, instead of silently breaking.

#### 📈 Can I track a company's growth over time?

Yes — enable `includeGrowthMetrics` (on by default) to capture 3h/24h/30d new-user counts, GMV, views, clicks, likes, and shares per listing. Then run this Actor on a **schedule** (daily or weekly, via Apify's built-in Scheduler) against the same URLs or keywords. Each run's `growth` object and `scrapedAt` timestamp let you track Whop company growth over time by comparing dataset snapshots — a capability most Whop scrapers on the market don't advertise at all.

#### 🤝 Can I find listings with an active affiliate program?

Yes. Set `affiliateEnabledOnly` to `true`, and/or `affiliatePercentageMin` to a minimum commission threshold, to use this Actor as a **Whop affiliate program finder**. Every record's `affiliate` object exposes the exact commission percentage and program status as a first-class field — most comparable tools don't surface affiliate terms as a headline extracted field at all.

#### 💲 Why is `price` sometimes 0 on a listing that clearly isn't free?

Whop lets a listing offer a free signup with a paid renewal (e.g. a free trial, then $699/month). `price` reflects only the signup charge; `effectivePrice` reflects what a buyer actually ends up paying. Filter and sort on `effectivePrice`, not `price`, when doing pricing-plan analysis.

#### 🛡️ Do I need to set up my own proxy?

No. The run starts with a direct connection and escalates to a datacenter proxy and then a residential proxy route automatically, only if Whop pushes back — and stays on the working route from then on. Every route change is logged. You only need to touch `proxyConfiguration` to force a specific route yourself.

#### ⏸️ What happens if I stop the run partway through?

Nothing is lost. Every record streams to your dataset the instant it's collected, so a stopped, aborted, or interrupted run still keeps everything gathered up to that point.

#### 💡 What can I actually use this data for?

Common use cases include: **competitor research** (pricing, plan structure, and growth trends across a niche), **lead generation** (owner names, company descriptions, and social/contact links for outreach), **affiliate program discovery** (filtering the entire catalog by commission percentage), and general **digital product market research** — sizing a niche by keyword search volume and marketplace GMV before committing to it.

### 💬 Support and Feedback

Found a bug, or need a custom field, extra enrichment, or a scheduled feed built around this Actor? Open an issue on the **Issues** tab of this Actor's page in Apify Console, or reach out directly at <hello.dataminds@gmail.com> — happy to help.

# Actor input Schema

## `urls` (type: `array`):

📎 Paste Whop search, category, product, or company page URLs — one per line, or upload a file. Bulk input supported. Bare `prod_*` / `biz_*` IDs also work.

## `queries` (type: `array`):

🗝️ Keywords to search on Whop — for example `trading`, `ai agency`, `fitness coaching`. Each is searched separately.

## `catalogBrowse` (type: `boolean`):

🛍️ When no URL or keyword is given, walk the entire live Whop marketplace catalog instead of doing nothing.

## `scrapeCompanies` (type: `boolean`):

🏢 Turn this on to get one record per business/company (with its product list) instead of one record per listing.

## `sortBy` (type: `string`):

📊 How the catalog is ordered before your other filters are applied.

## `sortDirection` (type: `string`):

⬆️⬇️ Ascending or descending. Leave on default for Whop's own ordering (works well with 'Date added' to reach the oldest listings).

## `categories` (type: `array`):

🏷️ Top-level Whop categories, e.g. `ai`, `trading`, `personal-development`. Each category runs as its own pass, so 'Max results per input' applies to each.

## `priceMin` (type: `number`):

💰 Lowest price to include, in the listing's own currency.

## `priceMax` (type: `number`):

💰 Highest price to include, in the listing's own currency.

## `affiliatePercentageMin` (type: `number`):

🤝 Only listings offering at least this affiliate commission.

## `affiliateEnabledOnly` (type: `boolean`):

🤝 Keep only listings that currently run an affiliate program.

## `discoverableOnly` (type: `boolean`):

🔍 Keep only listings Whop has published to its public Discover feed.

## `minRating` (type: `number`):

⭐ Drop listings rated below this (0–5).

## `minReviews` (type: `integer`):

📝 Drop listings with fewer published reviews than this.

## `minMembers` (type: `integer`):

👥 Drop listings with fewer active users than this.

## `verifiedOnly` (type: `boolean`):

✅ Keep only listings that carry Whop's verified badge.

## `createdAfter` (type: `string`):

📅 Only listings created after this date.

## `createdBefore` (type: `string`):

📅 Only listings created before this date.

## `freeOnly` (type: `boolean`):

🆓 Keep only listings that don't charge anything.

## `paidOnly` (type: `boolean`):

💳 Keep only listings that charge something.

## `titleContains` (type: `string`):

🔤 Keep only listings whose title, headline or description contains this text.

## `withSocialsOnly` (type: `boolean`):

📧 Lead-gen mode: drop anything with no social/contact link at all.

## `includeSocials` (type: `boolean`):

📧 Creator and company social handles and links.

## `includeOwner` (type: `boolean`):

👤 Name, bio, city, country, follower count of the person behind the listing.

## `includeCompanyDetails` (type: `boolean`):

🏢 Company description, member count, views, review stats.

## `includeGrowthMetrics` (type: `boolean`):

📈 3h / 24h / 30d new users, 24h GMV, impressions, clicks, likes, shares.

## `includeAffiliate` (type: `boolean`):

🤝 Commission percentage and program status.

## `includePlans` (type: `boolean`):

💳 Every visible pricing plan, not just the default one.

## `maxPlansPerProduct` (type: `integer`):

💳 More plans per listing costs a bit more time per request.

## `includeImages` (type: `boolean`):

🖼️ Pull the listing's gallery images and videos.

## `includeFaq` (type: `boolean`):

❓ Pull the listing's published FAQ questions and answers.

## `includeExperiences` (type: `boolean`):

🧩 Pull the apps/experiences bundled inside the listing.

## `includeReviews` (type: `boolean`):

⭐ Fetch the actual review text and star breakdown per listing (a little slower).

## `maxReviewsPerProduct` (type: `integer`):

⭐ Cap on how many reviews are fetched per listing when full review text is on.

## `includeCompanyProducts` (type: `boolean`):

📦 Nest each company's own product catalog inside its record.

## `getKeywordRevenueDetails` (type: `boolean`):

💰 Marketplace-wide daily GMV for each search keyword.

## `getKeywordSearchVolume` (type: `boolean`):

📊 How often each keyword is searched on Whop (last 30 days).

## `keywordRevenueDays` (type: `integer`):

📅 How many days of daily revenue history to fetch per keyword.

## `getTopKeywords` (type: `boolean`):

🏆 Fetch Whop's own top-keywords-by-search-volume list.

## `limit` (type: `integer`):

🎯 Stop after this many listings have been saved for each URL/keyword/category. Exact, not approximate.

## `concurrency` (type: `integer`):

⚡ How many requests can be in flight at once.

## `maxRetries` (type: `integer`):

🔁 Attempts on the current connection route before falling back or giving up on that request.

## `requestDelay` (type: `number`):

🐢 A small pause keeps the run polite and stable.

## `resumeOffset` (type: `integer`):

⏭️ Skip the first N catalog rows to continue a previous run.

## `maxScanned` (type: `integer`):

🧭 Give up after examining this many listings when quality filters are very narrow. `0` = no cap.

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

🚦 By default the run connects with no proxy at all, and automatically falls back to a datacenter route and then a residential route only if Whop pushes back — then stays on that route. Pick your own route here to override that.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://whop.com/discover/search/?q=trading"
    }
  ],
  "queries": [],
  "catalogBrowse": true,
  "scrapeCompanies": false,
  "sortBy": "trending",
  "sortDirection": "",
  "categories": [],
  "affiliateEnabledOnly": false,
  "discoverableOnly": true,
  "verifiedOnly": false,
  "freeOnly": false,
  "paidOnly": false,
  "withSocialsOnly": false,
  "includeSocials": true,
  "includeOwner": true,
  "includeCompanyDetails": true,
  "includeGrowthMetrics": true,
  "includeAffiliate": true,
  "includePlans": true,
  "maxPlansPerProduct": 5,
  "includeImages": true,
  "includeFaq": false,
  "includeExperiences": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 5,
  "includeCompanyProducts": false,
  "getKeywordRevenueDetails": false,
  "getKeywordSearchVolume": false,
  "keywordRevenueDays": 90,
  "getTopKeywords": false,
  "limit": 10,
  "concurrency": 8,
  "maxRetries": 3,
  "requestDelay": 0,
  "resumeOffset": 0,
  "maxScanned": 50000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `runSummary` (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 = {
    "urls": [
        {
            "url": "https://whop.com/discover/search/?q=trading"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("citrine_venus/whop-marketplace-data-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 = {
    "urls": [{ "url": "https://whop.com/discover/search/?q=trading" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("citrine_venus/whop-marketplace-data-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 '{
  "urls": [
    {
      "url": "https://whop.com/discover/search/?q=trading"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call citrine_venus/whop-marketplace-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,citrine_venus/whop-marketplace-data-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/nhbOZ2tINefMqzaz6/builds/YGnX5PjUE2V0dlFFT/openapi.json
