# Classpass Scraper (`ahmed_jasarevic/classpass-scraper`) Actor

Scrapes fitness class schedules, studio profiles, pricing, and reviews from ClassPass and MindbodyOnline.

- **URL**: https://apify.com/ahmed\_jasarevic/classpass-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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?

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

## Classpass Scraper

Scrapes fitness class schedules, studio profiles, pricing data, and user reviews from **ClassPass** and **MindbodyOnline** — two of the largest fitness marketplace platforms.

### What does Classpass Scraper do?

This actor extracts structured fitness data including:

- **Class schedules**: Class name, instructor, time, duration, difficulty level, spots available
- **Studio profiles**: Name, address, amenities, rating, price range, photos
- **Pricing data**: Class packs, memberships, drop-in rates
- **User reviews**: Ratings, review text, author, date

The scraper supports both ClassPass (Cloudflare-protected) and MindbodyOnline (React SPA) using PlaywrightCrawler with stealth configurations.

### Why use Classpass Scraper?

#### Buyer Personas

- **Fitness studio owners**: Competitor analysis — see what classes competitors offer, their pricing, and customer sentiment
- **Wellness marketplace builders**: Aggregate fitness data for your platform
- **Corporate wellness platforms**: Identify studios and classes for employee benefits
- **Fitness app developers**: Enrich your app with real-time class schedules and studio data
- **Real estate analysts**: Gym density as a neighborhood signal for property valuation

#### Use Cases

- Track competitor pricing and class offerings
- Identify market gaps in fitness class types
- Analyze customer sentiment across studios
- Build fitness class aggregators
- Real estate investment analysis using gym density

### How to use Classpass Scraper

#### Step 1: Configure Input

Set your preferred options in the Input tab:

1. **Data Source**: Choose ClassPass, MindbodyOnline, or both
2. **Location**: Enter a city name (e.g., "New York") or provide latitude/longitude
3. **Scrape Options**: Toggle which data categories to extract
4. **Proxy Configuration**: Enable Apify proxy for reliable scraping (recommended for ClassPass)

#### Step 2: Run the Actor

Click the **Start** button. The actor will:

1. Navigate to search results for your location
2. Extract data from listing pages
3. Follow detail pages for enriched information
4. Output structured data to the dataset

#### Step 3: Export Data

Download your data in JSON, CSV, HTML, or Excel format from the **Dataset** tab.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `source` | select | `both` | Data source: `classpass`, `mindbodyonline`, or `both` |
| `location` | string | `New York` | City or location name |
| `latitude` | number | - | Latitude (overrides location name) |
| `longitude` | number | - | Longitude (overrides location name) |
| `maxItems` | integer | `50` | Maximum items per category (1-500) |
| `scrapeClasses` | boolean | `true` | Extract class schedules |
| `scrapeStudios` | boolean | `true` | Extract studio profiles |
| `scrapePricing` | boolean | `true` | Extract pricing data |
| `scrapeReviews` | boolean | `false` | Extract user reviews |
| `maxConcurrency` | integer | `3` | Parallel browser pages (1-10) |
| `proxyConfiguration` | object | `{useApifyProxy: true}` | Proxy settings |

### Output

The actor outputs data to a dataset with the following structure:

#### Classes

```json
{
    "source": "classpass",
    "className": "Vinyasa Flow",
    "instructor": "Sarah Johnson",
    "startTime": "2026-09-02T10:00:00",
    "duration": "60 min",
    "difficultyLevel": "Intermediate",
    "spotsAvailable": 5,
    "studioName": "Yoga Studio NYC",
    "location": "New York",
    "url": "https://classpass.com/studio/yoga-studio-nyc",
    "scrapedAt": "2026-09-02T09:38:41.000Z"
}
```

#### Studios

```json
{
    "source": "mindbodyonline",
    "studioName": "FitLife Gym",
    "address": "123 Main St, New York, NY 10001",
    "city": "New York",
    "rating": 4.5,
    "reviewCount": 128,
    "priceRange": "$$",
    "amenities": ["Showers", "Lockers", "Parking"],
    "photos": ["https://cdn.example.com/photo1.jpg"],
    "url": "https://www.mindbodyonline.com/fitness/fitlife-gym",
    "scrapedAt": "2026-09-02T09:38:41.000Z"
}
```

#### Pricing

```json
{
    "source": "classpass",
    "studioName": "Cycle Studio",
    "planName": "10 Class Pack",
    "planType": "class_pack",
    "price": 150.00,
    "currency": "USD",
    "credits": 10,
    "validity": "3 months",
    "url": "https://classpass.com/studio/cycle-studio",
    "scrapedAt": "2026-09-02T09:38:41.000Z"
}
```

### Data Table

