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

Find Whop clipping campaigns that are actually paying. Each row carries CPM, budget left, daily burn, days of runway, payout per creator, 7-day momentum, and a 0-100 opportunity score so a parked budget does not rank like a live one. Full board or one campaign URL. JSON or CSV out.

- **URL**: https://apify.com/memo23/whop-content-rewards-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Lead generation, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

## Whop Content Rewards Scraper

Pull the public Whop Content Rewards board into one row per campaign: the headline CPM, how much budget is left, how fast that budget is being paid out, and a 0-100 score you can sort.

A single run is enough for the burn rate. The actor derives daily burn, days of budget left, and payout per creator from the budget, the spend, and the listing date the board already publishes.

#### How it works

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-whop-content-rewards.png)

#### ✨ Why use this scraper?

- The full public directory in one run, about 670 campaigns on 26 Sep 2026, past the ~50 cards the site shows at once.
- Daily burn, days of budget left, and payout per creator are computed on the first run.
- Opportunity score (0-100) ranks reward rate, budget left, competition, and runway together.
- 7-day view momentum and the current top clip come back on every row.
- Filters for CPM, budget left, creator count, runway, platform, category, and payout model. You are charged only for rows that pass.
- `onlyNew` remembers campaigns in your account and charges later runs only for campaigns that were not seen before.

#### 🎯 Use cases

| Who | What they get |
|---|---|
| Clippers and clipping agencies | Campaigns with a real burn rate, budget still left, and few creators |
| Brands running a campaign | CPM, budget, and burn compared with the rest of the live board |
| Analysts | A dated feed of launches, spend, and 7-day view momentum |
| Scheduled monitors | `onlyNew` plus a webhook, so a quiet hour costs the start fee and nothing else |

#### 📥 Supported inputs

| Input | Example |
|---|---|
| Full board | Leave Start URLs empty, or paste `https://contentrewards.com/discover` |
| One campaign | `https://contentrewards.com/discover/{campaign-id}` or the raw campaign id |
| Whop campaign URL | A `whop.com` URL that contains the campaign id |

Not supported: logged-in creator balances, submission upload, or anything behind a Whop login. The actor reads the public board only.

#### 🔄 How it works

1. Page the public discover API (50 campaigns per page) until the board ends, or fetch the campaign ids you pasted.
2. Convert cents to dollars and attach the listing date, platforms, payout rates, creator count, and view chart.
3. Compute burn, days left, payout per creator, views still payable, effective CPM, 7-day momentum, and the opportunity score.
4. Apply your filters and sort.
5. If `onlyNew` or `trackTrends` is on, compare with the snapshot in the named store `whop-cr-seen-campaigns`.
6. Push one dataset row per returned campaign.

#### ⚙️ Input parameters

| Field | Default | What it does |
|---|---|---|
| `startUrls` | discover URL | Full board, or specific campaign URLs / ids |
| `status` | `active` | `active` or `all`. The public board currently returns active campaigns |
| `contentTags` | empty | `clipping`, `ugc` (ugc includes face and faceless) |
| `categories` | empty | Category name or id, such as `Gaming` or `personal-brand` |
| `platforms` | empty | `tiktok`, `instagram`, `youtube`, `x`, `facebook` |
| `payoutModels` | empty | `cpm`, `retainer`, `per-post` |
| `searchText` | empty | Match against title, brand, and description |
| `minRewardPerThousand` | unset | Minimum dollars per 1,000 views |
| `minBudgetLeftUsd` | unset | Minimum unspent budget |
| `maxProgressPercentage` | unset | Skip campaigns spent past this percent |
| `maxCreators` | unset | Competition cap. Rows with no creator count are dropped |
| `minPayoutPerCreatorUsd` | unset | Minimum budget spent divided by creators |
| `minEstimatedDaysLeft` | unset | Minimum runway at the current burn |
| `minOpportunityScore` | unset | Minimum 0-100 score |
| `sortBy` | `budgetLeft` | `opportunity`, `reward`, `payoutPerCreator`, `burn`, `daysLeft`, `fewestCreators`, `newest`, `progress` |
| `maxAgeDays` | unset | Only campaigns listed within this many days |
| `listedAfter` | unset | ISO date. Keeps `listedAt` on or after that date |
| `onlyNew` | `false` | Later runs return only campaigns missing from the saved snapshot |
| `trackTrends` | `false` | Adds change fields against the previous run |
| `maxItems` | `1000` | Cap on returned rows |
| `proxy` | Apify datacenter | Switch the group to `RESIDENTIAL` if a run comes back empty |

#### 📊 Output overview

