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

Scrape every clipping and UGC campaign on Whop Content Rewards: CPM and payout limits per platform, budget left and spend pace, creators, views in the last 7 days, categories, requirements. Find clipping jobs that still pay. Monitor mode. Export to JSON, CSV or Excel, or via API.

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

## Pricing

$1.00 / 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

Scrape **every clipping and UGC campaign** of **[Whop Content Rewards](https://contentrewards.com/c/discover/clipping)**, the
marketplace where brands, artists and streamers pay creators per view. One row per campaign with the **pay per 1,000 views**
and the **minimum and maximum payout per platform**, the **budget, budget spent and budget left**, how fast it is being spent,
**creators and approved clips**, **views in the last 7 and 30 days**, **platforms**, **categories**, and the **rules and
requirements** the brand shows publicly.

The whole directory, not a page of it: about **475 listed campaigns** in one run, plus **~230 running campaigns the directory
does not show** if you ask for them. No login, no browser, no proxy. Pay only for the campaigns you get.

### What you can do with it

- **Clippers**: find campaigns that still have money to pay, pay well per view and are not crowded yet — sort by pay or
  budget left, keep campaigns with few creators, skip the ones that need an application.
- **Clipping agencies**: pull the whole board on a schedule and route campaigns to your editors by platform and category.
- **New-campaign alerts**: schedule it hourly with **Only new campaigns** and **Max campaigns** `0`: the first run takes the
  whole board, every later run only the campaigns no earlier run delivered.
- **Brands and agencies running campaigns**: benchmark CPMs, budgets, payout caps and spend pace in your category before you
  fund your own.
- **Analysts**: the creator-economy gig board as a dataset — budgets, burn rates and views per campaign over time.

### Input

| Field | What it does |
|---|---|
| **Campaign types** | Clipping, UGC, or both (the two tabs of the directory). |
| **Include campaigns the directory does not show** | Also the running campaigns that have a public page but are not in the directory (mostly older ones). |
| **Campaign links** | Read only these campaigns (`https://contentrewards.com/c/campaigns/<id>` or the id). |
| **Platforms** | TikTok, Instagram, YouTube, X, Facebook: campaigns paying for at least one. |
| **Payout types** | CPM (per 1,000 views), per post (flat fee), pool. |
| **Minimum pay per 1,000 views** | In US$, e.g. `2`. |
| **Minimum budget left** | In US$, e.g. `1000`. |
| **Maximum budget spent (%)** | e.g. `80` to skip nearly exhausted campaigns. |
| **Maximum creators** | e.g. `50` for less competition, `0` for campaigns nobody joined yet. |
| **Verified brands only**, **Open to join only** | Brands Content Rewards verified; campaigns with no application. |
| **Categories** | Main category: `Gaming`, `Music`, `Personal Brand`, `Entertainment`, `Finance`, `Streamer`… |
| **Search text** | In the title, brand or description. |
| **Order** | As the directory lists them, newest, highest pay per 1,000 views, most budget left, fewest creators. |
| **Max campaigns** | 100 by default; 0 for all. |
| **Only new campaigns since the last run** | Monitor mode: campaigns delivered before are skipped, not opened and not charged. |

Example — Gaming campaigns paying at least US$1.50 per 1,000 views with US$500 left, best-paying first:

```json
{
    "categories": ["Gaming"],
    "minRatePer1kUsd": 1.5,
    "minBudgetLeftUsd": 500,
    "sortBy": "highestRate",
    "maxCampaigns": 50
}
```

### Output

One row per campaign (shortened):

```json
{
    "status": "ok",
    "campaignId": "33788a7c-1680-49f3-9af2-61c68064b749",
    "url": "https://contentrewards.com/c/campaigns/33788a7c-1680-49f3-9af2-61c68064b749",
    "title": "Mary Kutter - Damn I Love You | Multi Edit Camp",
    "description": "Get paid per view to clip Mary Kutter’s “Damn I Love You” on TikTok + IG. Earn $1 per 1K views…",
    "brand": "Artist Influence",
    "brandVerified": true,
    "campaignStatus": "active",
    "payoutType": "cpm",
    "platforms": ["instagram", "tiktok"],
    "ratePer1kViewsMinUsd": 1,
    "ratePer1kViewsMaxUsd": 1,
    "payouts": [
        { "platform": "tiktok", "payoutType": "cpm", "ratePer1kViewsUsd": 1, "minPayoutUsd": 1, "maxPayoutUsd": 125, "amountPerPostUsd": null, "budgetUsd": 625, "budgetSpentUsd": 13.69 },
        { "platform": "instagram", "payoutType": "cpm", "ratePer1kViewsUsd": 1, "minPayoutUsd": 1, "maxPayoutUsd": 125, "amountPerPostUsd": null, "budgetUsd": 625, "budgetSpentUsd": 607.98 }
    ],
    "budgetUsd": 1250,
    "budgetSpentUsd": 621.67,
    "budgetLeftUsd": 628.33,
    "budgetSpentPercent": 49.73,
    "paidOutUsd": 0,
    "averageSpendPerDayUsd": 63.51,
    "estimatedDaysLeft": 9.9,
    "creators": 24,
    "approvedSubmissions": 37,
    "totalViews": 576754,
    "viewsLast7Days": 208162,
    "viewsLast30Days": 576754,
    "approvedSubmissionsLast7Days": 27,
    "category": "Music",
    "categories": ["Music"],
    "contentTypes": ["Clipping", "UGC (With Face)", "UGC (Faceless)", "Sound"],
    "creatorTypes": ["Clipper", "UGC Creator", "Video Editor", "Influencer"],
    "requiresApplication": false,
    "requiresPreApproval": false,
    "requirementsMembersOnly": true,
    "contentRulesCount": 0,
    "creatorRequirementsCount": 1,
    "referenceFilesCount": 1,
    "launchedAt": "2026-10-12T06:03:40.000Z",
    "source": "directory",
    "discoverTabs": ["clipping"],
    "scrapedAt": "2026-10-22T01:00:00.000Z"
}
```

#### Fields

| Field | Meaning |
|---|---|
| `campaignId`, `url`, `title`, `description`, `thumbnail` | The campaign on Content Rewards. |
| `brand`, `brandHandle`, `brandVerified`, `brandLogo` | Who runs it, and whether Content Rewards verified them. |
| `campaignStatus` | `active` for every campaign delivered. |
| `payoutType` | `cpm` (per 1,000 views), `perPost` (flat fee per approved video) or `pool` (a pot split by views when it ends). |
| `platforms` | Where the clips are posted: `tiktok`, `instagram`, `youtube`, `x`, `facebook`. |
| `ratePer1kViewsMinUsd`, `ratePer1kViewsMaxUsd` | Lowest and highest pay per 1,000 views across platforms (`null` when not paid per view). |
| `payouts` | Per platform: rate, minimum and maximum payout per clip, flat fee per post, and the platform's own budget when the campaign splits it. |
| `budgetUsd`, `budgetSpentUsd`, `budgetLeftUsd`, `budgetSpentPercent`, `paidOutUsd` | The budget, what creators have earned from it, what is left, and what has been paid out so far. |
| `averageSpendPerDayUsd`, `estimatedDaysLeft` | Budget spent per day since launch, and how long what is left lasts at that pace (`null` before anything is spent). |
| `creators`, `approvedSubmissions`, `totalViews` | Creators in the campaign, clips approved, views paid on. |
| `viewsLast7Days`, `viewsLast30Days`, `approvedSubmissionsLast7Days` | Recent activity, from the campaign's daily chart: a quiet campaign shows 0. |
| `category`, `categories`, `contentTypes`, `creatorTypes` | Main and other categories; kinds of content and creators wanted. |
| `requiresApplication`, `requiresPreApproval`, `maxSubmissionsPerCreator` | How to get in and how many clips each creator may submit. |
| `requirementsMembersOnly` | Most brands show their rules only to creators who joined: then the text fields are empty and the counts tell how many there are. |
| `guidelines`, `contentRequirements`, `creatorRequirements` | The brief, when the brand shows it publicly. |
| `contentRulesCount`, `creatorRequirementsCount`, `referenceFilesCount` | How many rules, requirements and reference files the campaign has. |
| `groupName` | The campaign group it belongs to, when the brand runs several campaigns as one. |
| `launchedAt`, `listedAt`, `createdAt`, `updatedAt`, `metricsUpdatedAt` | Dates (ISO 8601, UTC). |
| `scrapedAt` | When the Actor read the campaign (ISO 8601, UTC). |
| `source`, `discoverTabs` | `directory` (with the tabs that list it), `unlisted` or `link`. |
| `status`, `reason` | `ok` for a campaign. Free rows say why nothing came: `no_results` (with how many campaigns each filter left out), `not_found`, `ended`, `invalid` or `blocked`. |

The run's **SUMMARY** record counts the campaigns listed, the pages opened and the campaigns each filter left out.

### Limits, honestly

- **Only running campaigns.** Ended campaigns leave the directory; a link to one gives a free `ended` row.
- **Rules that brands keep for members stay hidden.** About 9 in 10 campaigns show their rules, requirements and files only to
  creators who joined: the Actor gives their counts, never their text. Creators' names, clips and earnings are not collected.
- **Unlisted campaigns are slower**: the directory card is what lets the Actor skip a campaign without opening it, so
  campaigns outside the directory are all opened. Each campaign is one page; expect about two a second.
- Views and spend are Content Rewards' own counters; `metricsUpdatedAt` says when it last refreshed them.

### Pricing

**US$0.001 per campaign** (US$1 per 1,000), with every field above included. No start fee. Campaigns your filters leave out,
campaigns already delivered to a monitor, and status rows are free. The whole directory costs about US$0.48. You can cap a
run's cost with Apify's maximum cost per run; the Actor stops cleanly when it is reached.

### Is it legal?

The Actor reads the public pages Content Rewards shows to every visitor without an account: its directory, its campaign pages
and the sitemap it publishes for search engines. It respects contentrewards.com's robots.txt (it never calls the `/api/`
paths the file disallows), sends a few requests a second at most, and never logs in or solves a challenge. It leaves out the
names and clips of individual creators. You are responsible for using the data lawfully.

