# Meetup Events Scraper (`maximedupre/meetup`) Actor

Find public Meetup events and groups by keyword, location, or URL. Save structured event, group, and sampled member records with schedules, locations, attendance, fees, hosts, profiles, and source links.

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

## Pricing

from $0.45 / 1,000 events

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

### 🧭 Find public Meetup events and groups

For event researchers, local planners, community builders, and developers, this Actor returns structured public event, group, and sampled member data. Use titles, descriptions, source links, schedules, formats, locations, attendance, fees, topics, hosts, group profiles, and public member details in your own research or data workflow.

- Find nearby public events with **[Free Meetups Near Me](https://apify.com/maximedupre/meetup/examples/free-meetups-near-me)** using a location and optional event filters.
- Browse public groups for **[Social Groups For Adults Near Me](https://apify.com/maximedupre/meetup/examples/social-groups-for-adults-near-me)** by topic and location.
- Explore public group data with **[Free Social Groups For Adults Near Me](https://apify.com/maximedupre/meetup/examples/free-social-groups-for-adults-near-me)** and a local search.
- Find public group options for **[Hobby Clubs To Join Near Me](https://apify.com/maximedupre/meetup/examples/hobby-clubs-to-join-near-me)** with names, locations, and source links.
- Review public Meetup pages for **[Places To Meet New People Near Me](https://apify.com/maximedupre/meetup/examples/places-to-meet-new-people-near-me)** with useful source details.
- Look for local event options through **[Good Places To Meet Up And Talk](https://apify.com/maximedupre/meetup/examples/good-places-to-meet-up-and-talk)** with dates, formats, and locations.
- Explore public Meetup choices for **[How To Meet New Friends As An Adult](https://apify.com/maximedupre/meetup/examples/how-to-meet-new-friends-as-an-adult)** in one focused run.

#### 📚 See event, group, and member records

The default dataset can contain three row shapes: event results, group results, and group member results. Optional fields appear when Meetup publishes them. Public source values are kept as returned, and missing values are not guessed.

**Event rows**

Event rows describe public upcoming Meetup events. They can include the event schedule, status, format, online or venue details, attendance, fees, topics, media, hosts, and the related group.

**Group rows**

Group rows describe public Meetup groups. They can include the group description, location, member count, category, privacy, rating, reviews, and public social links.

**Group member rows**

Group member rows contain publicly listed member profiles sampled from a submitted group. They can include the member name, profile link, username, bio, role, location, join date, photo, and related group.

#### ▶️ Run a focused Meetup search

Choose one result type per run: Events, Groups, or Group members. Events can be found by keyword and location, by location, from event URLs, or from group URLs. Groups can be found by keyword and location or from group URLs. Group members are sampled from group URLs.

**First-match handling**

The Actor saves the first eligible event, group, or member occurrence as soon as it finds it. If the same source item appears again through another keyword, URL, or similar submitted value, the later match is ignored. The saved row keeps the source context from the first match only.

**Limits**

`Maximum results` is an optional positive limit. Leave it empty to return all available records until the source is exhausted. For Group members, the value is the number of member records to sample. The source may provide fewer records than the limit.

#### ⚙️ Input

Choose `resultType` first, then fill the search method and fields that apply to it. Fields for other search choices are ignored.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Chooses `event`, `group`, or `groupMember` rows. |
| `eventDiscoveryMethod` | string | Chooses how to find events: `keywordLocation`, `location`, `eventUrls`, or `groupUrls`. |
| `eventUrls` | object\[] | Public Meetup event page objects to retrieve when the event method is `eventUrls`. |
| `eventUrls[].url` | string | A public Meetup event page URL. |
| `groupDiscoveryMethod` | string | Chooses how to find groups: `keywordLocation` or `groupUrls`. |
| `keywords` | string\[] | Words or phrases for event or group searches that use `keywordLocation`. |
| `location` | object | A city and country, or a latitude and longitude, for supported event and group searches. |
| `location.city` | string | City name used for a location search. |
| `location.country` | string | Country name used with a city search. |
| `location.latitude` | number | Latitude from -90 to 90 for exact location disambiguation. |
| `location.longitude` | number | Longitude from -180 to 180 for exact location disambiguation. |
| `groupUrls` | object\[] | Public Meetup group page objects for group searches, group event searches, or member sampling. |
| `groupUrls[].url` | string | A public Meetup group page URL. |
| `eventFormat` | string | Filters supported event searches by `any`, `online`, `inPerson`, or `hybrid`. Direct event URL runs ignore it. |
| `startDate` | string | Start of an event date range in `YYYY-MM-DD` format. Direct event URL runs ignore it. |
| `endDate` | string | End of an event date range in `YYYY-MM-DD` format. Direct event URL runs ignore it. |
| `radiusKm` | number | Optional search radius in kilometers around the submitted location. |
| `minimumRsvps` | integer | Keeps event search rows with at least this many public RSVPs. Direct event URL runs ignore it. |
| `sortBy` | string | Orders event search rows by `relevance` or `soonest`. Direct event URL runs keep submitted URL order. |
| `maxItems` | integer | Optional positive limit. Leave it empty to return all available records until the source is exhausted. For Group members, this is the number of member records to sample. |

This example is copied from the public input of a successful current-beta default-input run:

```json
{
  "resultType": "event",
  "eventDiscoveryMethod": "keywordLocation",
  "groupDiscoveryMethod": "keywordLocation",
  "keywords": [
    "technology"
  ],
  "location": {
    "city": "San Francisco",
    "country": "United States"
  },
  "maxItems": 100
}
```

#### 🧾 Output

The output schema links to the default dataset. Each dataset row uses one of the three shapes below. Types in the tables are short JSON types, and nested fields use readable dotted paths.

**Run output**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | string | Links to the default dataset view for this run. |

**Event result fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Stable row type, always `event`. |
| `eventId` | string | Meetup's stable identifier for the event. |
| `title` | string | Public event title. |
| `description` | string | Public event description. |
| `url` | string | Public Meetup event page URL. |
| `startTime` | string | Scheduled event start time. |
| `endTime` | string | Scheduled event end time when available. |
| `timezone` | string | Time zone used for the event schedule when available. |
| `status` | string | Public event status. |
| `eventType` | string | Public type of the event. |
| `format` | string | Public event format, such as online or in person. |
| `location` | object | Public online, venue, and geographic details when available. |
| `location.isOnline` | boolean | Whether the event is listed as online. |
| `location.onlineUrl` | string | Public online access URL when Meetup provides it. |
| `location.venue` | object | Public venue details when available. |
| `location.venue.name` | string | Public venue name. |
| `location.venue.address` | string | Public venue street address when available. |
| `location.venue.city` | string | City of the venue. |
| `location.venue.state` | string | State or region of the venue when available. |
| `location.venue.country` | string | Country of the venue when available. |
| `location.venue.postalCode` | string | Postal code of the venue when available. |
| `location.city` | string | Event city when Meetup provides it. |
| `location.state` | string | Event state or region when available. |
| `location.country` | string | Event country when available. |
| `location.latitude` | number | Public event latitude when available. |
| `location.longitude` | number | Public event longitude when available. |
| `attendance` | object | Public attendance details when available. |
| `attendance.rsvpCount` | integer | Public RSVP count. |
| `attendance.waitlistCount` | integer | Public waitlist count. |
| `attendance.capacity` | integer | Public event capacity. |
| `attendance.guestCount` | integer | Public guest count. |
| `fee` | object | Public fee details when available. |
| `fee.isFree` | boolean | Whether Meetup lists the event as free. |
| `fee.amount` | number | Public event fee amount. |
| `fee.currency` | string | Currency for the public event fee. |
| `topics` | string\[] | Public topic tags for the event. |
| `media` | object\[] | Public featured event media links. |
| `media[].url` | string | Public media URL. |
| `media[].type` | string | Media type when Meetup provides it. |
| `recurringSeries` | object | Recurring-series details when published. |
| `recurringSeries.seriesId` | string | Meetup's stable recurring-series identifier. |
| `hosts` | object\[] | Public event organizers and hosts. |
| `hosts[].name` | string | Public organizer or host name. |
| `hosts[].profileUrl` | string | Public organizer or host profile URL when available. |
| `hosts[].role` | string | Public event role when available. |
| `group` | object | Public Meetup group associated with the event when available. |
| `group.groupId` | string | Stable identifier for the associated group. |
| `group.name` | string | Public name of the associated group. |
| `group.url` | string | Public page for the associated group. |

This genuine event row came from the current beta run that searched events from a public group URL:

```json
{
  "resultType": "event",
  "eventId": "316616396",
  "title": "Member Meeting: The Future of Our Space",
  "description": "Hacker Dojo is entering a pivotal chapter, and we need the community in the room for this one. We have a new facility!\n\nFor 17 years, this has been the place where founders met co-founders, engineers learned new skills, and ideas became real. Staff will share an important update on where things stand and what comes next, including a new initiative that will shape Hacker Dojo's future.\n\nThis is a meeting for community members who care about what happens here. If you've ever built something, learned something, or found your people at Hacker Dojo, this is the moment to show up.\n\n**What to expect:**\n\n* A direct update on where things stand\n* A look at what's next for Hacker Dojo\n* How you can be part of shaping it\n* Open floor for questions and ideas\n\nYour presence matters more than you think. Let's talk about it together.",
  "url": "https://www.meetup.com/hackerdojo/events/316616396/",
  "startTime": "2026-09-24T01:00:00.000Z",
  "endTime": "2026-09-24T03:00:00.000Z",
  "status": "ACTIVE",
  "eventType": "HYBRID",
  "timezone": "America/Los_Angeles",
  "format": "hybrid",
  "location": {
    "isOnline": false,
    "venue": {
      "name": "Hacker Dojo",
      "address": "855 Maude Ave",
      "city": "Mountain View",
      "state": "CA",
      "country": "us",
      "postalCode": "95054"
    },
    "city": "Mountain View",
    "state": "CA",
    "country": "us",
    "latitude": 37.396255,
    "longitude": -122.04907
  },
  "attendance": {
    "rsvpCount": 5,
    "waitlistCount": 0,
    "capacity": 0,
    "guestCount": 0
  },
  "fee": {
    "isFree": true
  },
  "topics": [
    "Community",
    "Coworking",
    "Hackers and Makers"
  ],
  "media": [
    {
      "url": "https://secure.meetupstatic.com/photos/event/7/4/7/9/highres_535349817.jpeg",
      "type": "PhotoInfo"
    }
  ],
  "hosts": [
    {
      "name": "Hacker Dojo",
      "profileUrl": "https://www.meetup.com/members/252819436/",
      "role": "superOrganizer"
    }
  ],
  "group": {
    "groupId": "14051172",
    "name": "Hacker Dojo",
    "url": "https://www.meetup.com/hackerdojo"
  }
}
```

**Group result fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Stable row type, always `group`. |
| `groupId` | string | Meetup's stable identifier for the group. |
| `name` | string | Public group name. |
| `url` | string | Public Meetup group page URL. |
| `description` | string | Public group description. |
| `location` | object | Public group location details when available. |
| `location.city` | string | Group city when available. |
| `location.state` | string | Group state or region when available. |
| `location.country` | string | Group country when available. |
| `location.latitude` | number | Public group latitude when available. |
| `location.longitude` | number | Public group longitude when available. |
| `memberCount` | integer | Public number of group members. |
| `category` | string | Public group category. |
| `privacy` | string | Public group privacy setting. |
| `rating` | number | Public group rating when available. |
| `reviewCount` | integer | Public number of group reviews. |
| `socialLinks` | object\[] | Public social links for the group. |
| `socialLinks[].platform` | string | Social platform name. |
| `socialLinks[].url` | string | Public social page URL. |

This genuine group row came from the current beta run that searched public groups by keyword and location:

```json
{
  "resultType": "group",
  "groupId": "37356207",
  "name": "Qnifi Quantum Technology Meetup Group",
  "url": "https://www.meetup.com/qnifi-quantum-meetup-group",
  "description": "A place to share, demonstrate and discover real quantum technology solutions, tools and concepts with experts and enthusiasts.",
  "location": {
    "city": "San Francisco",
    "state": "CA",
    "country": "us"
  },
  "memberCount": 2,
  "privacy": "public",
  "rating": 0,
  "reviewCount": 0
}
```

**Group member result fields**

| Field | Type | What it does |
| --- | --- | --- |
| `resultType` | string | Stable row type, always `groupMember`. |
| `memberId` | string | Meetup's stable identifier for the member. |
| `name` | string | Public member name. |
| `profileUrl` | string | Public member profile URL when available. |
| `username` | string | Public member username when available. |
| `bio` | string | Public member profile bio when available. |
| `photoUrl` | string | Public member profile photo URL when available. |
| `role` | string | Public group role when available. |
| `location` | object | Public member location when available. |
| `location.city` | string | Member city when available. |
| `joinedAt` | string | Date and time when the member joined the group, when available. |
| `group` | object | Public group connected to the member when available. |
| `group.groupId` | string | Stable identifier for the related group. |
| `group.name` | string | Public name of the related group. |
| `group.url` | string | Public page for the related group. |

This genuine group member row came from the current beta run that sampled public members from a group URL:

```json
{
  "resultType": "groupMember",
  "memberId": "179544352",
  "name": "Sander",
  "profileUrl": "https://www.meetup.com/members/179544352/",
  "username": "hyperabsolute",
  "bio": "For fun: I hike, sail, run, make music, & practice Qigong yoga (among other things). To make a living: I do real estate brokerage and technology consulting (marketing, CX/UX design, and product management). Here to discover life & to meet hip people.",
  "photoUrl": "https://secure.meetupstatic.com/photos/member/a/c/7/e/highres_307244158.jpeg",
  "role": "ORGANIZER",
  "location": {
    "city": "Los Angeles"
  },
  "joinedAt": "2021-09-29T00:09:13.000Z",
  "group": {
    "groupId": "35905177",
    "name": "Pacific Sailing Crew Seekers",
    "url": "https://www.meetup.com/sailing"
  }
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. An `Event`, `Group`, or `Group member` charge event applies when the matching public row is saved to the dataset. The current event price is shown in the Store pricing panel. The number of saved rows depends on your input and the public source data.

#### 🔌 Integrations

Use the Apify API to start runs, read the default dataset, or pass structured rows into your own workflow. Apify also provides standard dataset export options.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Which result type should I choose?

Choose Events for upcoming event data, Groups for public group profiles, or Group members for publicly listed member profiles sampled from a group URL.

##### Can I find events without a keyword?

Yes. Choose the Location method and provide a city and country or a latitude and longitude. You can also start from a public group URL or event URL.

##### Can I submit direct event or group URLs?

Yes. Use Event URLs for public event pages and Group URLs for public group pages. Event filters such as format and date range do not change a direct event URL run.

##### What happens when I leave Maximum results empty?

The Actor returns all available records until the source is exhausted. The source may still provide fewer records than you expect, and Group members are sampled according to the available public member data.

##### How are duplicate records handled?

The first eligible event, group, or member occurrence is saved immediately. A later match from another keyword, URL, or similar submitted value is ignored, so the saved row keeps only the first match's source context.

##### What happens when Meetup does not show an optional field?

That field is left out of the row. The Actor does not guess missing descriptions, locations, attendance, fees, hosts, or profile details.

##### Does it read private or login-only Meetup pages?

No. It reads public Meetup data that is available to the run. Private, member-only, or login-gated details are outside the Actor's scope.

##### Does it return attendee identities or private contact details?

No. Event rows can include public attendance counts, and group member mode can return publicly listed member profiles. Private attendee identities, email addresses, and phone numbers are outside the scope.

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

No. The Actor is designed to read public Meetup pages without a Meetup account, login, or API key.

##### Can I combine separate search setups in one run?

No. Use one result type and one coherent search setup per run. Run separate jobs for materially different keyword, location, URL, or filter settings.

##### Can it join groups or register people for events?

No. It reads public data only. It does not join groups, register for events, or manage RSVPs.

### 📝 Changelog

**v0.0** (22-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~meetup/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [10times Events Scraper](https://apify.com/maximedupre/10times-events-scraper) for public trade show and conference data outside Meetup.
- [Partiful Events Scraper](https://apify.com/maximedupre/partiful) for public Partiful event pages, host profiles, and RSVP signals.
- [LinkedIn Events Scraper](https://apify.com/maximedupre/linkedin-events) for public professional event listings and organizer details.
- [Facebook Group Profile Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper) for public Facebook group profiles and membership details.
- [WhatsApp Group Links Scraper](https://apify.com/maximedupre/whatsapp-group-links) for public WhatsApp group and Channel invite links found by topic or directory.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `resultType` (type: `string`):

Choose the kind of public Meetup records to return.

## `eventDiscoveryMethod` (type: `string`):

Choose how to find public Meetup events. Search choices find upcoming events, and URL choices retrieve the public pages you submit. Use one event form per run. The default is Keyword and location.

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

Enter public Meetup event page URLs. Use this when Find events by is set to Event URLs.

## `groupDiscoveryMethod` (type: `string`):

Choose how to find public Meetup groups. Use Keyword and location to search or Group URLs to read supplied pages. Use one group form per run. The default is Keyword and location.

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

One or more words or phrases. Used by Events with Keyword and location and Groups with Keyword and location. Other choices ignore this field.

## `location` (type: `object`):

Enter a city and country, or latitude and longitude. Used by Events with Keyword and location, Events by Location, and Groups with Keyword and location. Other choices ignore this field.

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

Enter public Meetup group page URLs. Events with Group URLs, Groups with Group URLs, and Group members use this field. Other choices ignore it.

## `eventFormat` (type: `string`):

Filter event searches by format. This applies to Events with Keyword and location, Events by Location, and Events with Group URLs. Direct Event URL runs ignore this field.

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

Start of the date range for event searches. Use YYYY-MM-DD with End date. Direct Event URL runs ignore this field.

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

End of the date range for event searches. Use YYYY-MM-DD with Start date. Direct Event URL runs ignore this field.

## `radiusKm` (type: `number`):

Optional radius in kilometers around the submitted Location. Applies to Events with Keyword and location and Events by Location.

## `minimumRsvps` (type: `integer`):

Return only events with at least this many public RSVPs. Applies to event searches and not direct Event URL runs.

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

Choose the order for event search results. Direct Event URL runs keep submitted URL order.

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

Optional positive limit on records returned in this run. Leave it empty to return all available records until the source is exhausted. For Group members, this is the number of member records to sample.

## Actor input object example

```json
{
  "resultType": "event",
  "eventDiscoveryMethod": "keywordLocation",
  "groupDiscoveryMethod": "keywordLocation",
  "keywords": [
    "technology"
  ],
  "location": {
    "city": "San Francisco",
    "country": "United States"
  },
  "maxItems": 100
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "resultType": "event",
    "eventDiscoveryMethod": "keywordLocation",
    "keywords": [
        "technology"
    ],
    "location": {
        "city": "San Francisco",
        "country": "United States"
    },
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/meetup").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 = {
    "resultType": "event",
    "eventDiscoveryMethod": "keywordLocation",
    "keywords": ["technology"],
    "location": {
        "city": "San Francisco",
        "country": "United States",
    },
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/meetup").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 '{
  "resultType": "event",
  "eventDiscoveryMethod": "keywordLocation",
  "keywords": [
    "technology"
  ],
  "location": {
    "city": "San Francisco",
    "country": "United States"
  },
  "maxItems": 100
}' |
apify call maximedupre/meetup --silent --output-dataset

```

## MCP server setup

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

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/MZjyJfki71HNMDWT5/builds/vWef1dXVUY08j2V8f/openapi.json