One dataset item per campaign. Money fields are US dollars. `budgetSpentUsd` is the board's spent figure, which can include amounts not yet paid. `paidOutUsd` is what creators have actually been paid, and `effectiveRewardPerThousandViews` is that payout divided by views. A headline CPM of $2 with an effective rate near $0 means most views are still pending or rejected.

`opportunityScore` is 35% reward rate (full marks at $5 per 1,000 views), 25% budget left (full marks at $25,000), 25% low competition (100 creators is about half marks; a campaign that has paid nobody is capped at half of that slice), and 15% runway (full marks from 3 to 60 days). Missing reward or budget produces a null score.

`budgetPace` is `draining` under 3 days, `healthy` from 3 to 60, `slow` from 60 to 180, and `stalled` when the budget is barely moving or nothing has been spent.

#### 📦 Output sample

Real row from a run on 26 Sep 2026. `paidOutUsd` is 0 because the board had recorded spend that was not yet paid out.

```json
{
  "id": "1515b3a8-fec1-43e2-ac52-2bfd4c84d524",
  "title": "Total War: WARHAMMER III - Lord of the End Times ",
  "brand": "Clipping Culture",
  "status": "active",
  "payoutModel": "cpm",
  "category": "Entertainment",
  "platforms": ["instagram", "tiktok", "youtube"],
  "rewardPerThousandViews": 2,
  "totalBudgetUsd": 27200,
  "budgetSpentUsd": 5569.36,
  "budgetLeftUsd": 21630.64,
  "progressPercentage": 20.47,
  "dailyBurnUsd": 3712.91,
  "estimatedDaysLeft": 5.83,
  "budgetPace": "healthy",
  "payoutPerCreatorUsd": 1392.34,
  "creators": 4,
  "viewsPerCreator": 859266.8,
  "opportunityScore": 74.9,
  "paidOutUsd": 0,
  "effectiveRewardPerThousandViews": 0,
  "viewsLast7d": 3437067,
  "momentum": "accelerating",
  "ageDays": 1.5,
  "listedAt": "2026-09-24T17:08:11.000Z",
  "topClipUrl": "https://www.instagram.com/reel/DduKOvizh19/?stkn=MW14a2hzdzFhNTdsbA==",
  "topClipPlatform": "instagram",
  "campaignUrl": "https://contentrewards.com/discover/1515b3a8-fec1-43e2-ac52-2bfd4c84d524",
  "description": "Highlight the new legendary lords and the apocalyptic setting featured in the Total War: WARHAMMER III - Lord of the End Times DLC."
}
```

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| Identity | `id`, `title`, `brand`, `status`, `payoutModel`, `category`, `platforms`, `campaignUrl`, `whopUrl` |
| Money | `rewardPerThousandViews`, `totalBudgetUsd`, `budgetSpentUsd`, `budgetLeftUsd`, `paidOutUsd`, `progressPercentage` |
| Burn | `ageDays`, `dailyBurnUsd`, `estimatedDaysLeft`, `budgetPace`, `payoutPerCreatorUsd`, `viewsPerCreator`, `estimatedViewsRemaining` |
| Proof | `opportunityScore`, `effectiveRewardPerThousandViews`, `approvedSubmissions`, `viewsLast7d`, `viewsTrend7dPct`, `momentum` |
| Winners | `topEarnerUsername`, `topEarnerUsd`, `topClipUrl`, `topClipViews`, `topClipPlatform`, `topClipUsername` |
| Rates | `payouts[]`, `rateTiktokUsd`, `rateInstagramUsd`, `rateYoutubeUsd`, `rateXUsd`, `rateFacebookUsd` |
| Trends (`trackTrends`) | `budgetLeftChangeUsd`, `observedBurnUsdPerDay`, `burnAcceleration`, `creatorsChange`, `hoursSinceLastRun`, `trendSignal` |

`trendSignal` is `accelerating` when observed burn is at least 1.5 times the lifetime burn, `slowing` when it is half or less, `crowding` when creators joined and the budget did not move, `stalled` when the budget did not move, and `steady` otherwise. The first run is `trendStatus: "baseline"`.

#### ❓ FAQ

**Do I need two runs to get the burn rate?**
No. `dailyBurnUsd`, `estimatedDaysLeft`, and `payoutPerCreatorUsd` come from the listing date and the spend on that same run. `trackTrends` is the optional second-run comparison.

**Why is `estimatedDaysLeft` null?**
Nothing has been spent yet, so the burn rate is unknown.

**Why is `paidOutUsd` zero when `budgetSpentUsd` is not?**
The board splits "spent" from "paid out". Effective CPM uses paid out. A wide gap means views are still pending or were rejected.

**Why is the opportunity score null?**
The campaign has no reward rate or no budget. The actor leaves the score null.