**This is an unofficial tool. It is not affiliated with, endorsed by or sponsored by Whop or Content Rewards.**

### Issues and requests

Open an issue on the Actor's page: a field you need, a filter, or anything that looks wrong.

# Actor input Schema

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

The tabs of the Content Rewards directory to read: <b>Clipping</b> (clip a creator's or brand's footage) and <b>UGC</b> (make your own videos). A campaign listed in both is delivered once. Empty reads both.

## `includeUnlisted` (type: `boolean`):

Also read the running campaigns that have a public page (they are in the site's sitemap) but that the directory does not list, mostly older ones: about 230 more on top of the ~475 listed. They come after the listed ones and are not sorted or pre-filtered, so every one of their pages is opened.

## `campaignUrls` (type: `array`):

Read only these campaigns, e.g. <code>https://contentrewards.com/c/campaigns/44a3ffcb-d4a1-492b-94a4-704919950246</code> or just the id. When set, the directory is not read; the filters below still apply. A link that is not a campaign, a campaign the site does not have, or one that has ended gets a free row saying so.

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

Keep campaigns that pay for posts on at least one of these platforms. Empty keeps all.

## `payoutTypes` (type: `array`):

<b>CPM</b> pays per 1,000 views (almost every campaign), <b>Per post</b> a flat fee per approved video, <b>Pool</b> splits a fixed pot by views when the campaign ends. Empty keeps all.

## `minRatePer1kUsd` (type: `number`):

Keep campaigns paying at least this many dollars per 1,000 views on at least one platform. Pool and per-post campaigns are left out when this is set.

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

Keep campaigns with at least this much budget not yet spent: the money still there to pay new views.

## `maxBudgetSpentPercent` (type: `integer`):

Keep campaigns that have spent at most this share of their budget, e.g. <code>80</code> to skip nearly exhausted ones.

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

Keep campaigns with at most this many creators already in, for less competition. <code>0</code> finds campaigns nobody has joined yet.

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

Keep campaigns of brands Content Rewards has verified.

## `noApplicationOnly` (type: `boolean`):

Keep campaigns you can join without applying first.

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

Keep campaigns whose main category (the one the directory card shows) is one of these, e.g. <code>Gaming</code>, <code>Music</code>, <code>Personal Brand</code>, <code>Entertainment</code>, <code>Finance</code>, <code>Technology</code>, <code>Streamer</code>. Case and spacing do not matter.

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

Keep campaigns whose title, brand or description contains this text (any case), e.g. <code>roblox</code> or <code>podcast</code>.

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

The order campaigns are read and delivered in. With a maximum, it decides which campaigns you get.

## `maxCampaigns` (type: `integer`):

Stop after this many campaigns. 0 means every campaign that passes the filters.

## `onlyNewCampaigns` (type: `boolean`):

Deliver, and charge, only campaigns that an earlier run with the same types and filters has not delivered; their pages are not even opened. Made for scheduled runs that alert you to new campaigns.

## Actor input object example

```json
{
  "campaignTypes": [
    "clipping",
    "ugc"
  ],
  "includeUnlisted": false,
  "campaignUrls": [],
  "platforms": [],
  "payoutTypes": [],
  "verifiedOnly": false,
  "noApplicationOnly": false,
  "categories": [],
  "sortBy": "site",
  "maxCampaigns": 20,
  "onlyNewCampaigns": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "maxCampaigns": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = { "maxCampaigns": 20 }

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/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 '{
  "maxCampaigns": 20
}' |
apify call steadyscrape/whop-content-rewards-scraper --silent --output-dataset

```

## MCP server setup

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