# Meetup Events Scraper - Search Events & Groups by Topic & City (`rjmacarthy/meetup-events-scraper`) Actor

Scrape public Meetup events by keyword and city, or from group URLs. Multiple keywords x cities per run, online/in-person and date filters, venue with coordinates, fees, RSVP counts, topics, full description, optional details and an only-new mode.

- **URL**: https://apify.com/rjmacarthy/meetup-events-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 meetup 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Meetup Events Scraper - Search Events & Groups by Topic and City

Scrape public **Meetup.com events** by keyword and city, or straight from **Meetup group URLs**. Put several keywords and several cities in one run (every keyword is searched in every city), filter by **online / in-person** and by **today, tomorrow, this week, this weekend, next week or custom dates**, and get clean JSON with start/end times with UTC offset, venue address **with coordinates**, structured **fees**, **RSVP counts**, group, category, topics and the **full description**. An **only new events** mode turns it into a daily feed for event-listing sites, newsletters and sponsorship teams. No login, no browser, no cookies.

Other Meetup scrapers take one search URL at a time. This one takes your whole matrix of topics x cities plus group URLs in one run, removes duplicates across them, and only charges for what lands in your dataset.

### What data can you get?

| Field | Example |
|---|---|
| `title`, `url`, `id` | "Founder Meet\&Greet & Cofounder Search", https://www.meetup.com/berlin-startup-founder-101/events/316352574/ |
| `startAt`, `endAt`, `timezone`, `duration` | 2026-11-12T19:00:00+01:00, Europe/Berlin, PT2H |
| `eventType`, `status` | PHYSICAL / ONLINE / HYBRID, ACTIVE / CANCELLED / PAST |
| `venue` | name, address, city, state, country, postal code, **lat, lon** |
| `group` | name, URL name, URL, city, country |
| `category`, `topics` | "Career & Business", \["Entrepreneurship", "Co-Founder"] |
| `description` | Full event description (Markdown) |
| `rsvpCount`, `maxAttendees` | 155 going, 40 seats (counts only) |
| `isFree`, `fee` | `{ "amount": 7, "currency": "USD", "required": true }` |
| `imageUrl`, `isRecurring`, `recurrence` | "every week on Tue", "monthly on the 3rd Thu" |
| With **Fetch event details** | `howToFindUs`, `waitlistCount`, `rsvpOpensAt`/`rsvpClosesAt`, `refundPolicy`, `guestsAllowed`, `googleMapsUrl`, `groupMemberCount`, `groupRating`, `seriesUpcomingDates` |
| Provenance | `searchKeyword`, `searchLocation`, `sourceGroup`, `scrapedAt` |

### Use cases

- **Event-listing sites and city newsletters:** a scheduled task with *Only new events* gives you each week's newly announced tech, startup or hobby events per city.
- **Developer relations and sponsorship:** find every Python, AI or JavaScript meetup in your target cities with RSVP counts and capacity, and see which groups are active.
- **Venue and community research:** map where events happen (coordinates included), what they cost and how often groups meet.
- **Group monitoring:** follow a list of Meetup groups and get their upcoming (and past) events in one dataset.

### How to use

1. Enter one or more **Keywords** and one or more **Locations** (e.g. `New York, NY`, `London, GB`, `Berlin, DE`), and/or **Group URLs**.
2. Optionally pick **Event type**, **Date range**, **Radius**, **Strict keyword match** and **Fetch event details**.
3. Run, then export the dataset as JSON, CSV, Excel or via the API.

Locations accept `City, ST` (US), `City, CC` (country code), Meetup's own `us--ny--New York` format or `latitude,longitude`. Date presets are computed in each city's own time zone; weeks run Monday to Sunday.

**Search several topics in several cities:**

```json
{
    "keywords": ["python", "data science"],
    "locations": ["New York, NY", "London, GB"],
    "dateRange": "this-week",
    "eventType": "in-person",
    "maxItems": 50
}
```

**Startup events in Berlin next week, soonest first, with details:**

```json
{
    "keywords": ["startup"],
    "locations": ["Berlin, DE"],
    "dateRange": "next-week",
    "sortBy": "date",
    "fetchDetails": true,
    "maxItems": 20
}
```

**Upcoming and past events of Meetup groups:**

```json
{
    "groupUrls": ["https://www.meetup.com/golanguagenewyork/", "https://www.meetup.com/pydatanyc/"],
    "includePastGroupEvents": true,
    "maxItems": 30
}
```

**Weekly feed of new events (save as a Task and schedule it):**

```json
{
    "keywords": ["artificial intelligence"],
    "locations": ["San Francisco, CA"],
    "onlyNew": true,
    "stateKey": "sf-ai-feed"
}
```

### Output example

A real item (description shortened):