| Field | Description |
|-------|-------------|
| `source` | Platform: `classpass` or `mindbodyonline` |
| `className` | Name of the fitness class |
| `instructor` | Instructor name |
| `startTime` | Class start time |
| `duration` | Class duration |
| `difficultyLevel` | Beginner/Intermediate/Advanced |
| `spotsAvailable` | Available spots |
| `studioName` | Studio or gym name |
| `address` | Full address |
| `rating` | Average rating (1-5) |
| `priceRange` | Price indicator ($, $$, $$$) |
| `amenities` | Available amenities |
| `photos` | Studio photo URLs |

### Pricing / Cost Estimation

#### Free Tier

- **10 items** maximum per run
- Single data source (ClassPass OR MindbodyOnline)
- Basic proxy (shared datacenter IPs)

#### Paid Plan

- **Unlimited items** per run
- Both data sources simultaneously
- Residential proxy group (`BUYPROXIES94952`)
- Higher concurrency (up to 10 parallel pages)

#### Compute Units

- Each page visit uses ~0.5-1 CU
- Detail pages use ~1 CU
- Typical run (50 items): ~25-50 CU
- Proxy usage included in paid plans

### Tips & Advanced Options

#### Optimizing for Speed

1. Set `maxConcurrency` to 5-10 for faster scraping
2. Disable `scrapeReviews` if not needed (reduces page visits)
3. Use specific `latitude`/`longitude` for precise location targeting

#### Improving Accuracy

1. Use Apify proxy with residential group for ClassPass
2. Increase `maxItems` gradually to avoid rate limiting
3. Monitor the actor log for Cloudflare challenge warnings

#### Cost Control

1. Start with `maxItems: 10` to test
2. Use `source: "classpass"` or `source: "mindbodyonline"` individually
3. Disable unused scrape options (classes, studios, pricing, reviews)

### Technical Details

#### Scraping Strategy

- **ClassPass**: PlaywrightCrawler with stealth headers to bypass Cloudflare Bot Management
- **MindbodyOnline**: PlaywrightCrawler for React SPA rendering
- **Proxy**: Apify proxy with `BUYPROXIES94952` residential group

#### Anti-Bot Protection

ClassPass uses Cloudflare Bot Management which:

- Blocks datacenter IPs
- Requires JavaScript execution
- May present challenges

The actor uses:

- Residential proxy rotation
- Realistic browser headers
- Proper page load waiting
- Error handling for challenge pages

### FAQ

#### Q: Why am I getting fewer results than expected?

A: ClassPass has aggressive anti-bot protection. Ensure you're using:

1. Apify proxy with residential group
2. Reasonable concurrency (3-5)
3. Not scraping from the same location too frequently

#### Q: Can I scrape specific studios?

A: Yes! Provide direct URLs in the `startUrls` input field:

```json
{
    "startUrls": [
        {"url": "https://classpass.com/studio/specific-studio"},
        {"url": "https://www.mindbodyonline.com/fitness/specific-gym"}
    ]
}
```

#### Q: How accurate is the pricing data?

A: Pricing data is extracted from public listings. Some studios may require login to view full pricing. The scraper captures what's publicly available.

### Disclaimers

- This scraper is for educational and research purposes
- Respect the Terms of Service of ClassPass and MindbodyOnline
- Use responsibly and avoid excessive scraping
- Data accuracy depends on the source website's current state
- Some data may require authentication to access

### Support

- Report issues via the Issues tab
- For custom scraping needs, contact for consulting
- Join the Apify community for tips and updates

### Links

- [ClassPass](https://classpass.com)
- [MindbodyOnline](https://www.mindbodyonline.com)
- [Apify Platform](https://apify.com)
- [Crawlee Documentation](https://crawlee.dev)

# Actor input Schema

## `location` (type: `string`):

City or location to search (e.g., 'New York', 'Los Angeles', 'Chicago')

## `latitude` (type: `number`):

Latitude for location-based search (optional, overrides location name)

## `longitude` (type: `number`):

Longitude for location-based search (optional, overrides location name)

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

Maximum number of studio profiles to scrape. Each studio also emits its featured review and classes (subject to their own caps below).

## `maxClasses` (type: `integer`):

Maximum total class records to emit across all studios (0 = no limit).

## `maxReviews` (type: `integer`):

Maximum total review records to emit across all studios (0 = no limit).

## `scrapeClasses` (type: `boolean`):

Extract fitness class schedules (name, instructor, time, duration, difficulty, spots)

## `scrapeStudios` (type: `boolean`):

Extract studio/gym profiles (name, address, amenities, rating, price, photos)

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

Proxy settings for anti-bot protection.

## Actor input object example

```json
{
  "location": "New York",
  "maxItems": 100,
  "maxClasses": 0,
  "maxReviews": 0,
  "scrapeClasses": true,
  "scrapeStudios": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `studios` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `classes` (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 = {
    "location": "New York"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/classpass-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 = { "location": "New York" }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/classpass-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 '{
  "location": "New York"
}' |
apify call ahmed_jasarevic/classpass-scraper --silent --output-dataset

```

## MCP server setup

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