# Meetup & Lu.ma Event Finder by City, Group & Calendar (`dataspryva/meetup-and-lu-ma-event-finder-by-city-group`) Actor

Search, browse, or look up events on Meetup and Lu.ma by city, group, or calendar: dates, venue, organizer, attendee count, photo and RSVP status from one actor and input shape.

- **URL**: https://apify.com/dataspryva/meetup-and-lu-ma-event-finder-by-city-group.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 & Lu.ma Event Finder by City, Group & Calendar

Meetup and Lu.ma host two very different event ecosystems. This actor reads both from one input shape: search by keyword and city, browse a group or calendar, open a specific event URL, or discover what is happening around a city — with pagination, filters, and rich event details.

### What this actor does

- **One actor, two platforms** — set `platform` to `meetup` or `luma` and reuse the same fields
- **Eight intent modes** — keyword search, event lookup, group profile, group/calendar event lists, nearby discovery, trending discovery, and URL auto-routing
- **Full result pages** — Meetup cursor pagination and Lu.ma cursor pagination, not just the first page
- **Useful filters** — dates, event format, radius, minimum attendance, free-only, category, and sort order
- **Rich records** — venue and coordinates, group size, topics, hosts, prices, ticket tiers, and RSVP/guest counts
- **Optional enrichment** — Meetup attendee names/photos and Lu.ma event descriptions/ticket tiers/featured guests, both off by default
- **Monitoring** — `onlyNewSinceLastRun` remembers IDs for the same input and skips them next time
- **Clean data** — empty fields are omitted at every depth; no `null`, `""`, `[]`, or `{}`

No login, cookie, API key, or browser is required.

### Modes

| Mode | Meetup | Lu.ma |
|---|---|---|
| `searchEvents` | Keyword search with location, dates, type, radius, category, attendance | Keyword search, city feed, or category feed |
| `byEvent` | Event URL, `group/eventId` URL, or numeric event ID | Event URL (`lu.ma` or `luma.com`), slug, or `evt-...` ID |
| `byGroup` | Group profile and stats | Calendar/community profile |
| `groupEvents` | Group's upcoming or past events | Calendar's upcoming or past events |
| `byCalendar` | Alias for `groupEvents` | Calendar profile plus its events |
| `discoverNearby` | Recommended events near a location/category | City or nearest featured city feed |
| `discoverTrending` | Recommended events by category/location | Featured city/category feeds |
| `byUrl` | Auto-routes event and group URLs | Auto-routes event and calendar URLs |

### Output per Meetup event

