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

Scrape the Whop Content Rewards directory: reward per 1K views, budget left, burn rate, days of runway, creators, payout per creator and a 0-100 opportunity score. Filter and sort. JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/whop-content-rewards-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 16.7% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 campaigns

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Scrape the [Whop Content Rewards](https://whop.com/content-rewards) directory (contentrewards.com) into structured, ranked data — reward per 1,000 views, budget left, daily burn rate, days of runway, creator count, payout per creator, and a documented 0–100 opportunity score.

<table><tr>
<td style="border-left:4px solid #FF6243;padding:12px 16px;font-weight:600">Pull the whole clipping and UGC board in one run, then filter by reward rate, remaining budget, competition, proof of payout and runway — or sort every campaign by a single opportunity score. Export JSON, CSV, Excel.</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/whop-content-rewards-scraper — scrapes the Whop Content Rewards directory (contentrewards.com/discover, one server-rendered fetch, ~500 campaigns) and derives burn-rate / competition metrics + a 0-100 opportunity score, then filters and sorts. Call: ApifyClient("TOKEN").actor("parsebird/whop-content-rewards-scraper").call(run_input={"status":"active","minRewardPerThousand":2,"minPayoutPerCreatorUsd":5,"maxCreators":300,"minEstimatedDaysLeft":3,"sortBy":"opportunity","maxItems":25}). Inputs: status ("active"|"all"), minRewardPerThousand, minBudgetLeftUsd, maxProgressPercentage, maxCreators, minPayoutPerCreatorUsd, minEstimatedDaysLeft, minOpportunityScore, platforms[] (tiktok|instagram|youtube|x|facebook), campaignTypes[] (clipping|ugc|both), categories[], searchText, sortBy (budgetLeft|opportunity|reward|payoutPerCreator|burn|daysLeft|fewestCreators|newest|progress), maxItems (you are only charged for returned results). Output per campaign: title, brand, opportunityScore, rewardPerThousandViews, totalBudgetUsd, budgetSpentUsd, budgetLeftUsd, dailyBurnUsd, estimatedDaysLeft, budgetPace (draining|healthy|slow|stalled), payoutPerCreatorUsd, viewsPerCreator, estimatedViewsRemaining, progressPercentage, ageDays, status, campaignType, category, platforms[], creators, successRatePct, totalViews, engagement, fundedAt, campaignUrl, description, raw{}. Any field the site does not publish comes back null, never a fabricated zero. API docs: https://docs.apify.com/api/v2  Token: https://console.apify.com/settings/integrations
```

### What does Whop Content Rewards Scraper do?

The **Whop Content Rewards Scraper** reads the public campaign directory that powers Whop Content Rewards — the same information an unauthenticated visitor sees — in a single request, then does the maths the directory does not:

- 💰 **Budget math** — `budgetLeftUsd` (the "is it still worth posting" number), `dailyBurnUsd` since funding, `estimatedDaysLeft` of runway, `budgetPace` bucket
- 🏆 **Competition signals** — `creators`, `payoutPerCreatorUsd` (proof someone is getting paid), `viewsPerCreator`, `estimatedViewsRemaining`
- 📊 **One score** — `opportunityScore`, a transparent 0–100 composite (see below) so you can rank ~500 campaigns instead of eyeballing them
- 🎯 **Filters** — reward rate, budget left, progress, creator cap, payout proof, runway, score, platform, campaign type, category, free-text search
- ↕️ **Sorts** — `budgetLeft`, `opportunity`, `reward`, `payoutPerCreator`, `burn`, `daysLeft`, `fewestCreators`, `newest`, `progress`

Any field the site does not publish for a campaign comes back `null` — never a fabricated zero.

Run it on a **schedule**, pull results through the **Apify API**, and connect it to **Make, Zapier, Google Sheets or Slack**. Export to **JSON, CSV, Excel or HTML**.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `status` | string | No | `active` | `active` or `all` (includes ended/paused campaigns the directory still lists). |
| `minRewardPerThousand` | number | No | — | Minimum USD paid per 1,000 views. |
| `minBudgetLeftUsd` | number | No | — | Minimum unspent budget. |
| `maxProgressPercentage` | number | No | — | Maximum share of budget already consumed. |
| `maxCreators` | number | No | — | Cap the competition (e.g. 300 = campaigns clippers have not piled into). |
| `minPayoutPerCreatorUsd` | number | No | — | Proof of payout — average USD earned per creator so far. |
| `minEstimatedDaysLeft` | number | No | — | Skip campaigns that will drain within this many days at the current burn rate. |
| `minOpportunityScore` | number | No | — | One number instead of five filters. |
| `platforms` | array | No | — | `tiktok`, `instagram`, `youtube`, `x`, `facebook` — keep campaigns accepting at least one. |
| `campaignTypes` | array | No | — | `clipping`, `ugc`, `both`. |
| `categories` | array | No | — | Entertainment, Music, Personal Brand, Product, Technology, Gaming, Slideshow, Logo, Other. |
| `searchText` | string | No | — | Case-insensitive match on title, brand, description, category. |
| `sortBy` | string | No | `budgetLeft` | Order of returned campaigns (best first). |
| `maxItems` | integer | No | — | Maximum campaigns to return. You are only charged for returned results. |

#### Example — the low-competition, proven-payer query

```json
{
  "status": "active",
  "minRewardPerThousand": 2,
  "minPayoutPerCreatorUsd": 5,
  "maxCreators": 300,
  "minEstimatedDaysLeft": 3,
  "sortBy": "opportunity",
  "maxItems": 25
}
```

### Output example

```json
{
  "title": "Call of Duty MW4 - DMZ Clipping",
  "brand": "Call of Duty",
  "opportunityScore": 63.4,
  "rewardPerThousandViews": 1.5,
  "totalBudgetUsd": 40000,
  "budgetSpentUsd": 4447,
  "budgetLeftUsd": 35553,
  "dailyBurnUsd": 4000,
  "estimatedDaysLeft": 52.5,
  "budgetPace": "healthy",
  "payoutPerCreatorUsd": 12.5,
  "viewsPerCreator": 7250,
  "estimatedViewsRemaining": 140000000,
  "progressPercentage": 11,
  "ageDays": 10,
  "status": "active",
  "campaignType": "clipping",
  "category": "Gaming",
  "platforms": ["tiktok", "instagram", "youtube"],
  "creators": 845,
  "successRatePct": 82,
  "totalViews": 2900000,
  "engagement": 12.1,
  "fundedAt": "2026-06-01T12:00:00.000Z",
  "campaignUrl": "https://whop.com/mw4-dmz-clipping/",
  "description": "full rules text — hook / format / whitelist requirements",
  "raw": { "totalBudget": "$40,000", "budgetSpent": "$4,447", "pricePerView": "$1.50", "viewCount": "2.9M" }
}
```

### Data fields

| Field | Notes |
|-------|-------|
| `title`, `brand`, `category`, `campaignType` | `clipping` / `ugc` / `both` |
| `opportunityScore` | 0–100 composite, or `null` when reward rate or budget is missing |
| `rewardPerThousandViews` | USD per 1,000 views |
| `totalBudgetUsd`, `budgetSpentUsd`, `budgetLeftUsd` | `budgetLeftUsd` is computed |
| `dailyBurnUsd` | USD/day paid out since funding |
| `estimatedDaysLeft` | runway at the current burn rate — uncapped; a huge number means stalled, `null` means nothing is being paid out |
| `budgetPace` | `draining` (<3d) / `healthy` (3–60d) / `slow` (60–180d) / `stalled` |
| `payoutPerCreatorUsd` | average USD an entered creator has earned so far |
| `viewsPerCreator`, `estimatedViewsRemaining` | competition / feasibility signals |
| `progressPercentage`, `ageDays` | % of budget consumed; days since funding |
| `creators`, `successRatePct`, `totalViews`, `engagement` | campaign stats as published |
| `platforms` | array of accepted platforms |
| `status` | `active`, or ended/paused with `status: "all"` |
| `fundedAt` | ISO timestamp — spot fresh campaigns |
| `campaignUrl` | link straight to the Whop campaign |
| `description` | rules text as shown on the directory |
| `raw` | the original strings exactly as displayed on the site |

### How the opportunity score works

Deliberately simple, documented, and reproducible so you can argue with it:

- **35% reward rate** — $/1K views, saturating at $5/1K
- **25% budget headroom** — budget left, saturating at $25,000
- **25% low competition** — `100 / (100 + creators)`, so 100 creators = half marks. Capped at half marks while a campaign has never paid anyone: an empty board that has paid $0 is untested, not uncontested, and the data cannot tell those apart
- **15% payout velocity** — full marks for 3–60 days of runway; penalised both when a campaign drains within a day and when it is effectively stalled (a big budget nobody is being paid from is not an opportunity)

Campaigns with no reward rate or no budget data score `null` rather than a misleading number. Unproven campaigns are not hidden — a fresh board with a good rate and real budget is a genuine opportunity and still ranks; it just does not outrank a campaign that is provably paying out.

### How it works

1. One request to the public Content Rewards directory returns the whole campaign list (server-rendered, no login, ~500 campaigns).
2. Repeated cards from featured collections are de-duplicated by campaign ID.
3. Burn rate, runway, payout-per-creator and the opportunity score are computed from the published metrics.
4. Your filters are applied, the list is sorted, and `maxItems` trims it — you are charged only for what is returned.

### How much does it cost?

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `campaign` | $0.0014 | $0.0013 | $0.0012 | $0.0011 |

One event per campaign returned. A full board pull (~500 campaigns) costs about **$0.70** on the Free plan; a filtered query of 25 costs a few cents.

### Related actors

- [YouTube Community Posts Scraper](https://apify.com/parsebird/youtube-community-posts-scraper)
- [Threads Scraper](https://apify.com/parsebird/threads-scraper)
- [Skool Community Scraper](https://apify.com/parsebird/skool-community-scraper)

### FAQ

**Where does the data come from?**
The public Whop Content Rewards directory at contentrewards.com — the same campaign cards an unauthenticated visitor sees. No login, no private API.

**How many campaigns are there?**
Around 400–500 active campaigns on a typical day. One run collects all of them before filtering.

**Why is `estimatedDaysLeft` sometimes huge or null?**
It is uncapped on purpose. A huge number means a large budget is barely being paid out (stalled); `null` means the burn rate is zero. Both show up as `budgetPace: "stalled"`.

**Why did a campaign score high with almost no budget left?**
The score rewards a high reward rate, low competition and proven payouts even when headroom is near zero. Add `minBudgetLeftUsd` if you want to exclude nearly-drained campaigns.

**Can I get ended campaigns?**
Set `status` to `all`. The directory only lists a small number of ended/paused campaigns, so most results will still be active.

**Can I schedule it?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-run daily and track new campaigns via `fundedAt` or `sortBy: "newest"`.

**Something looks wrong.**
Open an issue on the Issues tab with your input and the run URL.

### Legal and compliance

This actor collects publicly available campaign listing data from the Whop Content Rewards directory. It does not log in, access private accounts, or bypass paywalls. You are responsible for using the exported data in compliance with Whop's terms and applicable laws. Use it for lawful purposes such as market research and campaign selection. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

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

Which campaigns to include.

## `minRewardPerThousand` (type: `integer`):

Keep only campaigns paying at least this much per 1,000 views.

## `minBudgetLeftUsd` (type: `integer`):

Keep only campaigns with at least this much unspent budget.

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

Keep only campaigns that have consumed at most this share of their budget.

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

Cap the competition. e.g. 300 keeps campaigns clippers have not piled into yet.

## `minPayoutPerCreatorUsd` (type: `integer`):

Proof of payout. Average USD earned per creator so far must be at least this.

## `minEstimatedDaysLeft` (type: `integer`):

Skip campaigns whose budget will drain within this many days at the current burn rate.

## `minOpportunityScore` (type: `integer`):

One number instead of five filters. 0-100 composite (see the README).

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

Keep campaigns that accept at least one of these platforms.

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

Keep campaigns of these types.

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

Keep campaigns in these categories.

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

Case-insensitive match against title, brand, description and category.

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

Order of the returned campaigns (best first).

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

Maximum campaigns to return. You are only charged for returned results.

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

Proxy settings. The default Apify Proxy is enough.

## Actor input object example

```json
{
  "status": "active",
  "minRewardPerThousand": 2,
  "maxCreators": 300,
  "minPayoutPerCreatorUsd": 5,
  "minEstimatedDaysLeft": 3,
  "sortBy": "opportunity",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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",
    "minRewardPerThousand": 2,
    "maxCreators": 300,
    "minPayoutPerCreatorUsd": 5,
    "minEstimatedDaysLeft": 3,
    "sortBy": "opportunity",
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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",
    "minRewardPerThousand": 2,
    "maxCreators": 300,
    "minPayoutPerCreatorUsd": 5,
    "minEstimatedDaysLeft": 3,
    "sortBy": "opportunity",
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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",
  "minRewardPerThousand": 2,
  "maxCreators": 300,
  "minPayoutPerCreatorUsd": 5,
  "minEstimatedDaysLeft": 3,
  "sortBy": "opportunity",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/whop-content-rewards-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/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/XaOefbxRDUMvxoEmC/builds/QHKcAtLXt07oQgsY9/openapi.json
