# Meetup Scraper — Events, Groups & Organizer Leads (`scrapesage/meetup-scraper`) Actor

Scrape Meetup events, groups and organizer leads by keyword, city or URL. Rich event data: date, venue geo, RSVP counts, price, hosts and topics, plus group member counts and organizers as B2B leads. Monitor mode pulls only new items. No login. Export JSON, CSV, Excel.

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

## Pricing

from $5.00 / 1,000 event scrapeds

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/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 — Events, Groups & Organizer Leads

Extract **complete Meetup.com data** — **events** (start/end times, venue geo, going/waitlist RSVP counts, ticket price, hosts and topics), the **groups** behind them (member counts, category, founded date, organizer), and every **organizer as a ready-to-contact B2B lead** with a lead score. Search by keyword + city, scrape a group or event URL, or run monitor mode for only newly listed items.

No login, no cookies — fast JSON straight from Meetup's own internal API.

### Why this Meetup scraper?

Most Meetup scrapers only parse the public event card and return `null` for the fields that actually matter. This actor reads Meetup's internal API directly and ships events **plus** the groups and organizers behind them — one clean table per entity, no empty columns.

| Data | Typical scrapers | This actor |
|---|---|---|
| Event title, date/time, URL | ✅ | ✅ |
| In-person vs online + **exact venue geo** (lat/lng, address) | partial | ✅ |
| **Going / waitlist RSVP counts** | ❌ | ✅ |
| Ticket **price & currency** (free vs paid) | ❌ | ✅ |
| Full description, **topics/tags** | partial | ✅ |
| Event **hosts** (B2B leads) + speaker details | ❌ | ✅ |
| **Group** profile: member count, category, founded date | ❌ | ✅ |
| **Organizer leads** with profile, bio, location & lead score | ❌ | ✅ |
| Search by keyword + any city, or scrape a group/event URL | partial | ✅ |
| **Monitor mode** — only new items since last run | ❌ | ✅ |

### Use cases

- **Lead generation** — Meetup organizers run communities of hundreds to tens of thousands of members and buy venues, catering, AV, sponsorship and tools. Score them by audience size and number of groups run, then reach them via their profile.
- **Event discovery & aggregation** — feed calendars, newsletters and apps with structured Meetup data (date, venue, price, RSVP counts) for any city.
- **Community & market research** — track which topics draw crowds, which groups are growing, and who is hosting, across an entire city or category.
- **Sponsorship & partnership prospecting** — find active groups by topic, audience size and city, then pitch the organizer with verified context.
- **Recruiting & sales intelligence** — use topics, group categories and RSVP counts as in-market intent signals.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Meetup Scraper**, fill in the inputs you need, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "outputType": "all",
    "searchQueries": ["ai", "startup networking"],
    "locations": ["New York, NY", "Austin, TX"],
    "eventType": "any",
    "minAttendees": 10,
    "enrichEvents": true,
    "includeOrganizerLeads": true,
    "maxResults": 200
}
````