```json
{
  "id": "316352574",
  "eventId": "316352574",
  "title": "Founder Meet&Greet & Cofounder Search: Cozy Edition!",
  "url": "https://www.meetup.com/berlin-startup-founder-101/events/316352574/",
  "startAt": "2026-11-12T19:00:00+01:00",
  "endAt": "2026-11-12T21:00:00+01:00",
  "timezone": "Europe/Berlin",
  "duration": "PT2H",
  "eventType": "PHYSICAL",
  "status": "ACTIVE",
  "venue": { "name": "KERB Food Hall", "address": "Potsdamer Platz 2", "city": "Berlin", "state": null, "country": "DE", "postalCode": null, "lat": 52.50973, "lon": 13.375051 },
  "group": { "id": "8831882", "name": "Berlin Startup Founder 101", "urlname": "berlin-startup-founder-101", "url": "https://www.meetup.com/berlin-startup-founder-101", "city": "Berlin", "state": null, "country": "DE" },
  "category": "Career & Business",
  "topics": ["Innovation", "Co-Founder", "Entrepreneur Networking", "Entrepreneurship", "Internet Startups"],
  "description": "Looking for the right people to support you with your next step? Looking for the right co-founder? …",
  "rsvpCount": 155,
  "maxAttendees": null,
  "isFree": true,
  "fee": null,
  "imageUrl": "https://secure.meetupstatic.com/photos/event/1/2/0/6/highres_536464614.jpeg",
  "isRecurring": false,
  "recurrence": null,
  "detailsFetched": true,
  "howToFindUs": "You can find us in the area of the bar on the 1st floor to the left",
  "waitlistCount": 0,
  "guestsAllowed": true,
  "maxGuestsPerRsvp": 2,
  "rsvpOpensAt": null,
  "rsvpClosesAt": null,
  "refundPolicy": null,
  "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=52.509730,13.375051",
  "groupMemberCount": 17719,
  "groupRating": 4.39,
  "seriesUpcomingDates": [],
  "searchKeyword": "startup",
  "searchLocation": "Berlin, DE",
  "sourceGroup": null,
  "scrapedAt": "2026-11-06T12:28:14.962Z"
}
```

Every item has the same keys; missing values are `null`. The dataset has three views: **Overview**, **Venues & fees** and **Details**. A `RUN_SUMMARY` record in the key-value store lists per-search status, counts and request statistics.

### Pricing

Pay per event, no start fee:

| Event | Price | 1,000 events |
|---|---|---|
| `event`: one Meetup event in your dataset | $0.0015 | $1.50 |
| `event-details`: extra details for one event (only with *Fetch event details*) | $0.001 | $1.00 |

Examples: the default run (15 Python events in New York) costs about **$0.02**. 1,000 events cost **$1.50**, or **$2.50** with details. The full description is included in the base price. Duplicates across your searches, events removed by filters, events skipped by *Only new events* and failed detail lookups are never charged. Set **Maximum cost per run** to cap spending; the scraper stops cleanly when it is reached.

### Tips and limits

- **Meetup's keyword search is fuzzy.** Like on meetup.com itself, the best matches come first and Meetup then fills the list with other popular events nearby (a "python" search in New York also returns social mixers). Use a smaller **Max events**, or turn on **Strict keyword match** to keep only events whose title, description, group name or topics contain every word of your keyword. Strict mode returns fewer events, sometimes none.
- **Max events** applies to each keyword x location pair and each group. 0 means no limit, capped at about 1,000 per search.
- Search returns upcoming events. For past events use **Group URLs** with **Include past group events** (date range applies to past events only with custom dates).
- Hybrid events match both "online" and "in-person".
- Online events have `venue` fields set to `null` (Meetup stores placeholder values for them).
- The radius is passed to Meetup as given; results near the edge depend on Meetup's own geo search.
- Private groups and members-only details are not available; this Actor reads public data only.

### FAQ

**Is it legal to scrape Meetup?** This Actor reads only public event pages' data, the same information anyone sees on meetup.com without logging in. It never collects attendee lists, member names or profiles, host names or photos, emails or phone numbers: RSVPs are counts only. You are responsible for using the data in line with Meetup's terms and the laws that apply to you (e.g. GDPR).

**Do I need a Meetup account or API key?** No.

**Do I need a proxy?** Usually not. If a run reports that Meetup returned HTTP 403/429, enable Apify Proxy (datacenter) in the input. Residential proxy groups are not supported: they are switched to datacenter automatically, because residential traffic would cost more than the events.