**What does `onlyNew` charge?**
The first run returns the current filtered board and stores every campaign it saw. Later runs return only new ids. A run with no new campaigns pushes no rows.

**The run said the site is unavailable.**
The public board returned a server error after several retries. Wait 10 to 30 minutes and run again. Campaigns already collected in that run are kept if a later page fails.

#### 💬 Support

Open a ticket on the [Issues tab](https://apify.com/memo23/whop-content-rewards-scraper/issues) with the run id and the input you used.

#### 🛠 Additional services

Need a schedule, a Slack or webhook push, or the same burn-rate fields on another clipping board? Say what the row should contain.

#### 🔎 Explore more scrapers

- [Whop Leaderboards Scraper](https://apify.com/memo23/whop-leaderboards-scraper) for Whop discover products, plans, reviews, and leaderboard rank. That actor does not cover Content Rewards campaigns.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Whop, Content Rewards, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only the public campaign directory. It does not log in, and it does not read private creator accounts. Users are responsible for making sure their use complies with Whop's and Content Rewards' terms, applicable data-protection law, and their own contracts.

***

### SEO Keywords

whop content rewards scraper, scrape whop content rewards, whop clipping campaigns, content rewards api, whop cpm scraper, clipping campaign finder, whop budget scraper, content rewards burn rate, whop creator campaigns, ugc campaign scraper, whop campaign dataset, clipping agency data, whop reward per 1k views, contentrewards.com scraper, apify whop content rewards, whop campaign monitor, creator economy dataset, whop payout scraper

# Actor input Schema

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

Optional. A discover URL (https://contentrewards.com/discover) scrapes the full board. A campaign URL or campaign id scrapes that campaign only. Leave empty to scrape the full board.

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

active keeps campaigns the board marks as active. all keeps every status the board returns. The public board currently lists active campaigns.

## `contentTags` (type: `array`):

Only campaigns tagged with at least one of these. Use clipping or ugc. ugc covers ugc-with-face and ugc-faceless. Leave empty for every tag.

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

Match the category name or id, for example Gaming, Music, personal-brand, Finance. Leave empty for every category.

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

Only campaigns that accept at least one of these: tiktok, instagram, youtube, x, facebook. Leave empty for every platform.

## `payoutModels` (type: `array`):

Only these payout models: cpm, retainer, per-post. Leave empty for every model.

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

Case-insensitive match against the campaign title, brand, and description. Example: poker.

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

Only campaigns paying at least this many dollars per 1,000 views. Example: 2.

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

Only campaigns with at least this much unspent budget. Example: 5000.

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

Skip campaigns whose budget is already spent past this percent. Example: 80.

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

Only campaigns with at most this many creators. Campaigns that do not report a creator count are excluded.

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

Only campaigns where budget spent divided by creators is at least this many dollars.

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

Only campaigns whose remaining budget lasts at least this many days at the current burn rate.

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

Composite of reward rate (35%), budget left (25%), low competition (25%), and runway (15%).

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

Order of the dataset. You are charged only for rows that are returned.

## `maxAgeDays` (type: `integer`):

Only campaigns listed at most this many days ago.

## `listedAfter` (type: `string`):

ISO date, for example 2026-09-01. Keeps campaigns whose listedAt is on or after this date.

## `onlyNew` (type: `boolean`):

Remember campaigns in the named key-value store whop-cr-seen-campaigns. The first run returns the current board. Later runs return, and charge for, only campaigns that were not in that store.

## `trackTrends` (type: `boolean`):

Compare each campaign with the snapshot saved by the previous run and add budgetLeftChangeUsd, observedBurnUsdPerDay, burnAcceleration, creatorsChange, and trendSignal.

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

Upper limit of campaigns to return. You are only charged for returned rows.

## `proxy` (type: `object`):

Datacenter proxy is enough for the public board API. Switch to RESIDENTIAL if a run returns no campaigns.

## Actor input object example

```json
{
  "startUrls": [
    "https://contentrewards.com/discover"
  ],
  "status": "active",
  "contentTags": [],
  "categories": [],
  "platforms": [],
  "payoutModels": [],
  "sortBy": "budgetLeft",
  "onlyNew": false,
  "trackTrends": false,
  "maxItems": 1000,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `campaigns` (type: `string`):

One row per Content Rewards campaign, with burn rate, days of budget left, payout per creator, and opportunity score.

# 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 = {
    "startUrls": [
        "https://contentrewards.com/discover"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = { "startUrls": ["https://contentrewards.com/discover"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "startUrls": [
    "https://contentrewards.com/discover"
  ]
}' |
apify call memo23/whop-content-rewards-scraper --silent --output-dataset

```

## MCP server setup

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