# Casino bonus checker (`cleanscrape/casino-bonus-checker`) Actor

See the casino bonus each affiliate and review site shows for your brands: offer, wagering, promo code, 18+ and safer-gambling notices, and the affiliate ID behind the link. Choose from eight countries. No login. $8 per 1,000 pages. Maintained by CleanScrape.

- **URL**: https://apify.com/cleanscrape/casino-bonus-checker.md
- **Developed by:** [CleanScrape](https://apify.com/cleanscrape) (community)
- **Categories:** Marketing, SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.40 / 1,000 pages

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?

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

## Casino bonus checker

See which bonus each affiliate and review site shows for your casino brands. The Actor searches Google in the United States, the United Kingdom and Canada (or the countries you choose), reads each page from a connection in that country, and saves one row per page with:

- **The offer:** the main bonus as the page shows it ("100% up to £100 + 50 free spins"), match percent, bonus amount, currency, free spins, no-deposit flag, qualifying deposit or stake, wagering, minimum deposit, promo code, product (casino, sports or poker) and the other offers on the page.
- **Notices and wording:** age notice (18+, 19+, 21+), safer-gambling links and helplines (BeGambleAware, GamCare, 1-800-GAMBLER, ConnexOntario and others), whether terms sit next to the offer, an ad or affiliate disclosure, and wording such as "risk-free" or "free money".
- **The casino link:** the link the page sends visitors through, the affiliate system (Income Access, NetRefer, AppsFlyer, Impact, Cellxpert, MyAffiliates, Partnerize and others), the affiliate ID, how many redirects and where it lands.
- **Compared with your official offer** (optional): whether the page matches it, and what differs ("bonus GBP 500 (official GBP 100)").

A second table gives a summary per brand and country: the offers shown and on how many pages, pages missing notices, the affiliate systems and IDs seen, and the promo codes. No login.

**$8 per 1,000 saved pages** (10 to 20% less on paid Apify plans). By default, only pages that show an offer are saved and billed. If **Include pages without an offer** is on, those saved pages use the same page price. Unreadable pages, skipped pages and brand summaries are free. Maintained by CleanScrape.

### Watch the walkthrough

Let's use one brand in the United Kingdom as an example: which affiliate and review pages show its offer, and whether each page carries an age notice, safer-gambling links and terms next to the offer. The video names no casino; use your own brand.

https://www.youtube.com/watch?v=e8HLxSPI0T8

### Who uses it

- **Casino marketing and affiliate managers:** find affiliates still showing last month's offer, a wrong promo code or a bonus that is not yours.
- **Compliance teams:** pages promoting your brand without an age notice, a safer-gambling link or terms next to the offer, and pages using "risk-free" wording.
- **Affiliate program managers:** which affiliate IDs and networks send traffic from which sites, and links that land somewhere other than your site.
- **Competitor research:** the bonuses rival casinos run in each country and how widely affiliates promote them.
- **Researchers and journalists:** how casino bonuses are advertised in each market.

### Quick start

1. Type your brands under **Casino brands**: names as players search for them (`888casino`, `BetMGM Casino`, `Sky Vegas`) or the casino's website.
2. Pick **Countries**. The form starts with the United Kingdom. API requests that omit this field check the United States, the United Kingdom and Canada.
3. Optional: add the offers you run now under **Official offers**, such as `888casino UK: 100% up to £100 + 50 free spins`. Pages showing other numbers are marked. Only offers for the same product are compared: a poker or sports offer on the page is noted, not counted as different from a casino offer.
4. Click **Start**.

The Offers view shows the main offer per page. The Notices and wording view shows the age notice, safer-gambling links and terms. The Affiliate links view shows where each casino link goes. The Brands table has the summary per brand and country.

Input for the API or a scheduled task:

```json
{
  "brands": ["888casino", "Sky Vegas"],
  "countries": ["gb", "ca"],
  "officialOffers": ["888casino UK: 100% up to £100 + 50 free spins", "Sky Vegas: 100 free spins"],
  "maxPagesPerBrand": 30,
  "watchName": "UK affiliate offers"
}
```

### Choose a ready-to-run example

Each example opens with its input filled in. Change it and run.

| Example | What it does |
| --- | --- |
| [Check casino affiliate pages for 18+ notices](https://apify.com/cleanscrape/casino-bonus-checker/examples/uk-casino-affiliate-compliance-check) | Pages promoting 888casino and Sky Vegas in Google UK, with their age notice, safer-gambling links, terms next to the offer and risky wording. |
| [Compare affiliate bonuses with your official offer](https://apify.com/cleanscrape/casino-bonus-checker/examples/casino-bonus-vs-official-offer) | Type the offer you run now and see which pages show other numbers, an old bonus or another promo code. |
| [Find the affiliate IDs promoting a US online casino](https://apify.com/cleanscrape/casino-bonus-checker/examples/us-casino-affiliate-ids-and-links) | Each page's casino link followed to the affiliate system, the affiliate ID and where it lands, for BetMGM Casino and DraftKings Casino. |

### Use it from the API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("cleanscrape/casino-bonus-checker").call(run_input={
    "brands": ["888casino"],
    "countries": ["gb"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["site"], item["mainOffer"], item["promoCode"], item["ageNotice"], item["affiliateId"])

## The summary per brand and country is in its own dataset:
brands = client.dataset(run["storageIds"]["datasets"]["brands"]).list_items().items
```

### What you get

#### Pages (main table)

One row per page, brand and country.

| Field | Example |
| --- | --- |
| brand, country, countryName | `Fanatics Casino`, `gb`, United Kingdom |
| foundBy, googleRank | `Google: Fanatics Casino bonus code`, 6 |
| pageUrl, site, siteType, pageTitle | https://www.actionnetwork.com/casino/fanatics-casino, `actionnetwork.com`, `review or news site` |
| mainOffer, mainOfferText, offerFoundIn | `1,000 free spins`, "Get Up to 1,000 Bonus Spins (October 2026)", `page title` |
| product, matchPercent, maxBonus, currency, freeSpins | `casino`, null, null, `$`, 1000 |
| goldCoins, sweepsCoins | US sweepstakes casinos: `250000`, `25` (coins, not money) |
| noDeposit, qualifyingAmount, wagering, minDeposit, promoCode | false, null, null, null, `ACTION26` |
| otherOffers | `["1,500 free spins", "$1,000 + 1,000 free spins"]` |
| officialOffer, matchesOfficialOffer, differencesFromOfficial | with official offers given |
| ageNotice, saferGamblingLinks | `21+`, `["1-800-GAMBLER", "NCPG", "Gamblers Anonymous"]` |
| builtWithJavaScript | true when most of the page is built with JavaScript (some casinos' own sites build their footer that way), so a notice missing from the text may still be shown to visitors |
| termsNearOffer, adDisclosure, riskyWording | true, true, `[]` |
| casinoLink, affiliateNetwork, affiliateId | the page's link, `AppsFlyer`, `bettercol6o_int` |
| landingPage, landingSite, landsOnCasinoSite, redirects | https://betfanatics.com/casino?..., `betfanatics.com`, true, 2 |
| readFrom, checkedAt, notes | `United Kingdom`, time of the check, plain-language notes |

`siteType` is one of: casino site, casino help page, review or news site, site using the brand name (an address with the brand in it that is not the casino's own), forum or reviews, social media, app store, help page.

`notes` lists things worth a look in plain words, such as "No age notice (18+, 19+ or 21+) found on the page.", "Offer differs from the official one: bonus GBP 500 (official GBP 100).", "High wagering: 60x." or "The casino link leads to another-site.com, not the casino's own site."

With a **Watch name**, each row also has `isNew`, `firstSeenAt`, `offerChanged` and `previousOffer`.

#### Brands

One row per brand and country: pages naming the brand, pages with an offer, the most common offer and every offer with its page count, pages matching or differing from the official offer, pages without an age notice, without a safer-gambling link or without terms next to the offer, pages with risky wording, pages saying the casino is not available there, the affiliate systems and IDs seen, the promo codes and the number of sites.

### How offers are found

1. Google is searched in each country with `{brand} bonus`, `{brand} bonus code` and `{brand} free spins` (change these under **Google searches per brand**), and your own pages are added.
2. Each page is read from a connection in the country it is checked for, because many sites show other offers to visitors from elsewhere: in our tests, one page in eight showed a different offer to a UK or Canadian visitor than to a US one.
3. The offer is read from the page structure: the title and main heading, offer cards and comparison tables, promo-code boxes and text next to the brand name. In a table that lists several casinos, an offer counts for your brand only when it sits in your brand's row.
4. Amounts that are not the bonus are left out: the deposit or stake needed to qualify ("Bet $10, get $30"), minimum deposits, the value of one spin, maximum wins and withdrawals, and calculator estimates.
5. The page's casino link is followed through its redirects to name the affiliate system and ID and where it lands.

Brands that are ordinary words (`Stake`, `Spin Casino`, `Sky Vegas`) are matched only when written as a name, so "your stake" or "free spin casino bonuses" do not count.

Accuracy, checked by hand on 100 pages (US, UK and Canada): the main offer was exactly right on 86 to 88% of offer pages and right or acceptable (a correct offer, not the headline one) on all of them. Every promo code in the check belonged to the brand's offer.

### Monitoring offers over time

Give the run a **Watch name** (for example `UK affiliate offers`) and schedule it daily or weekly. Each row then shows whether the page is new since earlier runs with that name (`isNew`), whether its offer changed (`offerChanged`) and what it showed before (`previousOffer`). The **Watch (new and changed)** view puts these first. The history stays in your Apify account for 180 days.

### What is not available

- **Pages behind bot checks.** Some sites refuse automated visits (bet365.com, oddschecker.com, casino.org and some bookmakers' own promotion pages often do). The Actor does not get around these checks. Such pages are listed in the run report with the reason and are not charged. Expect one page in five to two in five to be unreadable, more when many bookmakers' own sites are in the results.
- **Offers shown only after login** or only inside the casino's app.
- **Legal judgments.** The rows say what a page shows and what is missing from it. Whether that breaks a rule depends on the country, the state or province and who the page targets.
- **Offers in images or behind JavaScript.** An offer that exists only as a banner image without text is not read. A page that shows its content only after JavaScript runs is listed in the run report as such. A page that builds most of its content with JavaScript is marked `builtWithJavaScript`, and is not counted as missing a notice in the Brands table.
- **Pages a site refuses to show in a country.** A site that blocks visitors from the country checked (HTTP 451) is reported as such and is not read from another country, since it would show what visitors there cannot see.
- **Files and broken pages.** PDFs and other files, pages that redirect in a loop, and servers that do not answer within about 50 seconds are listed in the run report with the reason, and are not charged.
- Supported countries are the United States, United Kingdom, Canada, Ireland, Australia, New Zealand, South Africa and India; other countries are not supported.

### Pricing

| Event | Price |
| --- | --- |
| Saved page, including a page without an offer when you choose to save it | $0.008 |
| Skipped page without an offer; unreadable page | free |
| Brand summary row | free |

Measured on 18 October 2026:

- **1 brand in the UK** (the input filled in when you open the Actor): 14 pages with an offer, about **$0.11**, in 1 to 2 minutes.
- **8 brands in 3 countries**, 12 pages each: 142 pages, about **$1.14**, in under 7 minutes.
- **8 brands in 2 countries**, 40 pages each: 208 pages, about **$1.66**, in about 5 minutes.

Set **Maximum cost per run** to cap spending. The run stops before it would go over the limit and keeps what it saved.

### Speed and settings

A brand in one country takes 1 to 2 minutes. Eight brands in three countries take about 7 minutes. Google searches take from a few seconds up to a minute each, so most of the time goes to searching. The run stops cleanly before its timeout and keeps everything it saved. With a very short timeout (about a minute), nothing can be saved: the run then ends with a clear message and nothing is charged. Memory: 1024 MB (512 MB also works and reads fewer pages at once). Up to 25 brands per run.

### Run report

Each run saves a readable summary (Output tab > Run summary) and the same as JSON (`SUMMARY`): the searches, pages read, pages without an offer, the sites that could not be read and why, and notes such as Google searches skipped to stay within the time limit.

### Use it from an AI agent

This Actor works as a tool in Claude, Cursor and other AI assistants that support MCP, through Apify's MCP server. Add this server and sign in with your Apify account when asked:

```
https://mcp.apify.com?tools=cleanscrape/casino-bonus-checker
```

Then ask in plain words, for example: "Which UK sites show an 888casino bonus that differs from 100% up to £100, and which of them have no 18+ notice?" The price per result is the same as in Console.

### Common questions

#### Does it use my own affiliate links or change any page?

No. It only reads public pages, the same ones a player sees in Google, and follows the links on them to see where they land. It does not sign up, deposit or place bets.

#### Can I check pages I already know?

Yes. Paste them under **Pages to check**. To check only those pages, turn off **Search Google**.

#### Why does the same site show different offers in different countries?

Many affiliate sites change the offer by the visitor's country. Each page is read from a connection in the country you check, so the row shows what a player there sees (`readFrom`). If no connection in that country answers, the page is read from elsewhere and the row says so in `notes`.

#### How do I export the results to Excel or CSV?

Open the run's Output or Storage tab and click Export. Pick Excel, CSV or JSON. The Brands table exports from Storage > Dataset.

#### Is it legal to scrape these pages?

The Actor reads public pages that anyone can open without an account, at a gentle pace, and it does not get around bot checks. Check the rules that apply to how you use the data. Gambling advertising is regulated in many countries: the data shows what pages publish, and how you act on it is up to you.

### More tools from CleanScrape

- [Kick Sponsor Tracker](https://apify.com/cleanscrape/kick-sponsor-tracker): which Kick streamers promote which brands, with codes and broadcast hours
- [Whatnot Scraper](https://apify.com/cleanscrape/whatnot-scraper): Whatnot listings with prices and seller stats, and live shows
- [Whatnot Seller Tracker](https://apify.com/cleanscrape/whatnot-seller-tracker): top sellers per category, items sold, sales per day and followers over time
- [TikTok Shop Product Scraper](https://apify.com/cleanscrape/tiktok-shop-product-scraper): US TikTok Shop prices, sellers and ratings
- [Bilibili Scraper](https://apify.com/cleanscrape/bilibili-scraper): Bilibili videos, danmaku, comments and creators
- [App Store & Google Play Reviews Scraper](https://apify.com/cleanscrape/app-store-reviews-scraper): reviews from both app stores in one table
- [Google Trends Scraper API](https://apify.com/cleanscrape/google-trends-scraper): search interest over time, by region, related queries and trending searches
- [Map Your Show Exhibitor Scraper API](https://apify.com/cleanscrape/event-exhibitor-monitor): trade show exhibitor lists and booth changes
- [Shopify Product Reviews Scraper API](https://apify.com/cleanscrape/shopify-reviews-scraper): Judge.me and Okendo reviews from Shopify product links
- [Google News Scraper API](https://apify.com/cleanscrape/google-news-scraper): headlines from Google News and publisher feeds
- [Google Jobs Scraper](https://apify.com/cleanscrape/google-jobs-scraper): job listings with salaries and apply links
- [Pinterest Scraper API](https://apify.com/cleanscrape/pinterest-scraper): keyword search, public pin links and board previews; search results may lack a pin link
- [Google Hotels Scraper API](https://apify.com/cleanscrape/google-hotels-scraper): hotel prices and booking offers for your dates
- [Threads Scraper API](https://apify.com/cleanscrape/threads-scraper): public Threads posts from accounts or post links
- [Likee Scraper API](https://apify.com/cleanscrape/likee-scraper): Likee videos and comments
- [Flashscore Tennis Scraper API](https://apify.com/cleanscrape/tennis-match-data): tennis results, statistics, point-by-point and head-to-head

### Support

Questions, a page read wrongly or a site that is missing: open an issue on the Actor's Issues tab or write to contact.cleanscrape@gmail.com.

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by any casino, affiliate site or affiliate network named here.

#### Checking links without Google search

If you already have the pages, add them under **Pages to check** and turn off **Search Google**. This mode reads those pages without using the Google search allowance. Page connections still need available Apify Proxy access. Blocked pages are listed in the run report, not replaced with guessed offers.

# Actor input Schema

## `brands` (type: `array`):

Names as players search for them (888casino, BetMGM Casino, Sky Vegas) or the casino's website (888casino.com). One per line; up to 25.

## `countries` (type: `array`):

Google is searched in each country and each page is read from a connection in that country, because many sites show other offers to visitors from elsewhere. Default: United States, United Kingdom, Canada.

## `officialOffers` (type: `array`):

The offer each casino runs now, to compare pages against: "888casino: 100% up to £100 + 50 free spins". For one country only, add it after the name: "888casino UK: 100% up to £100". Pages showing other numbers are marked.

## `searchPhrases` (type: `array`):

{brand} is replaced by each brand name. Each phrase is one Google search per brand and country (up to 10 results each). Default: "{brand} bonus", "{brand} bonus code", "{brand} free spins".

## `maxPagesPerBrand` (type: `integer`):

Most pages to check per brand in each country, best Google ranks first (several searches find many of the same pages).

## `pageUrls` (type: `array`):

Affiliate or review pages you already know. Each is checked for every brand in every country, as well as the Google results.

## `searchGoogle` (type: `boolean`):

Turn off to check only the pages you listed.

## `includePagesWithoutOffer` (type: `boolean`):

Also save pages that name the brand but show no offer (help pages, news, forums). Off by default: you pay only for pages that show an offer.

## `followAffiliateLinks` (type: `boolean`):

Follow each page's link to the casino to name the affiliate system, the affiliate ID and where it lands.

## `watchName` (type: `string`):

Give repeated runs the same name to mark pages that are new and offers that changed since the last run. The history stays in your Apify account for 180 days.

## `readFromCountry` (type: `boolean`):

Read UK, Canadian and other pages through a connection in that country (residential proxy, included in the price). Turn off only to compare: pages are then read from the United States and may show other offers.

## Actor input object example

```json
{
  "brands": [
    "888casino",
    "Sky Vegas"
  ],
  "countries": [
    "gb"
  ],
  "officialOffers": [
    "888casino UK: 100% up to £100",
    "BetMGM Casino US: 100% up to $1,000 + $25 on the house"
  ],
  "searchPhrases": [
    "{brand} bonus",
    "{brand} bonus code",
    "{brand} free spins"
  ],
  "maxPagesPerBrand": 30,
  "searchGoogle": true,
  "includePagesWithoutOffer": false,
  "followAffiliateLinks": true,
  "readFromCountry": true
}
```

# Actor output Schema

## `offers` (type: `string`):

No description

## `notices` (type: `string`):

No description

## `links` (type: `string`):

No description

## `watch` (type: `string`):

No description

## `brands` (type: `string`):

No description

## `report` (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 = {
    "brands": [
        "888casino"
    ],
    "countries": [
        "gb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanscrape/casino-bonus-checker").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 = {
    "brands": ["888casino"],
    "countries": ["gb"],
}

# Run the Actor and wait for it to finish
run = client.actor("cleanscrape/casino-bonus-checker").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 '{
  "brands": [
    "888casino"
  ],
  "countries": [
    "gb"
  ]
}' |
apify call cleanscrape/casino-bonus-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanscrape/casino-bonus-checker"
        }
    }
}
```

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/8e4BTNnvwCeXmGznA/builds/DHccrbaAEE9aPfKkb/openapi.json