- `id`, `name`, `url` — event identity and link
- `startAt`, `endAt`, `timezone` — scheduling (timezone falls back to the group's timezone)
- `description` — full description from the event payload
- `eventType`, `rsvpState`, `status`, `waitlistMode` — event state
- `imageUrl`, `imageId` — event photo
- `guestCount`, `attendeeCount`, `waitlistCount`, `capacity` — attendance and capacity
- `isFree`, `feeAmount`, `feeCurrency`, `feeAccepts`, `feeRequired` — pricing
- `group`, `groupName`, `groupUrlname`, `groupMemberCount`, `groupCategory` — group summary
- `venueName`, `venueAddress`, `city`, `state`, `country`, `postalCode`, `latitude`, `longitude`, `googleMapsUrl` — venue
- `topics[]` — topic id, name, and urlkey
- `hosts[]` — host name and photo
- `attendees[]` — optional public RSVP names/photos when `includeAttendees` is on (capped at 250)
- `seriesId`, `seriesName` — recurring series, when present
- `recordType`, `platform`, `siteName`, `scrapedAt` — record metadata

### Output per Meetup group

- `id`, `name`, `urlname`, `url`, `timezone`, `description`, `photoUrl`
- `foundedDate`, `city`, `state`, `country`, `latitude`, `longitude`
- `memberCount`, `rating`, `ratingCount`, `isNewGroup`
- `category`, `categoryId`, `categoryUrlkey`, `topics[]`
- `organizer`, `socials` — organizer profile and linked social accounts
- `upcomingEventCount`, `pastEventCount`
- `memberSample[]` — optional public members when `includeMembers` is on

### Output per Lu.ma event

- `id`, `name`, `url`, `slug`, `startAt`, `endAt`, `timezone`
- `description` — full ProseMirror text on detail/enrichment
- `imageUrl`, `eventType`, `locationType`, `waitlistActive`, `hideRsvp`
- `guestCount`, `ticketCount`, `isFree`, `feeAmount`, `maxFeeAmount`, `currency`
- `ticketTiers[]` — tier name, price, currency, type, spots remaining, registration count
- `isSoldOut`, `requireApproval`, `isNearCapacity`, `spotsRemaining`, `registrationAvailability`
- `venues` and `location` fields — `venueName`, `fullAddress`, `venueAddress`, `city`, `state`, `country`, `latitude`, `longitude`
- `hosts[]`, `organizerName`, `featuredGuests[]`
- `calendar`, `calendarName` — calendar identity, socials, website, and location
- `categories[]`, `featuredCity`
- `recordType`, `platform`, `siteName`, `scrapedAt`

### Output per Lu.ma calendar

- `id`, `name`, `slug`, `url`, `description`
- `avatarUrl`, `coverImageUrl`
- `instagram`, `linkedin`, `twitter`, `website`, `socials`
- `timezone`, `city`, `state`, `country`
- `eventCount`, `subscriberCount`, `upcomingEventCount`, `pastEventCount`
- `recordType` (`calendar` or `city`), `platform`, `siteName`, `scrapedAt`

### Output per error record

If a specific URL, slug, or event ID cannot be fetched or parsed, the actor emits an error record rather than silently dropping it:

- `recordType` — `error`
- `platform`, `reason`, `source`, `httpStatus`
- `url`, `slug`, `eventId`, or `groupUrlname` — the identifier that failed
- `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `platform` | select, required | `meetup` | `meetup` or `luma` |
| `mode` | select, required | `searchEvents` | One of the eight modes above |
| `query` | string | – | Keyword; required for Meetup search unless a category is supplied |
| `location` | string | – | City or region used to resolve the search area |
| `lat`, `lng` | number | – | Explicit coordinates; bypasses geocoding |
| `country` | select | – | Optional Meetup country hint |
| `meetupCategory` | select | – | Live Meetup topic category (`all` plus 20 current topics) |
| `lumaCategory` | select | – | Lu.ma category feed (needs a city or coordinates) |
| `eventType` | select | `any` | Meetup: `any`, `physical`, `online`, `hybrid` |
| `sortBy` | select | `relevance` | `relevance`, `dateAsc`, or `dateDesc` |
| `dateFrom`, `dateTo` | string | – | Inclusive date bounds (`YYYY-MM-DD` or ISO date-time) |
| `radiusKm` | integer | – | Meetup search radius, 1–500 km |
| `minAttendees` | integer | – | Minimum RSVPs/guests, 0–100000 |
| `freeOnly` | boolean | `false` | Drop events known to charge |
| `eventPeriod` | select | `upcoming` | `upcoming`, `past`, or `all` for group/calendar modes |
| `urls` | array | `[]` | Meetup or Lu.ma event/group/calendar URLs |
| `slugs` | array | `[]` | Meetup group urlnames or Lu.ma slugs |
| `eventIds` | array | `[]` | Numeric Meetup event IDs (alone or paired with `slugs`) or Lu.ma `evt-...` ids |
| `lumaCity` | select | – | Any of the 87 live Lu.ma featured cities |
| `maxItems` | integer | `50` | Hard cap on records, 1–1000 |
| `includeAttendees` | boolean | `false` | Meetup: add public RSVP names/photos |
| `includeMembers` | boolean | `false` | Meetup groups: add a public member sample |
| `enrichDetails` | boolean | `false` | Lu.ma: fetch detail for descriptions, tiers, featured guests |
| `onlyNewSinceLastRun` | boolean | `false` | Skip IDs already emitted for this exact input |

### Examples

#### Search Meetup events in a city

```json
{
  "platform": "meetup",
  "mode": "searchEvents",
  "query": "tech",
  "location": "san francisco",
  "dateFrom": "2026-11-01",
  "eventType": "physical",
  "maxItems": 50
}
```

#### Browse a Lu.ma city feed with more than one page

```json
{
  "platform": "luma",
  "mode": "discoverNearby",
  "lumaCity": "sf",
  "maxItems": 100
}
```

#### Read a Meetup group's past events

```json
{
  "platform": "meetup",
  "mode": "groupEvents",
  "slugs": ["real-time-analytics-and-ai"],
  "eventPeriod": "past",
  "maxItems": 30
}
```

#### Auto-route mixed Meetup and Lu.ma URLs

```json
{
  "platform": "meetup",
  "mode": "byUrl",
  "urls": [
    "https://www.meetup.com/real-time-analytics-and-ai/events/316657797/",
    "https://luma.com/fireworks-8kmc"
  ],
  "includeAttendees": true
}
```

### Use cases

- Build a combined Meetup + Lu.ma event feed for a city or topic
- Track a community group's or calendar's upcoming and past schedule
- Research venues, prices, hosts, and attendance before attending
- Monitor new events for a saved search with `onlyNewSinceLastRun`
- Compare how a topic is represented across both platforms

### FAQ

**Is this affiliated with Meetup or Lu.ma?**
No. This is an independent actor that reads publicly available data from both platforms and is not operated by or affiliated with either.

**Do I need an account, cookie, or API key?**
No. Every supported path works anonymously and cookielessly; nothing is required beyond the input fields.

**Why does a Lu.ma keyword search stop at 50 results?**
Lu.ma's public keyword search is capped at 50 results per query. For more coverage, split the keyword into narrower terms or use a city or category feed, which supports cursor pagination.

**Can I get past events?**
Yes for Meetup groups (`groupEvents` with `eventPeriod: "past"`) and Lu.ma calendars (`byCalendar`, `groupEvents`, or `eventPeriod`). Meetup keyword search and Lu.ma city/category feeds do not expose past events.

**Why are Lu.ma attendee names missing?**
Lu.ma only publishes counts, featured guests, and first-name previews. The full guest list requires a signed-in user with access to the event, so this actor returns counts and featured guests only.

**Are Meetup attendee names public?**
On many events the public RSVP list is visible and can be included with `includeAttendees`. Some organizers hide it; in that case the field is omitted. Attendee data is opt-in and never part of the small default run.

**Why are some prices or venues missing?**
Hosts can hide prices, and some events are online-only or use an obfuscated address. The actor reports only what the platform discloses; it never invents a price or address.

**What happens if a request is blocked?**
The actor retries politely and, only after a real block, makes one automatic proxy retry. There is no proxy field to configure.

**How many records can one run return?**
Up to `maxItems` (maximum 1000). Coverage depends on what the platform publishes for the query, city, group, or calendar.

# Actor input Schema

## `platform` (type: `string`):

Which platform to query. All modes are HTTP-only and need no login.

## `mode` (type: `string`):

What to scrape: search, specific event/group/calendar URLs, group/calendar event lists, nearby discovery, or auto-routed URLs.

## `query` (type: `string`):

Free-text keyword. Required for Meetup search. Lu.ma keyword search caps at 50 results per run.

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

City, state, or country. Meetup resolves it server-side; Lu.ma resolves the featured city. Examples: `san francisco`, `New York, NY`, `London, UK`.

## `lat` (type: `number`):

Explicit latitude. Bypasses location geocoding and anchors Lu.ma category feeds.

## `lng` (type: `number`):

Explicit longitude. Bypasses location geocoding and anchors Lu.ma category feeds.

## `country` (type: `string`):

Optional ISO country code used when resolving a Meetup location.

## `meetupCategory` (type: `string`):

Browse or filter Meetup by a live topic category. Use `all` with a query for no category filter.

## `lumaCategory` (type: `string`):

Lu.ma category feed. Needs a city or `lat`/`lng` to anchor the feed.

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

Meetup server-side event format filter. Lu.ma location types are not reliable, so Lu.ma ignores this field.

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

Meetup sorts server-side. Lu.ma sorts client-side by start date; relevance keeps source order.

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

Earliest event date (inclusive). Accepts `YYYY-MM-DD` or an ISO date-time.

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

Latest event date (inclusive). Accepts `YYYY-MM-DD` or an ISO date-time.

## `radiusKm` (type: `integer`):

Meetup search radius around the resolved location.

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

Drop events below this RSVP/guest count. Meetup filters server-side; Lu.ma filters client-side.

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

Drop events that are known to charge. Events with an unknown price are kept.

## `eventPeriod` (type: `string`):

Upcoming, past, or both. Past is reliable on Meetup groups and Lu.ma calendars; Lu.ma city/category feeds are upcoming-only.

## `urls` (type: `array`):

One or more Meetup or Lu.ma URLs. `mode=byUrl` auto-routes each one; `byEvent`, `byGroup`, and calendar modes also accept URLs.

## `slugs` (type: `array`):

Meetup group urlnames or Lu.ma event/calendar slugs. For Meetup events, pair index-aligned with `eventIds`.

## `eventIds` (type: `array`):

Numeric Meetup event IDs or Lu.ma `evt-...` ids. Meetup numeric IDs can be used alone or index-aligned with `slugs` (group urlnames).

## `lumaCity` (type: `string`):

Featured Lu.ma city feed. Alternatively supply `location` or `lat`/`lng`.

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

Hard cap on emitted records.

## `includeAttendees` (type: `boolean`):

Add public RSVP names/photos to Meetup events (one extra request per event, capped at 250).

## `includeMembers` (type: `boolean`):

Add a public member sample to Meetup group records (one extra request per group).

## `enrichDetails` (type: `boolean`):

Fetch each Lu.ma event's detail endpoint for description, ticket tiers, and featured guests. Off by default for speed.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember emitted IDs for this exact input and skip them on later runs. The first run emits everything.

## Actor input object example

```json
{
  "platform": "meetup",
  "mode": "searchEvents",
  "query": "tech",
  "location": "san francisco",
  "eventType": "any",
  "sortBy": "relevance",
  "freeOnly": false,
  "eventPeriod": "upcoming",
  "urls": [],
  "slugs": [],
  "eventIds": [],
  "maxItems": 3,
  "includeAttendees": false,
  "includeMembers": false,
  "enrichDetails": false,
  "onlyNewSinceLastRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset of scraped events, groups, calendars, and per-URL errors.

# 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 = {
    "platform": "meetup",
    "mode": "searchEvents",
    "query": "tech",
    "location": "san francisco",
    "eventType": "any",
    "sortBy": "relevance",
    "freeOnly": false,
    "eventPeriod": "upcoming",
    "maxItems": 3,
    "includeAttendees": false,
    "includeMembers": false,
    "enrichDetails": false,
    "onlyNewSinceLastRun": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/meetup-and-lu-ma-event-finder-by-city-group").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 = {
    "platform": "meetup",
    "mode": "searchEvents",
    "query": "tech",
    "location": "san francisco",
    "eventType": "any",
    "sortBy": "relevance",
    "freeOnly": False,
    "eventPeriod": "upcoming",
    "maxItems": 3,
    "includeAttendees": False,
    "includeMembers": False,
    "enrichDetails": False,
    "onlyNewSinceLastRun": False,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/meetup-and-lu-ma-event-finder-by-city-group").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 '{
  "platform": "meetup",
  "mode": "searchEvents",
  "query": "tech",
  "location": "san francisco",
  "eventType": "any",
  "sortBy": "relevance",
  "freeOnly": false,
  "eventPeriod": "upcoming",
  "maxItems": 3,
  "includeAttendees": false,
  "includeMembers": false,
  "enrichDetails": false,
  "onlyNewSinceLastRun": false
}' |
apify call dataspryva/meetup-and-lu-ma-event-finder-by-city-group --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/meetup-and-lu-ma-event-finder-by-city-group"
        }
    }
}
```

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/KE35NpydwUThD8CQf/builds/FFqtvn0WerZ7vwqc7/openapi.json