- **outputType** *(default `events`)* — `events`, `groups`, `organizers`, or `all`. A single type gives one clean, fully-populated table; `all` returns events **+** their groups **+** organizer leads together, each row tagged with a `type`.
- **searchQueries** — keywords to search Meetup for; each is combined with every location. Leave empty to browse a location with no keyword filter.
- **locations** — cities as free text (`New York, NY`, `Austin, TX`, `San Francisco`, `London`); resolved to coordinates automatically. Use `online` for online-only events.
- **eventType** *(default `any`)* — `physical` (in-person only) or `online`.
- **dateFrom / dateTo** — only events starting in this window (`YYYY-MM-DD`); defaults to upcoming events only.
- **minAttendees** *(default 0)* — only events with at least this many RSVPs; handy to skip tiny events when prospecting.
- **radiusMiles** *(default 0)* — search radius around each location (0 = Meetup's default).
- **groupUrls / eventUrls / startUrls** — scrape specific groups or events directly; accepts full URLs or bare urlnames/IDs (`startUrls` auto-detects and routes a mixed list).
- **enrichEvents** *(default true)* — open each event for hosts, topics, exact RSVP counts, full description, precise venue geo, price and speaker. Turn off for a faster, lighter run.
- **includeOrganizerLeads** *(default true)* — when scraping groups, emit one organizer-lead record per group.
- **includeGroupEvents** *(default false)* — also pull each group's upcoming events.
- **maxResults** *(default 200)* — cap on records output across the whole run (0 = no limit); keeps runs predictable.
- **maxConcurrency** *(default 6)* — maximum parallel API calls.
- **proxyConfiguration** — proxy settings; Apify Proxy datacenter (the default) works well for Meetup.

### Output

By default you get **one clean, dense table of events** — every column applies to every row. Set `outputType` to `groups` or `organizers` for those tables, or `all` to combine everything (each row tagged with a `type` of `event`, `group`, or `organizer`).

An event record (`type: "event"`):

```json
{
    "type": "event",
    "eventId": "314911336",
    "title": "ACM/IEEE Austin: June Tech Talks & Community Showcase",
    "eventUrl": "https://www.meetup.com/acm-austin/events/314911336/",
    "status": "active",
    "eventType": "physical",
    "isOnline": false,
    "dateTime": "2026-06-24T18:00:00-05:00",
    "endTime": "2026-06-24T20:00:00-05:00",
    "durationMinutes": 120,
    "description": "An evening of deep technical talks across AI, cloud-native systems and security…",
    "goingCount": 48,
    "waitlistCount": 0,
    "isFree": true,
    "feePrice": null,
    "feeCurrency": null,
    "topics": ["Artificial Intelligence", "Machine Learning", "Software Architecture"],
    "venueName": "CGCS, ACC Rio Campus Build #3000",
    "venueAddress": "1218 West Ave Bldg #3000",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78701",
    "country": "US",
    "latitude": 30.277336,
    "longitude": -97.74849,
    "hostNames": ["Akshay Mittal"],
    "hostCount": 1,
    "groupId": "38035397",
    "groupName": "ACM Austin | Enterprise AI & Engineering",
    "groupUrlname": "acm-austin",
    "groupUrl": "https://www.meetup.com/acm-austin",
    "groupMembers": 1450,
    "timezone": "America/Chicago",
    "searchQuery": "ai",
    "searchLocation": "Austin, TX, USA",
    "scrapedAt": "2026-06-12T17:16:42.193Z"
}
```

A group record (`type: "group"`) carries `name`, `memberCount`, `category`, `topics`, `foundedDate`, `city`/`state`/`country`, `upcomingEventCount`, the `organizer*` fields and a `leadScore`. An organizer record (`type: "organizer"`) carries the organizer's `name`, `bio`, `profileUrl`, location, `groupsRun`, the group they run, `isProOrganizer` and a `leadScore`.

Meetup is organizer-entered data, so some fields are populated only when the organizer filled them in — a blank `feePrice` (free events), missing description or empty bio means the organizer didn't publish it, not that scraping failed. Nothing is dropped, and empty results are reported as success. Personal emails are not published by Meetup, so they aren't included.

### Monitoring — get only new items

Turn on **`onlyNewItems`** to make every run output **only events/groups you haven't received before**. It remembers what it has delivered in a persistent store, so it pairs perfectly with [Apify Schedules](https://docs.apify.com/platform/schedules):

- Create a Schedule (e.g. daily) for your keyword + city, keep monitor mode on, and each run hands you just the **newly listed items** — ideal for newsletters, lead pipelines and Slack alerts.
- Monitor mode is a per-run "new items only" filter — it **works alongside** the Apify scheduler and never replaces or interferes with it.
- Use a different **`monitorStateKey`** per saved search so each schedule tracks its own "already seen" list independently.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep your data fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/meetup-scraper').call({
    outputType: 'all',
    searchQueries: ['ai'],
    locations: ['Austin, TX'],
    enrichEvents: true,
    includeOrganizerLeads: true,
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new records straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find AI meetups in Austin next month with their organizers" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **event intelligence & lead-gen stack** — scrape events, speakers, exhibitors and organizers across every major platform:

- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads with contacts.
- **[Sched Conference Scraper](https://apify.com/scrapesage/sched-conference-scraper)** — conference speakers, sessions, sponsors & leads.
- **[Whova Event Scraper](https://apify.com/scrapesage/whova-event-scraper)** — event sessions, speakers, sponsors & exhibitors.
- **[Swapcard Exhibitor Scraper](https://apify.com/scrapesage/swapcard-exhibitor-scraper)** — event exhibitors, speakers & contacts.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — Bark.com service-provider directory listings.
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — US federal contract opportunities & contacts.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad intelligence on Meta & Instagram.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — who's advertising what on Google.

### Tips

- **Pick a single `outputType`** (Events / Groups / Organizer leads) for a clean, fully-populated table that's perfect for direct export. Use `all` when you want events plus the groups and organizers behind them in one dataset.
- **Organizer leads**: run with `outputType: "all"` or `groups` and keep `includeOrganizerLeads` on — it turns every group into a contactable community owner with a lead score.
- **Prospecting filter**: set `minAttendees` (e.g. 25+) to skip tiny events and focus on active, established groups.
- **Big cities**: split runs by keyword and/or `dateFrom`/`dateTo` windows to exhaust a large metro, and use `maxResults` to keep test runs cheap.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `onlyNewItems` (and a distinct `monitorStateKey` per search) to capture only newly listed items each day.

### FAQ

**How do I scrape Meetup events for a specific city?** Put the city in `locations` as plain text (`Austin, TX`, `New York, NY`, `San Francisco`) and add keywords in `searchQueries`. The city is resolved to coordinates automatically.

**Does it need the Meetup API or a key?** No. This actor reads the public data from Meetup's internal API that powers meetup.com — no key or login needed.

**Can I scrape a single group or event?** Yes — paste its URL into `groupUrls` or `eventUrls` (or a mixed list in `startUrls`). You can also pull a group's upcoming events with `includeGroupEvents`.

**How do I get only new events on a schedule?** Turn on monitor mode (`onlyNewItems`) and create a [Schedule](https://docs.apify.com/platform/schedules). Each run returns only items it hasn't delivered before, and it works alongside the scheduler.

**Where do organizer leads come from?** From each group's public organizer profile on Meetup (name, bio, location, how many groups they run). Personal emails are not published by Meetup, so they aren't included.

**A field is empty — why?** Some events don't publish a price (free events), some groups don't list a description, and some organizers didn't write a bio. Fields are blank only when the organizer didn't publish that data — never because the scraper skipped it.

**Is scraping Meetup legal?** This actor collects publicly available data only. You're responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for personal data) and Meetup's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `outputType` (type: `string`):

Choose the record type that lands in your dataset. `Events` (default) and `All` run an event search; `Groups` and `Organizer leads` run a group search. A single type gives one clean, fully-populated table; `All` returns events + their groups + organizer leads together, each row tagged with a `type` field.

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

Keywords to search Meetup for, e.g. `ai`, `startup networking`, `real estate investing`. Each keyword is combined with every location below. Leave empty to browse a location with no keyword filter.

## `locations` (type: `array`):

Cities or places to search, e.g. `New York, NY`, `Austin, TX`, `San Francisco`, `London`. Free text is resolved to coordinates automatically. Use `online` to search online-only events. Each location is combined with every keyword above.

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

Limit to in-person or online events (applies to event searches).

## `dateFrom` (type: `string`):

Only events starting on/after this date. Defaults to now (upcoming events only). Format: YYYY-MM-DD.

## `dateTo` (type: `string`):

Only events starting on/before this date. Format: YYYY-MM-DD.

## `minAttendees` (type: `integer`):

Only return events with at least this many people going. 0 = no minimum. Handy to filter out tiny events when prospecting.

## `radiusMiles` (type: `integer`):

Distance around the location to search. 0 = Meetup's default radius.

## `groupUrls` (type: `array`):

Scrape specific Meetup groups directly. Accepts full URLs (`https://www.meetup.com/awsnewyork/`) or bare urlnames (`awsnewyork`). Returns the group profile, member count and organizer lead.

## `eventUrls` (type: `array`):

Scrape specific events directly. Accepts full event URLs (`https://www.meetup.com/awsnewyork/events/314916614/`) or bare event IDs.

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

A mixed list of Meetup group or event URLs — each is auto-detected and routed to the right scraper.

## `enrichEvents` (type: `boolean`):

Open each event for its full detail — hosts (B2B leads), topics, exact going/waitlist counts, full description, precise venue geo, ticket price and speaker. Adds one fast API call per event. Turn off for a faster, lighter run that still includes title, group, venue, going count and price.

## `includeOrganizerLeads` (type: `boolean`):

When scraping groups (Groups / Organizer leads / All), also emit one organizer-lead record per group: name, profile, bio, location, how many groups they run and a lead score.

## `includeGroupEvents` (type: `boolean`):

When scraping groups or group URLs, also pull each group's upcoming events into the dataset.

## `onlyNewItems` (type: `boolean`):

Output only items that were NOT returned in previous runs. Remembers what it has delivered in a persistent store, so on a schedule each run gives you just the new events/groups. Works alongside Apify Schedules — it does not replace or interfere with the scheduler.

## `monitorStateKey` (type: `string`):

Advanced: name the monitor memory so different searches track their own 'already seen' list. Use a different key per search/schedule to keep them independent.

## `maxResults` (type: `integer`):

Maximum number of records to output across the whole run (0 = no limit). Keeps test runs cheap and predictable.

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

Maximum number of parallel API calls.

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

Proxy settings. Meetup's public API is light on anti-bot, so Apify Proxy (datacenter, the default) works well. Switch to residential for very large runs.

## Actor input object example

```json
{
  "outputType": "events",
  "searchQueries": [
    "ai"
  ],
  "locations": [
    "New York, NY"
  ],
  "eventType": "any",
  "minAttendees": 0,
  "radiusMiles": 0,
  "enrichEvents": true,
  "includeOrganizerLeads": true,
  "includeGroupEvents": false,
  "onlyNewItems": false,
  "monitorStateKey": "default",
  "maxResults": 200,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped records in the default dataset. Use the Events / Groups / Organizer leads views to filter the columns to one record type.

# 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": [
        "ai"
    ],
    "locations": [
        "New York, NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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": ["ai"],
    "locations": ["New York, NY"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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": [
    "ai"
  ],
  "locations": [
    "New York, NY"
  ]
}' |
apify call scrapesage/meetup-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Meetup Scraper — Events, Groups & Organizer Leads",
        "description": "Scrape Meetup events, groups and organizer leads by keyword, city or URL. Rich event data: date, venue geo, RSVP counts, price, hosts and topics, plus group member counts and organizers as B2B leads. Monitor mode pulls only new items. No login. Export JSON, CSV, Excel.",
        "version": "1.0",
        "x-build-id": "H0mHcl6YlZvVPtXP6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~meetup-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~meetup-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-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/scrapesage~meetup-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-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": {
                    "outputType": {
                        "title": "What to output",
                        "enum": [
                            "events",
                            "groups",
                            "organizers",
                            "all"
                        ],
                        "type": "string",
                        "description": "Choose the record type that lands in your dataset. `Events` (default) and `All` run an event search; `Groups` and `Organizer leads` run a group search. A single type gives one clean, fully-populated table; `All` returns events + their groups + organizer leads together, each row tagged with a `type` field.",
                        "default": "events"
                    },
                    "searchQueries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Keywords to search Meetup for, e.g. `ai`, `startup networking`, `real estate investing`. Each keyword is combined with every location below. Leave empty to browse a location with no keyword filter.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Cities or places to search, e.g. `New York, NY`, `Austin, TX`, `San Francisco`, `London`. Free text is resolved to coordinates automatically. Use `online` to search online-only events. Each location is combined with every keyword above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "eventType": {
                        "title": "Event type",
                        "enum": [
                            "any",
                            "physical",
                            "online"
                        ],
                        "type": "string",
                        "description": "Limit to in-person or online events (applies to event searches).",
                        "default": "any"
                    },
                    "dateFrom": {
                        "title": "Start date (from)",
                        "type": "string",
                        "description": "Only events starting on/after this date. Defaults to now (upcoming events only). Format: YYYY-MM-DD."
                    },
                    "dateTo": {
                        "title": "Start date (to)",
                        "type": "string",
                        "description": "Only events starting on/before this date. Format: YYYY-MM-DD."
                    },
                    "minAttendees": {
                        "title": "Minimum attendees (RSVPs)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return events with at least this many people going. 0 = no minimum. Handy to filter out tiny events when prospecting.",
                        "default": 0
                    },
                    "radiusMiles": {
                        "title": "Search radius (miles)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Distance around the location to search. 0 = Meetup's default radius.",
                        "default": 0
                    },
                    "groupUrls": {
                        "title": "Group URLs",
                        "type": "array",
                        "description": "Scrape specific Meetup groups directly. Accepts full URLs (`https://www.meetup.com/awsnewyork/`) or bare urlnames (`awsnewyork`). Returns the group profile, member count and organizer lead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "eventUrls": {
                        "title": "Event URLs",
                        "type": "array",
                        "description": "Scrape specific events directly. Accepts full event URLs (`https://www.meetup.com/awsnewyork/events/314916614/`) or bare event IDs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Mixed Meetup URLs",
                        "type": "array",
                        "description": "A mixed list of Meetup group or event URLs — each is auto-detected and routed to the right scraper.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichEvents": {
                        "title": "Enrich events (hosts, topics, full detail)",
                        "type": "boolean",
                        "description": "Open each event for its full detail — hosts (B2B leads), topics, exact going/waitlist counts, full description, precise venue geo, ticket price and speaker. Adds one fast API call per event. Turn off for a faster, lighter run that still includes title, group, venue, going count and price.",
                        "default": true
                    },
                    "includeOrganizerLeads": {
                        "title": "Output organizer leads",
                        "type": "boolean",
                        "description": "When scraping groups (Groups / Organizer leads / All), also emit one organizer-lead record per group: name, profile, bio, location, how many groups they run and a lead score.",
                        "default": true
                    },
                    "includeGroupEvents": {
                        "title": "Also scrape each group's upcoming events",
                        "type": "boolean",
                        "description": "When scraping groups or group URLs, also pull each group's upcoming events into the dataset.",
                        "default": false
                    },
                    "onlyNewItems": {
                        "title": "Monitor mode — only new items",
                        "type": "boolean",
                        "description": "Output only items that were NOT returned in previous runs. Remembers what it has delivered in a persistent store, so on a schedule each run gives you just the new events/groups. Works alongside Apify Schedules — it does not replace or interfere with the scheduler.",
                        "default": false
                    },
                    "monitorStateKey": {
                        "title": "Monitor state key",
                        "type": "string",
                        "description": "Advanced: name the monitor memory so different searches track their own 'already seen' list. Use a different key per search/schedule to keep them independent.",
                        "default": "default"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of records to output across the whole run (0 = no limit). Keeps test runs cheap and predictable.",
                        "default": 200
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of parallel API calls.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Meetup's public API is light on anti-bot, so Apify Proxy (datacenter, the default) works well. Switch to residential for very large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
