Meetup Scraper
Pricing
$2.00 / 1,000 events
Meetup Scraper
Extract upcoming Meetup.com events for any keyword and location: title, start time, venue, hosting group, RSVP count and price. No login, no browser, no persondata. Switch to GROUPS mode for community stats instead.
Pricing
$2.00 / 1,000 events
Rating
0.0
(0)
Developer
Rowfeed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Pull upcoming Meetup.com events for any keyword and location as clean JSON: title, start time, venue, hosting group, RSVP count and price, no login and no browser. Built for event aggregators and calendar apps that need a fresh feed of local meetups, market researchers tracking community activity around a topic, growth/community teams scouting where their audience already gathers, and AI agents and dashboards that need a structured "what's happening near me" answer. Switch to source: GROUPS and get one row per Meetup group instead (name, city, member count, rating) to map the communities behind the events.
Plain HTTPS GETs against Meetup's own public Find page (meetup.com/find/), the same server-rendered page a browser loads, parsed from its embedded JSON - no API key, no cookies, no headless browser.
What you get
- Every event as one row - id, title, URL, start time (converted to UTC), timezone, online/in-person, venue name/city/state/country, hosting group name and URL, RSVP count, price and currency, and the full description.
- Any keyword, any location - run several keywords in one call; Meetup's own location-slug format (
us--ny--New York,us--ca--San Francisco,gb--london--London) picks the search area, and an unrecognized value just falls back to Meetup's nearest match instead of erroring. - A cost cap that actually caps -
maxItemsstops the run once that many rows are billed, across however many keywords you listed.
No personal data, ever
Meetup's Find page never exposes organizer names, attendee lists or member emails/phones to begin with - it's a public search result, not a member directory. This Actor only reads aggregate numbers (an RSVP count, a group's total member count), never the underlying attendee or member records the page's GROUPS query happens to embed for its own UI. If a future Meetup response ever put a person's name in a field this Actor reads, that field would be dropped, not shipped.
Sample row
A real row from a default run (keywords: ["python"], location: "us--ny--New York", source: EVENTS):
{"id": "316297665","title": "Package Your Judgment, Keep Your Intent","url": "https://www.meetup.com/nyhackr/events/316297665/","start_utc": "2026-09-28T23:00:00+00:00","end_utc": null,"timezone": "America/New_York","is_online": false,"event_type": "PHYSICAL","venue_name": "Pless Hall","venue_city": "New York","venue_state": "NY","venue_country": "us","group_name": "New York Open Statistical Programming Meetup","group_url": "https://www.meetup.com/nyhackr/","group_member_count": null,"rsvp_count": 1,"max_tickets": 1,"is_free": false,"price": 7.0,"currency": "USD","description": "External registration required at nyhackr. This month we have a talk on providing judgment to agents...","image_url": "https://secure.meetupstatic.com/photos/event/e/a/1/highres_535863745.jpeg","rsvp_state": "JOIN_OPEN","keyword": "python","scraped_at": "2026-09-11T07:56:22+00:00"}
group_member_count is always null on EVENTS rows - Meetup's event-search response doesn't include it. Switch source to GROUPS and it becomes member_count, populated for every row:
{"id": "15288302","name": "PyData NYC","url": "https://www.meetup.com/pydatanyc","city": "New York","state": "NY","country": "us","member_count": 8007,"rating_average": 4.66,"rating_count": 366,"is_private": false,"status": "PAID","description": "PyData is an educational program of NumFOCUS...","keyword": "python","scraped_at": "2026-09-11T07:56:33+00:00"}
Filters
| Input | Default | What it does |
|---|---|---|
keywords | ["python", "startup"] | Search terms; each is one request against Meetup's Find page. |
location | "us--ny--New York" | Meetup location slug: <country>--<state>--<City Name>. |
source | "EVENTS" | EVENTS for one row per event, GROUPS for one row per Meetup group. |
maxItems | 100 | Stop after this many rows total, across all keywords. |
Pricing
Pay per event, no subscription: $2 per 1,000 rows - every row is billed as one event, whether it is an event (EVENTS run) or a group (GROUPS run). description is the organizer's own unredacted text and may contain contact details the organizer chose to publish. A default run (2 keywords) typically returns 20-40 rows, a few cents. A keyword that turns up nothing near the given location produces no billed rows and no error - the run still succeeds; only a keyword whose request genuinely fails (blocked, network error) counts against it, and only zero rows plus at least one such failure marks the whole run failed.
Use it from your tools
- API and SDKs - call it via the Apify API or the official Python/JavaScript clients: one call to start the run, one to fetch the results as JSON or CSV.
- Schedules - run it daily inside Apify and pipe newly-listed events into Google Sheets, a webhook or your own storage.
- n8n, Make and Zapier - trigger runs and feed extracted events into a workflow through Apify's integration for each.
- AI agents and MCP - eligible for agentic use via Apify's MCP server with pay-per-event pricing, so an agent can call it mid-task and pay only for the events it actually pulls.
Details
- Source:
https://www.meetup.com/find/, Meetup's own public search page, parsed from the__NEXT_DATA__JSON it embeds server-side (the same data the page renders from). No authentication, no proxies, no browser. - One page per keyword: Meetup's Find page carries a real pagination cursor, but only its first results page (roughly 12-20 items) is present in the server-rendered HTML - later pages load client-side through a browser-only GraphQL call this Actor does not make. Run more keywords or a tighter location to widen coverage instead.
- Reliability: 429 and 5xx responses are retried with exponential backoff (5 tries); 404 and 401/403 are never retried; a 200 response without the expected embedded JSON counts as a failure, not a silent empty success.
- Run stats: the
STATSrecord in the run's key-value store holds row/error counts and per-category request-error counts. - Politeness: 0.2 s between requests, 30 s timeout, a User-Agent that names the Actor.
- Not affiliated with Meetup. Built against Meetup's own public search page; no login, no scraping of member-only content.