# Meetup Scraper - Events, Groups & Members Data Extractor (`haketa/meetup-scraper`) Actor

Scrape Meetup.com events, groups, organizers, attendees (RSVP counts), venues and topics by keyword, location or URL. Export to JSON, CSV & Excel. No API key needed.

- **URL**: https://apify.com/haketa/meetup-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Social media, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Meetup Scraper – Extract Events, Groups, Members & Venues from Meetup.com

**Meetup Scraper** is a fast, reliable tool to **scrape Meetup.com** at scale – no Meetup API key, no login, no coding required. Search events by keyword and city, or paste any event or group URL, and export clean, structured **Meetup data** to JSON, CSV, Excel, HTML or XML in seconds.

Whether you need **event data** for market research, **group and community data** for lead generation, or **attendee and organizer insights** for sales prospecting, this Meetup data extractor turns the public Meetup.com website into a ready-to-use dataset.

> ⚡ **TL;DR** – Type a keyword + a city (or paste URLs), press **Start**, and download a spreadsheet of Meetup events, groups, organizers, RSVP counts, venues and members.

---

### 🔑 Why use this Meetup Scraper?

Meetup.com is one of the largest platforms for local communities, professional networking, tech meetups, hobby groups and live events worldwide. That data is incredibly valuable – but Meetup's official API is rate-limited, requires OAuth authentication, and is hard to use for non-developers.

This Meetup scraper solves that:

- ✅ **No API key and no login required** – works straight out of the box.
- ✅ **Three input modes** – keyword + location search, event URLs, and group URLs.
- ✅ **Rich, complete data** – exact RSVP/attendee counts, ticket prices, venue coordinates, organizers, topics and more.
- ✅ **Fast and cheap** – uses Meetup's own structured data layer, not a heavy headless browser, so runs are quick and low-cost.
- ✅ **Geocoding built in** – just type "London" or "New York"; no need to find coordinates.
- ✅ **Pagination handled automatically** – scrape far more than the first page of results.
- ✅ **Export anywhere** – JSON, CSV, Excel, HTML, XML, or pull straight from the Apify API.
- ✅ **Automation-friendly** – schedule runs, connect to Zapier, Make, Slack, Google Sheets, or use it as an AI agent tool.

---

### 🧩 What can you do with Meetup data?

This scraper is built for real business use cases. Here are the most popular ones:

#### Lead generation & sales prospecting
Find decision-makers, organizers and engaged community members in your niche. Build targeted lists of **Meetup groups** and their **organizers** by topic and city, then reach out with relevant offers.

#### Event marketing & sponsorship discovery
Identify active, well-attended events in your industry to **sponsor, speak at, or promote**. Filter by RSVP count to find the events that actually matter.

#### Market & competitive research
Track which **topics, technologies and communities** are growing in any city. Monitor competitor events, measure community size, and spot emerging trends before anyone else.

#### Event aggregation & directories
Power your own **event website, newsletter or app** with a continuously refreshed feed of local and online events – complete with descriptions, dates, venues and images.

#### Community management & recruitment
Discover relevant groups to join or partner with, find guest speakers, scout talent, and benchmark your own community against others.

#### Academic & data science research
Collect structured datasets on social gatherings, networking behavior, urban activity and online vs. in-person event trends.

---

### 📦 What data does the Meetup Scraper extract?

#### Event data
For every event, you get:

| Field | Description |
|---|---|
| `title` | Event name |
| `url` | Direct link to the event page |
| `eventType` / `isOnline` | `ONLINE` or `PHYSICAL` (in-person) |
| `status` | Event status (e.g. `ACTIVE`, `PAST`, `CANCELLED`) |
| `startDateTime` / `endDateTime` | Start and end time (ISO 8601, with timezone) |
| `durationMs` | Event duration in milliseconds |
| `description` | Full event description text |
| `goingCount` | Exact number of people attending (RSVP "yes") |
| `waitlistCount` | Number of people on the waitlist |
| `maxTickets` / `spotsLeft` | Capacity and remaining spots |
| `isFree` / `feeAmount` / `feeCurrency` | Free vs. paid, ticket price and currency |
| `topics` | List of related topics / tags |
| `photo` | High-resolution event image URL |
| `hosts` | Event hosts/organizers (name, member ID, profile URL) |
| `venue` | Venue name, full address, city, postal code, country, latitude & longitude |
| `groupName` / `groupUrlname` / `groupUrl` | The group running the event |
| `groupMemberCount` | Size of the host group |
| `groupCity` / `groupCountry` | Group location |