**How does "Only new events" work?** Event IDs that were output are stored in the named key-value store `meetup-events-scraper-state` under your **State key**. Later runs skip them (and don't charge for them). The first run outputs everything and becomes the baseline. Use a different state key for each scheduled task.

**What does "Fetch event details" add?** One extra request per event for how-to-find-us notes, waitlist size, RSVP open/close times, refund policy, guest rules, a Google Maps link, the group's member count and rating, and the next dates of recurring series.

### Integrations

Use the results anywhere: the **Apify API** and clients for JavaScript and Python, webhooks, **Make**, **Zapier**, **n8n**, Google Sheets, Slack, and AI agents via the **Apify MCP server**. Schedule a Task with *Only new events* to push newly announced events into your CMS, newsletter or CRM.

### Changelog

- **0.1** (November 2026): first release. Keyword x city search, group URLs (upcoming + past), event type and date filters, strict keyword match, fees, venue coordinates, RSVP counts, optional details, only-new mode.

### Ready-to-run examples

- [Find startup and founder events in Berlin next week](https://apify.com/rjmacarthy/meetup-events-scraper/examples/startup-events-berlin-next-week-meetup)
- [Get online AI events from San Francisco Meetup groups](https://apify.com/rjmacarthy/meetup-events-scraper/examples/online-ai-events-san-francisco-meetup)

### More scrapers by the same developer

- [Luma Events Scraper: Tech, AI & Crypto Events by City](https://apify.com/rjmacarthy/luma-events-scraper)
- [Y Combinator Companies Scraper - YC Startup Directory](https://apify.com/rjmacarthy/ycombinator-companies-scraper)
- [AliExpress Scraper - Product Search, Prices, Ratings & Details](https://apify.com/rjmacarthy/aliexpress-scraper)
- [Apple App Store Scraper: Apps, Search & Reviews](https://apify.com/rjmacarthy/app-store-scraper)
- [AutoScout24 Scraper - Used Car Listings & Prices (Europe)](https://apify.com/rjmacarthy/autoscout24-scraper)
- [Bing Search Scraper: Organic Results, Ads & Related Searches](https://apify.com/rjmacarthy/bing-search-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a bug or need a field? Open an issue on the **Issues** tab with your input and run ID, and we'll take a look.

# Actor input Schema

## `keywords` (type: `array`):

Topics to search for, e.g. "python", "startup", "hiking". Every keyword is searched in every location. Leave empty to list all events near the locations.

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

Cities to search around, e.g. "New York, NY", "London, GB", "Berlin, DE". Also accepts Meetup's own format ("us--ny--New York") or "latitude,longitude".

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

Meetup groups to scrape events from, e.g. https://www.meetup.com/nycpython/ (the group's URL name like "nycpython" also works). Upcoming events by default.

## `includePastGroupEvents` (type: `boolean`):

For group URLs, also scrape the group's past events (newest first).

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

Only in-person or only online events. Hybrid events count as both.

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

When the events take place, in each location's own time zone. Weeks run Monday to Sunday. "Custom" uses the start/end dates below.

## `startDate` (type: `string`):

First day (YYYY-MM-DD) for the custom date range.

## `endDate` (type: `string`):

Last day (YYYY-MM-DD, inclusive) for the custom date range.

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

Search radius around each location.

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

Meetup's relevance ranking, or soonest first.

## `strictKeywordMatch` (type: `boolean`):

Meetup's search is fuzzy and fills results with loosely related local events. Turn this on to keep only events whose title, description, group name or topics contain every word of the keyword.

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

Maximum events output for each keyword x location pair and each group. 0 = no limit (up to ~1,000 per search).

## `fetchDetails` (type: `boolean`):

One extra request per event for: how to find us, waitlist count, RSVP open/close times, refund policy, Google Maps link, group member count and rating, next dates of a recurring series. Charged as an extra "event-details" event.

## `onlyNew` (type: `boolean`):

Skip events already output by earlier runs with the same state key (great for scheduled newsletters and listing sites). The first run outputs everything and becomes the baseline.

## `stateKey` (type: `string`):

Name of the memory used by "Only new events". Use different keys for unrelated scheduled tasks.

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

Usually not needed. If Meetup blocks the run, enable Apify Proxy (datacenter). Residential proxy groups are not supported and fall back to datacenter.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "locations": [
    "New York, NY"
  ],
  "includePastGroupEvents": false,
  "eventType": "any",
  "dateRange": "any",
  "radiusMiles": 25,
  "sortBy": "relevance",
  "strictKeywordMatch": false,
  "maxItems": 15,
  "fetchDetails": false,
  "onlyNew": false,
  "stateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `events` (type: `string`):

One item per event: title, start, type, city, group, RSVP count, fee and URL.

## `eventsFull` (type: `string`):

Every field, including full description, venue coordinates and detail fields.

## `summary` (type: `string`):

Per-source status, counts and request statistics.

# 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 = {
    "keywords": [
        "python"
    ],
    "locations": [
        "New York, NY"
    ],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/meetup-events-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 = {
    "keywords": ["python"],
    "locations": ["New York, NY"],
    "maxItems": 15,
}

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

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "python"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxItems": 15
}' |
apify call rjmacarthy/meetup-events-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rjmacarthy/meetup-events-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hf9kGld7BYiUWgHdt/builds/amtg7OSabafzDsVLX/openapi.json
