# Whop Content Rewards Scraper (`citrine_venus/whop-content-rewards-scraper`) Actor

Extract every Whop Content Rewards campaign: per-platform payout rates, budget burn rate, creator counts, approval rates, and brand trust data. Track clipping and UGC campaigns and their real economics without clicking through each card.

- **URL**: https://apify.com/citrine\_venus/whop-content-rewards-scraper.md
- **Developed by:** [Data Minds](https://apify.com/citrine_venus) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 Content Rewards Scraper: Payouts, Budget Burn & Brand Trust Data

Extract every clipping and UGC campaign from Whop's Content Rewards board — per-platform payout rates, budget burn economics, real creator counts, approval rates and brand-trust signals — as clean, ready-to-use data.

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

***

### 📑 Table of Contents

- [What Is Whop Content Rewards Scraper?](#-what-is-whop-content-rewards-scraper)
- [What Data Can You Extract From Whop Content Rewards?](#-what-data-can-you-extract-from-whop-content-rewards)
- [How It Works](#-how-it-works)
- [Input Parameters](#-input-parameters)
- [Output Example](#-output-example)
- [Related Actors](#-related-actors)
- [Frequently Asked Questions](#-frequently-asked-questions)
- [Support & Contact](#-support--contact)

***

### 🎁 What Is Whop Content Rewards Scraper?

**Whop Content Rewards Scraper** is an [Apify Actor](https://apify.com/actors) that turns **contentrewards.com** — Whop's pay-per-view clipping and UGC campaign marketplace, where brands pay creators per 1,000 views — into structured data. It is a purpose-built **whop content rewards scraper**: point it at the live board, the ended archive, or a specific list of campaigns, and it returns **per-platform payout tables**, **budget burn-rate economics**, **real creator counts**, **submission approval rates**, and **brand-trust data** (verification status, rating, review count, member count, tenure) that never show up on the campaign cards you scroll past manually. Because it runs on the **Apify platform**, you get built-in scheduling, run monitoring, a REST/GraphQL API for every dataset, and automatic proxy rotation — none of which you get from browsing the board by hand.

The Actor talks to Content Rewards' own Next.js server actions and Whop's GraphQL API directly, and it re-reads the live server-action IDs on every run — so when contentrewards.com ships a new deploy and rotates its internal action identifiers, the scraper keeps working without a code update.

***

### 📊 What Data Can You Extract From Whop Content Rewards?

For **clipper income tracking** and **UGC campaign discovery**, one run gives you five layers of data per campaign:

- 🏷️ **The campaign itself** — title, brand, category, campaign type (clipping / UGC / both), status, description, and direct links to the campaign page and the underlying Whop product.
- 💰 **What it actually pays** — not just the one headline rate shown on the card, but the full **per-platform payout table**: the CPM (dollars per 1,000 views), the payout ceiling per submission, and the minimum views a clip needs before it earns anything, broken out for TikTok, Instagram, YouTube, X and Facebook separately.
- 🔥 **The budget and burn economics** — total budget, amount already spent, budget left, percent spent, and a computed **daily burn rate** with an **estimated days-to-depletion** figure, so you can tell whether a campaign's money will still be there next week.
- 🏆 **Competition and quality signals** — the real creator count (not the placeholder the public list shows), the submission **approval rate**, success rate, total views and view momentum — the numbers that tell you whether a campaign is worth entering or already saturated.
- ✅ **Brand trust data** — whether the brand is verified, its star rating, review count, member count and how long it has existed on Whop. This is the layer most Whop content rewards scrapers skip, and it is the difference between chasing a campaign from a real, paying brand versus one that is about to vanish.

Use it for clipper income tracking, **brand budget tracking on Whop campaigns**, UGC campaign discovery, and general creator monetization research on Whop — anything that requires comparing many campaigns side by side instead of clicking through them one at a time.

***

### 🔧 How It Works

1. **Choose scope.** Point the Actor at the whole live board, the ended archive, or a specific list of campaign URLs / IDs.
2. **The Actor reads the board.** It fetches Content Rewards' Next.js React Server Component ("flight") payload — the same data the page itself renders from — and extracts every campaign row without needing a browser.
3. **Server actions are re-resolved live.** Before making any deep calls, the Actor re-reads the current server-action IDs and companion-API endpoints straight out of the site's own JS chunks. This is what makes the scraper self-healing: a Content Rewards deploy that rotates internal action IDs does not break the run.
4. **Filters are applied.** Your status, type, category, platform, money, competition, brand-trust and date filters narrow the campaign list before the expensive per-campaign lookups run — a `sortBy` value and a small `maxItems` can skip most of the deep-read work entirely.
5. **Each remaining campaign is opened for detail.** The Actor pulls the per-platform payout table, requirements, resources (brief/footage links), top earners and true approval rate for every campaign that survives the filters (`includeDetails`).
6. **Brand data is looked up via Whop's GraphQL API.** Verification status, rating, review count, member count and account age are attached to each campaign (`includeBrand`).
7. **Derived economics are computed.** Budget left, daily burn rate, estimated days to depletion, budget per creator and an opportunity score are calculated from the raw numbers.
8. **Results stream to your dataset** in real time, sorted by your chosen order, ready for JSON, CSV, Excel or API export — with automatic proxy rotation and retry/backoff kicking in only if the target pushes back, so most runs never need a proxy at all.

***

### 🧩 Input Parameters

All fields are optional and ship with sensible defaults, so you can press Start for the full live board right away. There are roughly 30 filters below, grouped exactly as they appear in the input form.

#### 🚀 Start Here — What to Collect

| Field | Type | Description | Default |
|---|---|---|---|
| `status` | string (`active` | `completed` | `all`) | Which campaigns to collect. `active` = live, currently paying out; `completed` = the ended archive; `all` = both. | `active` |
| `startUrls` | array of strings | Specific campaign URLs to collect (bulk supported — one per line, a list, or a file upload), e.g. `https://contentrewards.com/discover/<id>`. Leave empty to read the whole board. | `[]` |
| `campaignIds` | array of strings | Campaign UUIDs instead of full links. Combines with `startUrls`. | `[]` |
| `maxItems` | integer | Upper limit on campaigns saved to the dataset. The live board runs roughly 490 campaigns, the ended archive roughly 1,160. | `1000` |

#### 🎯 Campaign Filters

| Field | Type | Description | Default |
|---|---|---|---|
| `campaignTypes` | array (`clipping` | `ugc` | `both`) | Keep only these campaign types. `both` campaigns always pass either filter. | `[]` |
| `categories` | array (`Entertainment`, `Gaming`, `Music`, `Personal Brand`, `Product`, `Technology`, `education`, `Logo`, `Slideshow`, `Other`) | Keep only these categories. | `[]` |
| `platforms` | array (`tiktok` | `instagram` | `youtube` | `x` | `facebook`) | Keep only campaigns accepting at least one of these platforms. | `[]` |
| `searchText` | string | Case-insensitive substring match against title, brand, description and category. | `""` |

#### 💵 Money Filters — Is It Worth Your Time?

| Field | Type | Description | Default |
|---|---|---|---|
| `minRewardPerThousand` | number | Minimum reward per 1,000 views (USD). | none |
| `maxRewardPerThousand` | number | Maximum headline rate — useful for benchmarking. | none |
| `minMaxPayoutUsd` | number | Minimum payout ceiling per single submission. | none |
| `minBudgetLeftUsd` | number | Minimum unspent budget still remaining. | none |
| `minTotalBudgetUsd` | number | Minimum total funding for the campaign. | none |
| `maxProgressPercentage` | integer (0–100) | Only campaigns at most this % through their budget. | none |
| `minDaysToDepletion` | number | Only campaigns whose remaining budget survives at least this many days at the current burn rate. | none |

#### 🏁 Competition & Quality Filters

| Field | Type | Description | Default |
|---|---|---|---|
| `minCreators` | integer | Only campaigns with at least this many creators already participating (a proven-payout signal). | none |
| `maxCreators` | integer | Only campaigns with at most this many creators — filters out saturated campaigns, useful for **finding low-competition clipping campaigns on Whop**. | none |
| `minApprovalRatePct` | integer (0–100) | Only campaigns accepting at least this share of submissions. | none |
| `minTotalViews` | integer | Only campaigns that have already accumulated at least this many views. | none |

These require the deep per-campaign read (`includeDetails`, on by default) since the board's own list feed does not carry creator counts or approval rates.

#### 🛡️ Brand Trust Filters

| Field | Type | Description | Default |
|---|---|---|---|
| `verifiedBrandsOnly` | boolean | Keep only campaigns run by a verified company. | `false` |
| `minBrandRating` | number (0–5) | Only brands rated at least this highly by their published reviews. | none |
| `minBrandMembers` | integer | Only brands with at least this many members — a size and legitimacy signal. | none |
| `hasResourcesOnly` | boolean | Keep only campaigns that publish a brief, footage or asset link. | `false` |

This section is the Actor's brand-trust data layer — the anti-scam signal that tells you who is actually behind a campaign before you commit hours to it.

#### 📅 Date Filters & Launch Alerts

| Field | Type | Description | Default |
|---|---|---|---|
| `fundedAfter` | string (date) | Only campaigns funded on or after this date. | `""` |
| `fundedBefore` | string (date) | Only campaigns funded on or before this date. | `""` |
| `newSince` | string (ISO timestamp) | Only campaigns newer than this timestamp, e.g. `2026-07-25T00:00:00Z`. Combine with an Apify Schedule to track new Whop Content Rewards campaigns automatically instead of re-scraping the whole board. | `""` |

#### 🔀 Ranking & Output Detail

| Field | Type | Description | Default |
|---|---|---|---|
| `sortBy` | string | Result order: `budgetLeft`, `reward`, `opportunity`, `newest`, `oldest`, `progress`, `leastCreators`, `creators`, `approvalRate`, `totalViews`, `burnRate`, `daysLeft`, `totalBudget`. | `budgetLeft` |
| `includeDetails` | boolean | Opens every campaign for its per-platform payout table, requirements, brief links, approval rate, top earners and real creator count. Off is cheaper but returns `creators`/`successRatePct` as the board's placeholder `0`. | `true` |
| `includeBrand` | boolean | Adds the brand-trust layer: verified status, rating, review count, member count and tenure. | `true` |
| `includeViewHistory` | boolean | Adds the day-by-day view series and the last-7-day total (one extra lookup per campaign). | `false` |
| `includeDescription` | boolean | Includes the full campaign brief text. | `true` |
| `includeRaw` | boolean | Adds a `raw` object with values exactly as the site displays them, alongside the parsed numbers. | `false` |

#### ⚡ Network & Speed (Performance)

| Field | Type | Description | Default |
|---|---|---|---|
| `proxyConfiguration` | object | By default the run starts on a direct connection and escalates to a datacenter, then a residential route, only if the site pushes back. Override to force a specific route/country. | `{"useApifyProxy": false}` |
| `concurrency` | integer (1–20) | How many campaigns to read in parallel. | `8` |
| `requestDelaySeconds` | number (0–10) | Pause between requests. | `0` |
| `maxRetries` | integer (1–10) | Attempts per request before the run escalates to the next network route. | `3` |
| `maxScanned` | integer | Safety cap on how many board rows are examined before the filters give up. | `20000` |

***

### 📦 Output Example

Each campaign is written to your dataset as one JSON object. Field names below are exact — copied directly from the Actor's output code, not paraphrased.

```json
{
  "id": "188c3e39-7850-4896-94df-e7a5be0cfec3",
  "title": "Boxabl Official Clipping",
  "brand": "Clip Farm",
  "status": "active",
  "campaignType": "clipping",
  "category": "Entertainment",
  "isVerified": true,
  "description": "Boxabl makes foldable homes... Your job is to clip the best moments and post to short-form.",
  "rewardPerThousandViews": 0.5,
  "payouts": [
    { "platform": "youtube", "cpmUsd": 0.5, "maxPayoutUsd": 500.0, "minViews": 2000 },
    { "platform": "tiktok", "cpmUsd": 0.75, "maxPayoutUsd": 500.0, "minViews": 2000 },
    { "platform": "instagram", "cpmUsd": 0.5, "maxPayoutUsd": 500.0, "minViews": 2000 },
    { "platform": "x", "cpmUsd": 0.5, "maxPayoutUsd": 500.0, "minViews": 2000 }
  ],
  "maxPayoutPerSubmissionUsd": 500.0,
  "minViewsPerSubmission": 2000,
  "totalBudgetUsd": 85000.0,
  "budgetSpentUsd": 5439.27,
  "budgetLeftUsd": 79560.73,
  "progressPercentage": 6.0,
  "platforms": ["instagram", "tiktok", "x", "youtube"],
  "creators": 2890,
  "approvalRatePct": 41,
  "successRatePct": 34,
  "totalViews": 10491859,
  "viewsLast7Days": 1752344,
  "fundedAt": "2026-07-18T01:01:25.000Z",
  "ageDays": 16.4,
  "dailyBurnUsd": 331.16,
  "estimatedDaysToDepletion": 240.3,
  "budgetPerCreatorUsd": 29.41,
  "opportunityScore": 40.2,
  "requirements": [
    { "text": "Tag @boxabl in every caption", "platform": "all", "isMandatory": true }
  ],
  "resources": [
    { "label": "FOOTAGE", "url": "https://docs.google.com/document/d/1QwGNf...", "platform": "google_drive", "description": null }
  ],
  "topEarners": [
    { "username": "brentrose", "name": "Brent", "viewCount": 760200 }
  ],
  "dailyViews": [
    { "date": "2026-08-27", "views": 84210 },
    { "date": "2026-08-28", "views": 91045 }
  ],
  "dailySubmissions": [
    { "date": "2026-08-27", "views": 12 },
    { "date": "2026-08-28", "views": 9 }
  ],
  "brandVerified": true,
  "brandMemberCount": 428112,
  "brandRating": 4.65,
  "brandReviewCount": 3310,
  "brandSince": "2025-08-07T02:12:25.000Z",
  "brandIndustry": "clipping_community",
  "campaignUrl": "https://contentrewards.com/discover/188c3e39-7850-4896-94df-e7a5be0cfec3",
  "whopUrl": "https://whop.com/joined/clip-farm-official/exp_sKCcnfigfcLoSb/app",
  "brandUrl": "https://whop.com/clip-farm-d5/",
  "thumbnailUrl": "https://cdn.contentrewards.com/user_OcrJjJleyCAyi/1784333743622.jpg",
  "avatarUrl": "https://cdn.contentrewards.com/user_OcrJjJleyCAyi/avatar.jpg",
  "whopExperienceId": "exp_sKCcnfigfcLoSb",
  "whopCompanyId": "biz_11XCiCYU5NQqLk",
  "programId": "prog_9Kd2mQfz",
  "detailsFetched": true,
  "scrapedAt": "2026-08-29T11:13:34.000Z"
}
```

> `dailyViews` and `viewsLast7Days` only appear when `includeViewHistory` is set to `true` (default `false`). `raw` (original display strings) only appears when `includeRaw` is `true`.

#### 🗂️ Nested Field Shapes

| Array | Fields | Notes |
|---|---|---|
| `payouts[]` | `platform`, `cpmUsd`, `maxPayoutUsd`, `minViews` | One row per accepted platform — the actual per-platform payout table, not just the headline rate. |
| `requirements[]` | `text`, `platform` (defaults to `"all"`), `isMandatory` | Submission rules; getting one wrong is the most common reason a clip is rejected. |
| `resources[]` | `label`, `url`, `platform`, `description` | Brief, footage bank and asset links. |
| `topEarners[]` | `username`, `name`, `viewCount` | Highest-performing creators currently on the campaign. |
| `dailyViews[]` | `date`, `views` | Daily view series, only with `includeViewHistory: true`. |
| `dailySubmissions[]` | `date`, `views` | Daily submission-count series (field name is `views` in the underlying data, same as `dailyViews`), only with `includeViewHistory: true`. |

***

### 🔗 Related Actors

If you are looking for **Whop Content Rewards** data specifically — creator payout campaigns where brands pay per 1,000 views for clips and UGC — this Actor is the one you want.

If instead you want Whop's **general product catalog** — the courses, communities, SaaS tools and digital products sold on whop.com storefronts, unrelated to clipping payouts — use the sibling Actor **[Whop Marketplace Data Scraper](https://apify.com/citrine_venus/whop-marketplace-data-scraper)** (`citrine_venus/whop-marketplace-data-scraper`) instead.

The two are easy to confuse because of the shared "Whop" naming, so to be explicit:

| | This Actor | [Whop Marketplace Data Scraper](https://apify.com/citrine_venus/whop-marketplace-data-scraper) |
|---|---|---|
| Source | contentrewards.com (Content Rewards board) | whop.com marketplace |
| What it returns | Clipping/UGC campaigns: payout rates, budget burn, approval rates, brand trust | Whop products: courses, communities, memberships, pricing, categories |
| Who it's for | Clippers, clipping agencies, creator-economy analysts, brands running campaigns | Buyers/researchers browsing Whop's storefront catalog |

Use both together if you need the full picture: campaign-side payout economics from this Actor, and product/storefront data from the marketplace Actor.

***

### ❓ Frequently Asked Questions

#### ⚖️ Is scraping Whop Content Rewards legal?

This Actor collects publicly available campaign listings from contentrewards.com — the same data any visitor sees without logging in. No login, paywall or private data is accessed. Scraping public data is generally lawful in the EU and US, but you remain responsible for how you use the data, for respecting the target site's terms, and for handling any personal data (like a creator's username) in line with GDPR/CCPA. This is not legal advice.

#### 🆚 How is this different from just browsing contentrewards.com manually?

Browsing the board shows one campaign card at a time, with a single headline rate and placeholder `0` values for creators and success rate on the public list. This Actor opens every campaign's actual record to pull the real per-platform payout table, true creator count, and approval rate. It also computes budget burn rate and days-to-depletion (numbers the site never shows directly), and adds a brand-trust layer via Whop's GraphQL API — all exported as structured JSON/CSV instead of screenshots.

#### 💵 How much do Whop clippers actually make?

It depends entirely on the campaign's per-platform CPM, its payout ceiling per submission, and how many views your clip pulls — which is exactly why the per-platform `payouts[]` table and `topEarners[]` field exist here. This kind of clipper income tracking gets more reliable when you filter by `minRewardPerThousand`, `minMaxPayoutUsd` and `minApprovalRatePct` together: it gives a realistic income estimate before you ever post a clip, rather than relying on the single headline rate shown on the campaign card.

#### 🔍 How do I find high-paying clipping campaigns on Whop?

Sort by `reward` or `opportunity` and set `minRewardPerThousand` and `minMaxPayoutUsd` to your floor. Combine with `minBudgetLeftUsd` and `minDaysToDepletion` so you are not chasing a campaign whose budget is about to run dry.

#### 🥇 How do I find low-competition clipping campaigns on Whop?

Use `maxCreators` to cap the field, sort by `leastCreators`, and pair it with `minApprovalRatePct` so you are not trading crowding for a brand that rejects most submissions anyway.

#### 🏆 What are the best-paying Whop Content Rewards campaigns right now?

Run the Actor with `status: active`, `sortBy: reward` or `sortBy: opportunity`, and no other filters to get a ranked snapshot of the entire live board's rates in one pass — updated every time you run it, unlike a static "best campaigns" list.

#### 🔥 What does budget burn rate tell me about a campaign?

`dailyBurnUsd` is the average USD spent per day since the campaign was funded, and `estimatedDaysToDepletion` divides the remaining budget by that rate. A high burn rate with little `budgetLeftUsd` means the campaign could stop paying soon regardless of how good its headline rate looks — this Actor's budget burn-rate math is exactly the differentiator that separates a still-funded campaign from one about to run dry.

#### 🛡️ Does this Actor expose brand trust or reputation data?

Yes — `brandVerified`, `brandRating`, `brandReviewCount`, `brandMemberCount` and `brandSince` are pulled via Whop's GraphQL API for every campaign's brand when `includeBrand` is on. This is the anti-scam layer most Whop Content Rewards scrapers skip entirely, and it is the fastest way to tell a legitimate, established brand from one you should be cautious about.

#### ✅ Does it report submission approval rates?

Yes — `approvalRatePct` is a headline field on every campaign with `includeDetails` on, alongside `successRatePct`. A high reward rate is meaningless if the brand rejects most submissions, so this is one of the primary quality filters (`minApprovalRatePct`) rather than an afterthought.

#### 🔌 Is there a Content Rewards API I can call directly?

contentrewards.com does not publish a public API. This Actor is built on top of the site's internal Next.js server actions and Whop's GraphQL endpoints. It re-reads the live action IDs on every run so it keeps working through the site's own deploys, giving you API-style access (Apify's REST API, JSON/CSV/XML export, webhooks) without needing to reverse-engineer or maintain that integration yourself.

#### 🔔 Can I track new campaigns automatically instead of re-scraping the whole board?

Yes — set `newSince` to an ISO timestamp and combine it with an Apify Schedule. Each scheduled run then returns only campaigns funded after that timestamp, turning the Actor into a launch-alert feed for tracking new Whop Content Rewards campaigns.

#### 🚫 Why did a filter return zero results?

Filters combine with AND, so an over-restrictive combination (e.g. `minRewardPerThousand` above `maxRewardPerThousand`) returns nothing. Check the run log — the Actor names any value you requested that the live board is not currently using, rather than failing silently.

#### 0️⃣ Why are `creators` and `successRatePct` showing `0`?

Those fields only populate correctly when `includeDetails` is `true` (the default). With it off, the board's own list feed reports both as a placeholder `0` to save on request volume — turn `includeDetails` back on for accurate numbers.

#### ⏱️ Can I run this on a schedule for ongoing budget tracking?

Yes. Apify Schedules let you re-run the Actor hourly, daily or on any cron interval, which is the standard way to do brand budget tracking on Whop campaigns over time — comparing `budgetLeftUsd` and `dailyBurnUsd` across runs shows you spend trends the site itself never surfaces.

***

### 🙋 Support & Contact

Found a bug, need a new field, or want a custom build of this Whop Content Rewards scraper for your workflow? Reach out via the **Issues** tab on this Actor's Apify Store page, or reach out directly at **<hello.dataminds@gmail.com>**. Feedback and feature requests are welcome — this Actor is actively maintained to keep pace with contentrewards.com's own changes.

# Actor input Schema

## `status` (type: `string`):

🎯 Which campaigns to collect. **Live** = currently paying out. **Ended** = the historical archive (what rates actually cleared). **Everything** = both, the full record.

## `startUrls` (type: `array`):

📎 Paste one or more campaign links to collect only those, e.g. `https://contentrewards.com/discover/6b7db90d-412f-4bcc-ab1e-619ab73bfa09`. Bulk input supported — one URL per line, paste a list, or upload a file. Leave empty to take the whole board.

## `campaignIds` (type: `array`):

🔑 Campaign UUIDs instead of full links — for example `6b7db90d-412f-4bcc-ab1e-619ab73bfa09`. One per line. Combines with the URLs above.

## `maxItems` (type: `integer`):

🎁 Upper limit on the campaigns saved to your dataset. Start with 10–25 for a quick sample, raise it for the full board (~490 live, ~1,160 ended).

## `campaignTypes` (type: `array`):

🎥 Keep only these campaign types. `both` campaigns accept clipping *and* UGC, and always pass.

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

📚 Keep only these categories. Anything the board is not using right now is named in the log instead of silently returning nothing.

## `platforms` (type: `array`):

📲 Keep only campaigns that accept at least one of these platforms.

## `searchText` (type: `string`):

🔍 Keep only campaigns whose title, brand, description or category contains this text (case-insensitive). Example: `poker`.

## `minRewardPerThousand` (type: `number`):

💸 Only campaigns paying at least this much per 1,000 views. Example: `1.5`.

## `maxRewardPerThousand` (type: `number`):

📉 Upper bound on the headline rate — handy for benchmarking your own campaign against comparable ones.

## `minMaxPayoutUsd` (type: `number`):

🏅 Only campaigns where a single submission can earn at least this much. Example: `100`.

## `minBudgetLeftUsd` (type: `number`):

💳 Only campaigns with at least this much still unspent — the practical signal that your views will still get paid. Example: `5000`.

## `minTotalBudgetUsd` (type: `number`):

💼 Only campaigns funded with at least this much in total. Example: `10000`.

## `maxProgressPercentage` (type: `integer`):

⛽ Only campaigns at most this % through their budget. `80` skips nearly-exhausted campaigns.

## `minDaysToDepletion` (type: `number`):

🕰️ Only campaigns whose remaining budget survives at least this many days at the current burn rate. `7` = still alive next week.

## `minCreators` (type: `integer`):

🧑‍🤝‍🧑 Only campaigns that already have at least this many creators — a proven-payout signal.

## `maxCreators` (type: `integer`):

🚦 Only campaigns with at most this many creators competing. `300` is a sensible ceiling for a solo clipper.

## `minApprovalRatePct` (type: `integer`):

🎫 Only campaigns that accept at least this share of submissions. `40` skips brands that reject almost everyone.

## `minTotalViews` (type: `integer`):

📈 Only campaigns that have already accumulated at least this many views. Example: `1000000`.

## `verifiedBrandsOnly` (type: `boolean`):

✔️ Keep only campaigns run by a verified company.

## `minBrandRating` (type: `number`):

🌟 Only brands rated at least this highly by their published reviews. Example: `4.5`.

## `minBrandMembers` (type: `integer`):

👨‍👩‍👧‍👦 Only brands with at least this many members — a size and legitimacy signal.

## `hasResourcesOnly` (type: `boolean`):

🗂️ Keep only campaigns that publish brief, footage or asset links you can actually work from.

## `fundedAfter` (type: `string`):

🗓️ Only campaigns funded on or after this date.

## `fundedBefore` (type: `string`):

🗓️ Only campaigns funded on or before this date.

## `newSince` (type: `string`):

⏰ ISO timestamp, e.g. `2026-07-25T00:00:00Z`. Combined with a schedule this turns the run into a launch alert instead of a re-scrape.

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

📊 Order of the campaigns in your dataset.

## `includeDetails` (type: `boolean`):

🔬 Open every campaign for its **per-platform payout table**, requirements, brief links, approval rate, top earners and the **real creator count**. Turning this off is much cheaper but returns creators and success rate as the board's placeholder `0`.

## `includeBrand` (type: `boolean`):

🏢 Add whether the brand is verified, its rating, review count, member count and how long it has been around.

## `includeViewHistory` (type: `boolean`):

📊 Add the day-by-day view series and the last-7-day total for each campaign (one extra lookup per campaign).

## `includeDescription` (type: `boolean`):

📄 Include the full campaign brief text.

## `includeRaw` (type: `boolean`):

🔤 Add a `raw` object with the values exactly as the site renders them, next to the parsed numbers.

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

🚦 By default the run starts on a **direct connection** and automatically switches to a **datacenter** and then a **residential** route only if the site pushes back — then stays there for the rest of the run. Every switch is logged. Pick your own route here to override that.

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

🏎️ How many campaigns to read at the same time. Lower it to 4 if a slow proxy starts pushing back.

## `requestDelaySeconds` (type: `number`):

🕰️ A small pause keeps the run extra polite. `0` is fine for this target.

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

🛡️ Attempts before the run switches to the next network route.

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

🧯 Safety cap on how many board rows are examined before the filters give up. Raise it only for very large archives.

## Actor input object example

```json
{
  "status": "active",
  "startUrls": [],
  "campaignIds": [],
  "maxItems": 30,
  "campaignTypes": [],
  "categories": [],
  "platforms": [],
  "searchText": "",
  "verifiedBrandsOnly": false,
  "hasResourcesOnly": false,
  "fundedAfter": "",
  "fundedBefore": "",
  "newSince": "",
  "sortBy": "budgetLeft",
  "includeDetails": true,
  "includeBrand": true,
  "includeViewHistory": false,
  "includeDescription": true,
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "concurrency": 8,
  "requestDelaySeconds": 0,
  "maxRetries": 3,
  "maxScanned": 20000
}
```

# Actor output Schema

## `campaigns` (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 = {
    "status": "active",
    "maxItems": 30,
    "sortBy": "budgetLeft",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("citrine_venus/whop-content-rewards-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 = {
    "status": "active",
    "maxItems": 30,
    "sortBy": "budgetLeft",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("citrine_venus/whop-content-rewards-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 '{
  "status": "active",
  "maxItems": 30,
  "sortBy": "budgetLeft",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call citrine_venus/whop-content-rewards-scraper --silent --output-dataset

```

## MCP server setup

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