# Meetup Events Scraper: City, Keyword, Group & Date (`tidyharvest/meetup-events-scraper`) Actor

Get Meetup events for any city or coordinates and radius, keyword, category, date range or group: title, start/end with time zone, venue address and coordinates, online/hybrid flag, group, RSVP count, fee, topics, image and description. No login. $0.80 per 1,000 events.

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

## Pricing

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Meetup Events Scraper: City, Keyword, Group & Date

Get **Meetup events** for any city, coordinates and radius, keyword, topic category, date range or group, in clean structured data: **title, start and end time with time zone, venue name and address, coordinates, online/hybrid flag, group, RSVP ("going") count, fee, topics, image and full description.**

Type a city (`Boston, MA`, `London, UK`) or paste a group link. **No Meetup account, login, cookies or API key.** Requests are paced politely, so runs are reliable and cheap.

### What you can do with it

- **Event aggregators and city guides:** keep a local "what's on" page or newsletter fresh with a daily or weekly run.
- **Community and developer relations:** track every Python, AI, startup or design meetup in your target cities and how many people RSVP.
- **Sales and sponsorship leads:** find active groups and organizers by topic and size, and the venues that host them.
- **Calendar sync and alerts:** send new events to Google Calendar, Slack, Notion or Sheets with Apify integrations and schedules.
- **Research:** map a city's community scene by topic, group size and event frequency, including past events.

### Input

```json
{
  "locations": ["Boston, MA", "40.7128,-74.0060"],
  "radiusMiles": 25,
  "searchQueries": ["python", "ai"],
  "startDate": "2026-11-01",
  "endDate": "2026-11-30",
  "groups": ["bostonpython"],
  "freeOnly": false,
  "maxItems": 200
}
```

| Field | What it does |
|---|---|
| `locations` | City names (`Boston, MA`) or `latitude,longitude`. Searches events around each one. |
| `radiusMiles` | Search radius, 1-100 miles (default 25). |
| `searchQueries` | Meetup's own keyword search, run per location. Leave empty to sweep (nearly) every event in the area and dates. |
| `categoryId` | Optional Meetup topic category number (e.g. `546` = Technology). |
| `groups` | Group names or links (`bostonpython`). Returns the group's upcoming events. |
| `includePastGroupEvents` | Also return a group's past events, newest first (back to `startDate` if set). |
| `startDate` / `endDate` | `YYYY-MM-DD`. Default: now to 30 days ahead, up to one year per run. |
| `eventType` | `any`, `inPerson`, `online` or `hybrid`. |
| `keywords` / `excludeKeywords` | Keep or drop events by words in the title, description, group name or topics. |
| `freeOnly`, `minGoing`, `includeDescription` | Free events only; at least N people going; drop the description for smaller output. |
| `maxEventsPerSource`, `maxItems` | Caps per location/keyword or group, and for the whole run (also caps cost; shared fairly across your sources). |

### Output

```json
{
  "id": "311234567",
  "title": "Boston Code and Coffee @ CIC",
  "url": "https://www.meetup.com/boston-code-and-coffee/events/311234567/",
  "startAt": "2026-10-17T12:00:00-04:00", "endAt": "2026-10-17T14:00:00-04:00",
  "startUtc": "2026-10-17T16:00:00+00:00", "timezone": "America/New_York",
  "eventType": "PHYSICAL", "isOnline": false,
  "venueName": "CIC Cambridge @ 1 Broadway", "address": "1 Broadway", "city": "Cambridge", "state": "MA", "country": "US", "postalCode": "02142",
  "latitude": 42.3628, "longitude": -71.0833,
  "groupName": "Boston Code and Coffee", "groupUrlname": "boston-code-and-coffee", "groupUrl": "https://www.meetup.com/boston-code-and-coffee/",
  "groupMembers": 10203, "groupRating": 4.72, "groupRatingCount": 4414, "groupOrganizer": "...", "hosts": ["..."],
  "goingCount": 57, "capacity": 80, "duration": "PT2H", "createdAt": "2026-09-01T17:04:23-04:00",
  "isFree": true, "feeAmount": null, "feeCurrency": null,
  "topics": ["Software Development", "Web Development"],
  "imageUrl": "https://secure.meetupstatic.com/photos/event/...jpeg",
  "description": "...",
  "source": "Boston, MA | tech"
}
```