#### Group data
For every group, you get:

| Field | Description |
|---|---|
| `name` | Group name |
| `url` | Group page URL |
| `description` | Full group description |
| `memberCount` | Total number of members |
| `category` | Group category / topic area |
| `city` / `state` / `country` / `postalCode` | Group location |
| `lat` / `lon` | Group coordinates |
| `timezone` | Group timezone |
| `foundedDate` | When the group was created |
| `isPrivate` / `joinMode` | Privacy and join settings |
| `organizerName` / `organizerUrl` | Primary organizer |
| `photo` | Group photo URL |

#### Member data (optional)
When enabled for group URLs, for each member you get:

| Field | Description |
|---|---|
| `name` | Member name |
| `url` | Public member profile URL |
| `bio` | Member bio |
| `city` / `state` / `country` | Member location |
| `isOrganizer` / `isLeader` / `isProOrganizer` | Role flags |
| `status` | Membership status |
| `photo` | Member profile photo URL |
| `groupName` / `groupUrlname` | The group they belong to |

> ℹ️ Private contact details (email, phone) are **not** exposed by Meetup and are **not** collected by this scraper. Only publicly visible profile data is returned.

---

### 🚀 How to use the Meetup Scraper (step by step)

You don't need any technical knowledge to get started.

1. Click **Try for free** / open the Actor in the Apify Console.
2. Choose **one or both** of the following:
   - **Search events by keyword** – add one or more keywords (e.g. `javascript`, `yoga`, `startup networking`) and optionally a **Location** (city).
   - **Scrape specific events or groups by URL** – paste Meetup event or group URLs into **Start URLs**.
3. (Optional) Set filters: event type (online/in-person), date range, sort order, and a **Max items** limit to control cost.
4. Click **Start** ▶️.
5. When the run finishes, open the **Storage / Dataset** tab and **export** your data as JSON, CSV, Excel, HTML or XML.

That's it – you now have a clean Meetup dataset.

---

### ⚙️ Input examples

#### Example 1 – Search events by keyword and city
Find up to 200 JavaScript events in London:

```json
{
  "searchQueries": ["javascript", "web development"],
  "location": "London",
  "eventType": "any",
  "dateRange": "this-month",
  "sortBy": "date",
  "maxItems": 200
}
````

#### Example 2 – Scrape a specific group, its events and members

```json
{
  "startUrls": [
    { "url": "https://www.meetup.com/london-scala/" }
  ],
  "scrapeGroupEvents": true,
  "scrapeGroupMembers": true,
  "maxItems": 500
}
```

#### Example 3 – Scrape individual event pages

```json
{
  "startUrls": [
    { "url": "https://www.meetup.com/london-scala/events/314859429/" },
    { "url": "https://www.meetup.com/typescript-berlin/events/300000000/" }
  ]
}
```

#### Example 4 – Online events in a city

```json
{
  "searchQueries": ["product management"],
  "location": "San Francisco",
  "eventType": "online",
  "maxItems": 100
}
```

> Note: keyword search always needs a `location` (Meetup's event search is location-based). Online events still show up in any city's results.

***

### 📤 Output examples

The scraper writes one record per event, group or member to the dataset. Each record has a `type` field (`event`, `group` or `member`) so you can filter easily.

#### Event record

```json
{
  "type": "event",
  "id": "298765432",
  "title": "Intro to TypeScript – Hands-on Workshop",
  "url": "https://www.meetup.com/typescript-berlin/events/298765432/",
  "eventType": "PHYSICAL",
  "isOnline": false,
  "status": "ACTIVE",
  "startDateTime": "2026-06-12T18:30:00+02:00",
  "endDateTime": "2026-06-12T21:00:00+02:00",
  "description": "Join us for a hands-on TypeScript workshop...",
  "goingCount": 64,
  "waitlistCount": 12,
  "maxTickets": 80,
  "spotsLeft": 16,
  "isFree": true,
  "feeAmount": null,
  "feeCurrency": null,
  "topics": ["TypeScript", "JavaScript", "Web Development"],
  "photo": "https://secure.meetupstatic.com/photos/event/highres_534060066.jpeg",
  "hosts": [
    { "name": "Ankur Datta", "memberId": "405145336", "memberUrl": "https://www.meetup.com/members/405145336/" }
  ],
  "venue": {
    "name": "Prisma Data Services GmbH",
    "address": "Prenzlauer Allee 193",
    "city": "Berlin",
    "state": "BE",
    "postalCode": "10405",
    "country": "de",
    "lat": 52.540024,
    "lon": 13.424235
  },
  "groupName": "TypeScript Berlin",
  "groupUrlname": "typescript-berlin",
  "groupMemberCount": 1300,
  "scrapedAt": "2026-05-21T12:07:26.994Z"
}
```

#### Group record

```json
{
  "type": "group",
  "id": "21431410",
  "name": "London Scala User Group",
  "url": "https://www.meetup.com/london-scala/",
  "description": "A community for Scala developers in London...",
  "memberCount": 3981,
  "category": "Technology",
  "city": "London",
  "country": "gb",
  "foundedDate": "2010-03-18T00:00:00Z",
  "organizerName": "Zainab Ali",
  "organizerUrl": "https://www.meetup.com/members/123456/",
  "photo": "https://secure.meetupstatic.com/photos/event/highres.jpeg",
  "scrapedAt": "2026-05-21T12:11:31.635Z"
}
```

#### Member record

```json
{
  "type": "member",
  "id": "7392840",
  "name": "Andy Hicks",
  "url": "https://www.meetup.com/members/7392840/",
  "bio": "Scala contractor and organiser of London Scala User Group.",
  "city": "London",
  "isOrganizer": false,
  "isLeader": true,
  "status": "ACTIVE",
  "photo": "https://secure.meetupstatic.com/photos/member/highres_241963305.jpeg",
  "groupName": "London Scala User Group",
  "groupUrlname": "london-scala",
  "scrapedAt": "2026-05-21T12:11:31.635Z"
}
```

***

### 📝 Input parameters reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | array of strings | – | Keywords to search events for. Each keyword is searched separately. |
| `location` | string | – | City for the search (e.g. "New York", "Berlin"). **Required for keyword search**, auto-geocoded. |
| `eventType` | string | `any` | `any`, `online`, or `physical` (in-person). |
| `dateRange` | string | `any` | `any`, `today`, `tomorrow`, `this-week`, `this-weekend`, `next-week`, `this-month`. |
| `sortBy` | string | `relevance` | `relevance` or `date` (soonest first). |
| `startUrls` | array of URLs | – | Meetup event or group page URLs to scrape directly. |
| `scrapeGroupEvents` | boolean | `true` | For group URLs, also scrape the group's upcoming & past events. |
| `scrapeGroupMembers` | boolean | `false` | For group URLs, also scrape the publicly listed sample of members. |
| `includeFullEventDetails` | boolean | `false` | Reserved flag – search results already include full event detail. |
| `maxItems` | integer | `0` (no limit) | Maximum number of records to scrape. Use it to control cost. |
| `maxConcurrency` | integer | `10` | Maximum parallel requests. |
| `maxRequestRetries` | integer | `3` | Retries per failed request. |
| `proxyConfiguration` | object | Apify Proxy on | Proxy settings (Apify Proxy recommended for large runs). |

***

### 💡 Tips & best practices

- **Combine keyword + location** for the most relevant results. Without a location, the search returns online/global events.
- **Use `maxItems` to control cost.** Start small (e.g. 50–100) to preview the data, then scale up.
- **Group URLs are the most thorough way** to collect a community's entire event history – set `scrapeGroupEvents: true` to get both upcoming and past events.
- **For lead generation**, scrape group URLs with `scrapeGroupMembers: true` to capture organizers and engaged members.
- **Run multiple keywords and cities in one go** by adding several entries to `searchQueries` and running separate inputs per city.
- **Schedule the Actor** (daily/weekly) to keep an always-fresh event feed for your app or newsletter.
- **Filter the dataset by `type`** (`event`, `group`, `member`) after export to split records into separate sheets.

***

### 🌐 Proxy & reliability

This Actor uses Meetup's stable public data gateway. Meetup applies aggressive per-IP rate limiting to its **keyword event search**, so **rotating residential proxies are enabled by default** and the scraper automatically retries keyword searches on a fresh IP whenever Meetup throttles a request. This makes results reliable and complete. It also includes **retries with backoff** for transient network errors. Scraping events and groups by URL is lighter and works on almost any proxy, so you can switch to datacenter or your own proxies to reduce cost for URL-based runs.

***

### 🔌 Integrations & automation

This Meetup Scraper plugs straight into your stack:

- **Apify API** – trigger runs and pull data programmatically.
- **Webhooks** – get notified when a run finishes.
- **Zapier, Make (Integromat), n8n** – push results into thousands of apps.
- **Google Sheets, Slack, Airtable, Gmail** – send results where your team already works.
- **MCP / AI agents** – use this Actor as a tool for LLM-powered agents.
- **Scheduler** – run automatically on a daily, weekly or custom schedule.

***

### 👩‍💻 Using the Meetup Scraper via API

You can call this Actor from any language using the [Apify API](https://docs.apify.com/api/v2). Here's a Python example with the official client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run_input = {
    "searchQueries": ["data science"],
    "location": "San Francisco",
    "eventType": "any",
    "maxItems": 100,
}

run = client.actor("YOUR_USERNAME/meetup-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "-", item.get("goingCount"), "going")
```