A `SUMMARY` record in the run's key-value store lists events per source and any source that failed.

### Pricing

**From $0.80 per 1,000 events** on the Free plan, down to $0.40 per 1,000 on Gold and above. No start fee. Keyword, free-only, type and date filters and duplicate removal run before billing, so you pay only for events you keep.

### Compared with filip_cicvarek/meetup-scraper (the most-used Meetup actor)

| | This actor | filip_cicvarek/meetup-scraper |
|---|---|---|
| Price per 1,000 events | **$0.80 Free plan, $0.40 Gold**, no start fee | from $0.50, plus a start fee per run |
| Many places per run | yes: any number of cities or `lat,lon` points, keywords and groups in one run | one city per run |
| A group's upcoming and past events | yes (`groups`, `includePastGroupEvents`) | no |
| A whole city without a keyword | near-complete sweep, past Meetup's ~200-per-search limit | nearby upcoming events |
| Group size, rating, organizer, hosts, RSVPs, capacity | yes | yes |

**Where they still win:** a groups search mode (find groups by keyword, with member counts and founding date), relevance sort, and built-in Notion/Slack delivery.

### Notes and limits

- Only public events are returned. Private groups' events and attendee lists are not accessible.
- Meetup's search returns its most relevant ~200 events per query and window; the actor splits busy date ranges automatically to get past that, so a citywide sweep can take a few minutes.
- City names are looked up with OpenStreetMap; use `latitude,longitude` if a place name is ambiguous.
- A run fails (and costs nothing) if every location or group fails or nothing at all is found.

### Related actors

- [Luma Events Scraper](https://apify.com/tidyharvest/luma-events-scraper): tech, startup and AI events from Luma.
- [Eventbrite Day](https://apify.com/tidyharvest/eventbrite-day): every Eventbrite event in a city for a given day.

# Actor input Schema

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

Search Meetup events around each place: a city like `Boston, MA` or `London, UK`, or exact coordinates like `42.3601,-71.0589`. Leave empty if you only want specific groups.

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

Search radius around each location.

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

Run Meetup's own search for each keyword (e.g. `python`, `hiking`, `startup`). Leave empty to collect (nearly) every event in the area and date range.

## `categoryId` (type: `string`):

Optional Meetup topic category number, e.g. `546` = Technology. Leave empty for all categories.

## `groups` (type: `array`):

Meetup group names or links, e.g. `bostonpython` or `https://www.meetup.com/bostonpython/`. Returns the group's upcoming events.

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

For groups, also return past events (newest first, back to the start date if you set one).

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

YYYY-MM-DD. Defaults to now.

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

YYYY-MM-DD. Defaults to 30 days after the start date (max range: one year).

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

In-person, online or hybrid events only. Default: any.

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

Filter results by words in the title, description, group name or topics. You are billed only for events you keep.

## `excludeKeywords` (type: `array`):

Drop events whose title, description, group name or topics contain any of these words.

## `freeOnly` (type: `boolean`):

Return only events without a fee.

## `minGoing` (type: `integer`):

Keep only events with at least this many people going. Empty = all.

## `includeDescription` (type: `boolean`):

Full event description (Markdown). Turn off for smaller output.

## `maxEventsPerSource` (type: `integer`):

0 or empty = no limit.

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

Hard cap for the whole run (also caps your cost), shared fairly across your groups, locations and search terms: a small source's unused share goes to the next. 0 = no limit.

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

Not needed normally. Use only if Meetup starts refusing requests.

## Actor input object example

```json
{
  "locations": [
    "Boston, MA"
  ],
  "radiusMiles": 25,
  "searchQueries": [
    "tech"
  ],
  "includePastGroupEvents": false,
  "eventType": "any",
  "freeOnly": false,
  "includeDescription": true,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Meetup events, one item per event.

# 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 = {
    "locations": [
        "Boston, MA"
    ],
    "searchQueries": [
        "tech"
    ],
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/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 = {
    "locations": ["Boston, MA"],
    "searchQueries": ["tech"],
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/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 '{
  "locations": [
    "Boston, MA"
  ],
  "searchQueries": [
    "tech"
  ],
  "maxItems": 200
}' |
apify call tidyharvest/meetup-events-scraper --silent --output-dataset

```

## MCP server setup

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