And the equivalent in JavaScript / Node.js:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const input = {
    searchQueries: ['data science'],
    location: 'San Francisco',
    maxItems: 100,
};

const run = await client.actor('YOUR_USERNAME/meetup-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### ❓ Frequently asked questions

#### Do I need a Meetup API key or account?

No. This scraper does not require any Meetup API key, OAuth token, or account login. It works with publicly available data on Meetup.com.

#### What's the difference between the search mode and the URL mode?

**Search mode** (`searchQueries` + `location`) is best for discovery – it finds many events matching a keyword in a city. **URL mode** (`startUrls`) is best when you already know the exact events or groups you want, and it returns the most complete detail (and can also pull a group's full event history and members).

#### How many events can I scrape?

The search mode paginates automatically and can return hundreds of events per keyword/city. Group URLs return the group's entire upcoming and past event list. Use `maxItems` to cap the total and manage cost.

#### Can I get attendee or member email addresses?

No. Meetup does not publicly expose email addresses or phone numbers, so they are never collected. Only public profile information (name, bio, city, photo, role) is returned for the sample of members a group lists publicly.

#### Why are some fields empty?

Not every event or group fills in every field on Meetup (e.g. online events have no physical venue, free events have no fee). Empty fields simply mean the data isn't published on Meetup.

#### How often is the data updated?

The scraper fetches live data from Meetup.com on every run, so results always reflect the current state of the site. Schedule the Actor to keep your dataset fresh.

#### In what formats can I download the data?

JSON, CSV, Microsoft Excel (XLSX), HTML table, and XML – plus direct access via the Apify API and dataset views.

***

### ⚖️ Is it legal to scrape Meetup.com?

This Actor only collects **publicly available information** that anyone can view on Meetup.com without logging in. Web scraping of public data is generally legal, but **how you use the data is your responsibility**.

- Do **not** collect or process personal data in violation of GDPR, CCPA or other privacy laws.
- Do **not** use scraped data for spam, harassment, or any purpose prohibited by applicable law.
- Respect Meetup's Terms of Service and the rights of data subjects.
- Use the data for legitimate purposes such as research, analytics and aggregated insights.

If you are unsure about your specific use case, consult a legal professional. For more on the ethics and legality of web scraping, see Apify's guides on responsible scraping.

***

### 🛟 Support & feedback

Found a bug, missing a field, or need a new feature? Open an issue on the Actor's **Issues** tab – feedback is very welcome and helps improve the scraper. If an event or group fails to scrape, please include the exact URL so it can be reproduced.

***

### 🏷️ Keywords

Meetup scraper, Meetup.com scraper, scrape Meetup, Meetup events scraper, Meetup group scraper, Meetup data extractor, Meetup API alternative, extract Meetup events, Meetup event data, Meetup group data, Meetup members scraper, Meetup organizer data, event scraper, community data, lead generation, event marketing, networking events, RSVP data, event aggregator, no-code scraper, JSON CSV Excel export.

***

*This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Meetup or its parent companies. "Meetup" is a trademark of its respective owner.*

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search events for on Meetup.com (e.g. "javascript", "yoga", "startup networking"). Each keyword is searched separately. Combine with the <b>Location</b> field below to target a city. Leave empty if you only use Start URLs.

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

City name for keyword search (e.g. "New York", "London", "Berlin", "Tokyo"). <b>Required when you use Search keywords</b> — Meetup's event search needs a location. The city is geocoded automatically, no coordinates needed. Online events also appear in any city's results. Not needed when you only use Start URLs.

## `eventType` (type: `string`):

Filter keyword searches by how the event is held.

## `dateRange` (type: `string`):

Restrict keyword search results to a time window. Applies to upcoming events only.

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

Order in which keyword search results are collected.

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

Paste direct Meetup.com URLs to scrape specific <b>event</b> pages (e.g. <code>https://www.meetup.com/some-group/events/123456789/</code>) or <b>group</b> pages (e.g. <code>https://www.meetup.com/some-group/</code>). Group URLs can also pull the group's upcoming/past events and a sample of members (see toggles below).

## `scrapeGroupEvents` (type: `boolean`):

When a Start URL points to a group page, also collect that group's upcoming and recent past events as separate event records.

## `scrapeGroupMembers` (type: `boolean`):

When a Start URL points to a group page, also extract the publicly listed sample of group members and organizers (useful for lead generation and community research).

## `includeFullEventDetails` (type: `boolean`):

Visit each event found via keyword search to collect the complete description, host details, exact venue coordinates and JSON-LD metadata. More accurate but uses one extra request per event (slower & slightly more expensive). When off, the rich data already embedded in the search page is used.

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

Maximum number of output records (events + groups + members) to scrape across the whole run. Use this to control cost. Set 0 for no limit.

## `maxConcurrency` (type: `integer`):

Maximum number of pages scraped in parallel. Lower this if you hit rate limits; raise it for faster large runs.

## `maxRequestRetries` (type: `integer`):

How many times a failed request is retried before being marked as failed.

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

Proxy settings. Meetup may throttle repeated requests from a single IP, so rotating residential proxies are enabled by default for reliable, complete results. You can switch to datacenter proxies or your own proxies to lower cost.

## Actor input object example

```json
{
  "searchQueries": [
    "technology"
  ],
  "location": "London",
  "eventType": "any",
  "dateRange": "any",
  "sortBy": "relevance",
  "startUrls": [
    {
      "url": "https://www.meetup.com/london-scala/"
    }
  ],
  "scrapeGroupEvents": true,
  "scrapeGroupMembers": false,
  "includeFullEventDetails": false,
  "maxItems": 50,
  "maxConcurrency": 10,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted records (events, groups and members) for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table view of the scraped records.

# 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 = {
    "searchQueries": [
        "technology"
    ],
    "location": "New York",
    "startUrls": [
        {
            "url": "https://www.meetup.com/london-scala/"
        }
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/meetup-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 = {
    "searchQueries": ["technology"],
    "location": "New York",
    "startUrls": [{ "url": "https://www.meetup.com/london-scala/" }],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/meetup-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "technology"
  ],
  "location": "New York",
  "startUrls": [
    {
      "url": "https://www.meetup.com/london-scala/"
    }
  ],
  "maxItems": 50
}' |
apify call haketa/meetup-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=haketa/meetup-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Meetup Scraper - Events, Groups & Members Data Extractor",
        "description": "Scrape Meetup.com events, groups, organizers, attendees (RSVP counts), venues and topics by keyword, location or URL. Export to JSON, CSV & Excel. No API key needed.",
        "version": "1.0",
        "x-build-id": "qeerWoLi9a9YV5r4E"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/haketa~meetup-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-haketa-meetup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/haketa~meetup-scraper/runs": {
            "post": {
                "operationId": "runs-sync-haketa-meetup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/haketa~meetup-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-haketa-meetup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Keywords to search events for on Meetup.com (e.g. \"javascript\", \"yoga\", \"startup networking\"). Each keyword is searched separately. Combine with the <b>Location</b> field below to target a city. Leave empty if you only use Start URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location (city) — required for keyword search",
                        "type": "string",
                        "description": "City name for keyword search (e.g. \"New York\", \"London\", \"Berlin\", \"Tokyo\"). <b>Required when you use Search keywords</b> — Meetup's event search needs a location. The city is geocoded automatically, no coordinates needed. Online events also appear in any city's results. Not needed when you only use Start URLs."
                    },
                    "eventType": {
                        "title": "Event type",
                        "enum": [
                            "any",
                            "online",
                            "physical"
                        ],
                        "type": "string",
                        "description": "Filter keyword searches by how the event is held.",
                        "default": "any"
                    },
                    "dateRange": {
                        "title": "Date range",
                        "enum": [
                            "any",
                            "today",
                            "tomorrow",
                            "this-week",
                            "this-weekend",
                            "next-week",
                            "this-month"
                        ],
                        "type": "string",
                        "description": "Restrict keyword search results to a time window. Applies to upcoming events only.",
                        "default": "any"
                    },
                    "sortBy": {
                        "title": "Sort search results by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Order in which keyword search results are collected.",
                        "default": "relevance"
                    },
                    "startUrls": {
                        "title": "Start URLs (event or group pages)",
                        "type": "array",
                        "description": "Paste direct Meetup.com URLs to scrape specific <b>event</b> pages (e.g. <code>https://www.meetup.com/some-group/events/123456789/</code>) or <b>group</b> pages (e.g. <code>https://www.meetup.com/some-group/</code>). Group URLs can also pull the group's upcoming/past events and a sample of members (see toggles below).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "scrapeGroupEvents": {
                        "title": "Scrape a group's events",
                        "type": "boolean",
                        "description": "When a Start URL points to a group page, also collect that group's upcoming and recent past events as separate event records.",
                        "default": true
                    },
                    "scrapeGroupMembers": {
                        "title": "Scrape a group's sample members",
                        "type": "boolean",
                        "description": "When a Start URL points to a group page, also extract the publicly listed sample of group members and organizers (useful for lead generation and community research).",
                        "default": false
                    },
                    "includeFullEventDetails": {
                        "title": "Fetch full details for searched events",
                        "type": "boolean",
                        "description": "Visit each event found via keyword search to collect the complete description, host details, exact venue coordinates and JSON-LD metadata. More accurate but uses one extra request per event (slower & slightly more expensive). When off, the rich data already embedded in the search page is used.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of output records (events + groups + members) to scrape across the whole run. Use this to control cost. Set 0 for no limit.",
                        "default": 0
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of pages scraped in parallel. Lower this if you hit rate limits; raise it for faster large runs.",
                        "default": 10
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many times a failed request is retried before being marked as failed.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Meetup may throttle repeated requests from a single IP, so rotating residential proxies are enabled by default for reliable, complete results. You can switch to datacenter proxies or your own proxies to lower cost.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
