Skip to main content
RapidDev - Software Development Agency
bolt-ai-integrationsBolt Chat + API Route

How to Integrate Bolt.new with Meetup

Integrate Meetup with Bolt.new using Meetup's GraphQL API through a Next.js API route. Meetup migrated from REST to GraphQL in 2021 — fetch events by location or topic using GraphQL queries, display group details and RSVP counts, and generate event calendar views. Meetup migrated to OAuth 2.0 for authentication; Meetup Pro subscription is required for managing events via API. Basic event search is accessible on free accounts.

What you'll learn

  • How to set up Meetup OAuth 2.0 and make authenticated GraphQL API queries
  • How Meetup's GraphQL API differs from REST and how to write effective event search queries
  • How to build an event discovery interface with location and topic filtering
  • How to display group calendars and upcoming event schedules from Meetup data
  • How to handle RSVPs and group membership through the Meetup API
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate17 min read20 minutesOtherApril 2026RapidDev Engineering Team
TL;DR

Integrate Meetup with Bolt.new using Meetup's GraphQL API through a Next.js API route. Meetup migrated from REST to GraphQL in 2021 — fetch events by location or topic using GraphQL queries, display group details and RSVP counts, and generate event calendar views. Meetup migrated to OAuth 2.0 for authentication; Meetup Pro subscription is required for managing events via API. Basic event search is accessible on free accounts.

Build a Meetup Event Discovery App with Bolt.new

Meetup connects over 40 million members with local communities through in-person and virtual events across virtually every interest category — technology meetups, running clubs, language exchanges, board game nights, and professional networking events. The platform is particularly valuable for tech and startup communities, where Meetup groups provide regular networking and learning opportunities. For applications serving local communities, event discovery, or professional networking, integrating Meetup data can surface high-value real-world events to your users.

Meetup migrated from a traditional REST API to GraphQL in 2021. This means all data queries are sent as GraphQL query strings to a single endpoint (https://api.meetup.com/gql) rather than multiple REST endpoints. The GraphQL approach is more flexible — you request exactly the fields you need for each component — but requires familiarity with GraphQL query syntax. The Meetup API supports querying events by location radius, keyword, topic category, date range, and group URL name.

Authentication uses OAuth 2.0 with a standard authorization code flow. For public event search (finding events near a location without user-specific data), some Meetup API queries work with an OAuth client credentials token or even a consumer key. For user-specific operations — managing RSVPs, creating events (Pro accounts), or accessing a user's group memberships — users must authorize through the three-legged OAuth flow. All API calls must be proxied through Next.js API routes to avoid CORS errors in the browser.

Integration method

Bolt Chat + API Route

Meetup's GraphQL API is accessed through Next.js API routes that proxy GraphQL queries to api.meetup.com/gql, keeping OAuth tokens server-side and handling CORS. Authentication uses OAuth 2.0 with the authorization code flow for user-specific actions (RSVPs, group management) or a server-to-server key for public event discovery. The GraphQL query pattern differs from REST but provides flexible data fetching. User-facing OAuth redirects require a deployed URL for the callback; public event search works in the Bolt WebContainer preview.

Prerequisites

  • A Meetup account at https://www.meetup.com (free account supports basic API access)
  • A Meetup OAuth Consumer Key and Secret — register at https://www.meetup.com/api/oauth/list/ (requires clicking 'Register a new OAuth Consumer')
  • For RSVP management and event creation: a Meetup Pro subscription ($29.99/month per group)
  • A Bolt.new account with a Next.js project open
  • Basic familiarity with GraphQL query syntax

Step-by-step guide

1

Register a Meetup OAuth Consumer and Get Credentials

To use Meetup's API, you need to register an OAuth consumer application. Go to meetup.com/api/oauth/list/ while logged into your Meetup account and click 'Register a new OAuth Consumer'. Fill in the application name, description, and website URL. For the Redirect URI, enter your deployed URL since the WebContainer preview URL changes each session — use https://your-app.netlify.app/api/meetup/callback for now (you can update this after deployment, or use localhost:3000 for local development). After registering, Meetup provides a Consumer Key and Consumer Secret. These are your OAuth 2.0 client credentials — the Consumer Key is the client_id and the Consumer Secret is the client_secret in OAuth terminology. Save both in your .env file. Meetup's OAuth 2.0 uses the same authorization code flow as most OAuth providers. The difference from many APIs is that Meetup is transitioning its GraphQL API access requirements. As of 2024-2025, some GraphQL queries for public data (event search by location) can be made with a server-to-server access token obtained via the OAuth client credentials grant. For user-specific operations (RSVPs, managing events, accessing member data), you need an access token authorized by the user. For development and testing in Bolt's WebContainer preview, focus on the client credentials approach first — it works for public event search and does not require a redirect callback. You can build and test the event discovery features entirely in the WebContainer, then add the user OAuth flow after deploying to Netlify for features that need it.

.env
1# .env add to project root in Bolt
2# From: meetup.com/api/oauth/list/ Register new OAuth Consumer
3MEETUP_CONSUMER_KEY=your_consumer_key
4MEETUP_CONSUMER_SECRET=your_consumer_secret
5# Access token for server-to-server / public API queries
6# Obtain via client credentials grant (see step 2)
7MEETUP_ACCESS_TOKEN=your_access_token
8# For user OAuth flow (update after deployment)
9MEETUP_REDIRECT_URI=https://your-app.netlify.app/api/meetup/callback

Pro tip: Meetup's API has rate limits: 200 requests per hour for authenticated requests. For event discovery pages with multiple searches, cache results in Supabase or Next.js in-memory cache with a 10-15 minute TTL to stay well within rate limits.

Expected result: Meetup OAuth Consumer is registered with Consumer Key and Secret saved in .env. You have noted your redirect URI for the callback setup in a later step.

2

Build a GraphQL Client for Meetup API

Meetup's GraphQL API endpoint is https://api.meetup.com/gql. Unlike REST APIs where each resource has a different URL, all GraphQL queries go to this single endpoint as POST requests with a JSON body containing the query string and optional variables. Create a reusable GraphQL client utility that handles the authentication header and request structure. The basic Meetup GraphQL query structure uses named queries that accept input objects. For event search, the key query is keywordSearch which accepts a SearchConnectionInput with fields for query (keyword), lat and lon (coordinates), radius (miles), and first (number of results). The response shape matches your query structure exactly — this is GraphQL's key advantage. You request only the fields you need, and Meetup returns exactly those fields. To convert a city name to coordinates for the radius search, use a geocoding API like Google Maps Geocoding or a free alternative like the Open Meteo geocoding API or OpenStreetMap's Nominatim. Alternatively, provide a lat/lon input in your search UI — many users are comfortable entering their city name and searching. All API calls go through your Next.js API route to avoid CORS. The route constructs the GraphQL query, adds the Bearer token from environment variables, posts to api.meetup.com/gql, and returns the formatted results to your frontend. This pattern works in Bolt's WebContainer during development since it only requires outbound HTTP calls — incoming webhooks are not used by the Meetup API. After deployment to Netlify or Bolt Cloud, the same code runs unchanged in a proper server environment.

Bolt.new Prompt

Build a Meetup GraphQL client at lib/meetup-client.ts. Create a meetupQuery function that accepts a GraphQL query string and variables object, makes a POST request to https://api.meetup.com/gql with Authorization Bearer token from process.env.MEETUP_ACCESS_TOKEN, and returns the data. Create an API route at app/api/meetup/events/route.ts that accepts query params for lat, lon, keyword, and radius. Use the meetupQuery function with the keywordSearch GraphQL query to find events. Return each event with: id, title, dateTime, venue (name, city), group (name, urlname), eventUrl, going (RSVP count), and description. Test with a hardcoded location first.

Paste this in Bolt.new chat

lib/meetup-client.ts
1// lib/meetup-client.ts
2export interface MeetupEvent {
3 id: string;
4 title: string;
5 dateTime: string;
6 endTime?: string;
7 eventUrl: string;
8 going: number;
9 description?: string;
10 venue?: {
11 name: string;
12 address?: string;
13 city?: string;
14 state?: string;
15 };
16 group: {
17 id: string;
18 name: string;
19 urlname: string;
20 city: string;
21 };
22}
23
24export async function meetupQuery<T>(
25 query: string,
26 variables: Record<string, unknown> = {}
27): Promise<T> {
28 const token = process.env.MEETUP_ACCESS_TOKEN;
29 if (!token) {
30 throw new Error('MEETUP_ACCESS_TOKEN not configured');
31 }
32
33 const res = await fetch('https://api.meetup.com/gql', {
34 method: 'POST',
35 headers: {
36 Authorization: `Bearer ${token}`,
37 'Content-Type': 'application/json',
38 },
39 body: JSON.stringify({ query, variables }),
40 });
41
42 if (!res.ok) {
43 throw new Error(`Meetup API error: ${res.status} ${res.statusText}`);
44 }
45
46 const { data, errors } = await res.json();
47
48 if (errors?.length) {
49 throw new Error(`Meetup GraphQL error: ${errors[0].message}`);
50 }
51
52 return data;
53}
54
55// Meetup GraphQL queries
56export const EVENT_SEARCH_QUERY = `
57 query SearchEvents($input: SearchConnectionInput!, $first: Int) {
58 keywordSearch(input: $input, filter: { upcoming: true }) {
59 pageInfo {
60 hasNextPage
61 endCursor
62 }
63 edges {
64 node {
65 id
66 result {
67 ... on Event {
68 id
69 title
70 dateTime
71 endTime
72 eventUrl
73 going
74 description
75 venue {
76 name
77 address
78 city
79 state
80 }
81 group {
82 id
83 name
84 urlname
85 city
86 }
87 }
88 }
89 }
90 }
91 }
92 }
93`;
94
95export const GROUP_EVENTS_QUERY = `
96 query GroupEvents($urlname: String!) {
97 groupByUrlname(urlname: $urlname) {
98 id
99 name
100 description
101 city
102 memberships {
103 count
104 }
105 upcomingEvents(input: { first: 10 }) {
106 edges {
107 node {
108 id
109 title
110 dateTime
111 duration
112 going
113 eventUrl
114 description
115 venue {
116 name
117 address
118 city
119 }
120 }
121 }
122 }
123 }
124 }
125`;

Pro tip: Meetup's GraphQL schema uses union types for search results — the keywordSearch result can be an Event, a Group, or other types. Always use inline fragments (... on Event) to access event-specific fields, as shown in the EVENT_SEARCH_QUERY above.

Expected result: The Meetup GraphQL client successfully queries the API. The /api/meetup/events route returns event search results when called with lat/lon and keyword parameters from the Bolt preview.

3

Build the Event Discovery Interface

With the GraphQL client working, build the event discovery UI. The core interface consists of a search bar where users enter a location (city name or address), keyword filter chips for common categories (Tech, Design, Startup, Sports, Arts), and a results grid showing event cards. For location-based search, convert the user's city input to lat/lon coordinates. A clean approach is to use the browser's Geolocation API (navigator.geolocation.getCurrentPosition) for automatic location detection, with a manual city search as fallback. For city-to-coordinates conversion, the OpenStreetMap Nominatim API is free and doesn't require an API key: GET https://nominatim.openstreetmap.org/search?q={city}&format=json returns lat/lon for a city name. The event card design should show the most scannable information first: event date and time (formatted for the local timezone), event title, group name, venue location, and RSVP count. A 'View on Meetup' button opens the event URL in a new tab — this is the standard approach since Meetup handles event registration on their platform. For the keyword filter chips, common tech community searches include: 'JavaScript', 'Python', 'startup', 'UX design', 'data science', 'AI', 'mobile'. Each chip updates the search query and triggers a new API call. Debounce the location search input to avoid making API calls on every keystroke — wait 500ms after the user stops typing before fetching results. Results load quickly from the Meetup API (typically 200-400ms), so users see data within about a second of entering a location.

Bolt.new Prompt

Build a Meetup event discovery page at app/events/page.tsx. Add a location search input that calls the Nominatim geocoding API to convert city names to lat/lon coordinates. Add keyword filter chips for Tech, JavaScript, Python, Startup, Design, and AI. When location is entered, call /api/meetup/events with lat, lon, keyword, and radius=25. Display results as event cards using shadcn/ui Card components with: date badge (colored by how soon the event is), event title, group name with a group icon, venue name and city, and going count. Show a 'View on Meetup' button that opens eventUrl in a new tab. Include loading skeletons while fetching and an empty state when no events are found for the location.

Paste this in Bolt.new chat

app/api/meetup/events/route.ts
1// app/api/meetup/events/route.ts
2import { NextResponse } from 'next/server';
3import { meetupQuery, EVENT_SEARCH_QUERY } from '@/lib/meetup-client';
4
5interface SearchEdge {
6 node: {
7 id: string;
8 result: {
9 id?: string;
10 title?: string;
11 dateTime?: string;
12 eventUrl?: string;
13 going?: number;
14 description?: string;
15 venue?: { name: string; city: string };
16 group?: { name: string; urlname: string; city: string };
17 };
18 };
19}
20
21export async function GET(request: Request) {
22 try {
23 const { searchParams } = new URL(request.url);
24 const lat = parseFloat(searchParams.get('lat') || '37.7749');
25 const lon = parseFloat(searchParams.get('lon') || '-122.4194');
26 const keyword = searchParams.get('keyword') || 'tech';
27 const radius = parseFloat(searchParams.get('radius') || '25');
28
29 const data = await meetupQuery<{
30 keywordSearch: { edges: SearchEdge[] };
31 }>(EVENT_SEARCH_QUERY, {
32 input: {
33 query: keyword,
34 lat,
35 lon,
36 radius,
37 source: 'EVENTS',
38 },
39 });
40
41 const events = data.keywordSearch.edges
42 .map(edge => edge.node.result)
43 .filter(r => r.title && r.dateTime); // Filter to Event type results
44
45 return NextResponse.json({ events });
46 } catch (error) {
47 const message = error instanceof Error ? error.message : 'Search failed';
48 return NextResponse.json({ error: message }, { status: 500 });
49 }
50}

Pro tip: The Meetup GraphQL keywordSearch can return mixed results — Events, Groups, and possibly other content types. Filter by checking if required Event fields (title, dateTime) exist after the ... on Event inline fragment. Groups appear in search results when they match the keyword even if they have no upcoming events.

Expected result: The event discovery page shows upcoming Meetup events near the searched location in the Bolt preview. Keyword filter chips update the search results. Each event card shows date, title, group, and venue with a working link to Meetup.

4

Implement OAuth for User-Specific Features and Deploy

For features that require user authorization — RSVPs, creating events (Pro), accessing private group data — implement Meetup's three-legged OAuth flow. As established earlier, this requires a publicly accessible redirect URI, which means deploying to Netlify or Bolt Cloud before testing. Create an OAuth initiation route at /api/meetup/auth that redirects to Meetup's authorization endpoint: https://secure.meetup.com/oauth2/authorize with your Consumer Key, redirect_uri, response_type=code, and the required scopes. Meetup OAuth scopes include: ageless (basic profile), basic (group memberships), rsvp (RSVP management), and organizer (event management for Pro accounts). Request only the scopes you need. Create a callback handler at /api/meetup/callback that receives the authorization code, exchanges it for tokens at https://secure.meetup.com/oauth2/access, stores the access token and refresh token securely (HttpOnly cookie or Supabase session), and redirects back to your app. The access token is long-lived for Meetup (unlike many OAuth providers), but implement refresh token support to handle expiry gracefully. After deployment, test the complete flow: click 'Connect Meetup' → Meetup login page → authorize → back to your app with the user's data visible. The client credentials approach (using MEETUP_ACCESS_TOKEN for public data) works in both development and production. The three-legged user OAuth is production-only due to the redirect URI requirement. Meetup's rate limit is 200 requests per hour — cache event data for 15-minute windows to avoid hitting this limit on busy discovery pages.

Bolt.new Prompt

Implement Meetup OAuth 2.0 in Next.js. Create app/api/meetup/auth/route.ts that redirects to https://secure.meetup.com/oauth2/authorize with client_id (MEETUP_CONSUMER_KEY), redirect_uri (MEETUP_REDIRECT_URI), response_type=code, and scope=basic+rsvp. Store a random state in an HttpOnly cookie. Create app/api/meetup/callback/route.ts that validates state, exchanges code for tokens at https://secure.meetup.com/oauth2/access using MEETUP_CONSUMER_KEY and MEETUP_CONSUMER_SECRET, stores the access token in an HttpOnly cookie, and redirects to /events. Add a ConnectMeetup button component that shows when no token exists, with a 'Connected as {name}' indicator after auth.

Paste this in Bolt.new chat

app/api/meetup/callback/route.ts
1// app/api/meetup/callback/route.ts
2import { NextResponse } from 'next/server';
3import { cookies } from 'next/headers';
4
5export async function GET(request: Request) {
6 const { searchParams } = new URL(request.url);
7 const code = searchParams.get('code');
8 const state = searchParams.get('state');
9 const storedState = cookies().get('meetup_oauth_state')?.value;
10
11 if (!code) {
12 return NextResponse.json({ error: 'No authorization code' }, { status: 400 });
13 }
14
15 if (state !== storedState) {
16 return NextResponse.json({ error: 'Invalid state parameter' }, { status: 400 });
17 }
18
19 const tokenRes = await fetch('https://secure.meetup.com/oauth2/access', {
20 method: 'POST',
21 headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
22 body: new URLSearchParams({
23 client_id: process.env.MEETUP_CONSUMER_KEY!,
24 client_secret: process.env.MEETUP_CONSUMER_SECRET!,
25 grant_type: 'authorization_code',
26 redirect_uri: process.env.MEETUP_REDIRECT_URI!,
27 code: code!,
28 }),
29 });
30
31 if (!tokenRes.ok) {
32 const error = await tokenRes.text();
33 return NextResponse.json({ error: `Token exchange failed: ${error}` }, { status: 500 });
34 }
35
36 const { access_token, refresh_token, expires_in } = await tokenRes.json();
37
38 const response = NextResponse.redirect(new URL('/events', request.url));
39
40 response.cookies.set('meetup_token', access_token, {
41 httpOnly: true,
42 secure: process.env.NODE_ENV === 'production',
43 maxAge: expires_in || 86400,
44 });
45
46 // Store refresh token more persistently (consider Supabase for long-term storage)
47 if (refresh_token) {
48 response.cookies.set('meetup_refresh', refresh_token, {
49 httpOnly: true,
50 secure: process.env.NODE_ENV === 'production',
51 maxAge: 60 * 60 * 24 * 30, // 30 days
52 });
53 }
54
55 return response;
56}

Pro tip: After deployment, update the MEETUP_REDIRECT_URI environment variable on Netlify to match your deployed URL, and also update the redirect URI in your Meetup OAuth consumer settings at meetup.com/api/oauth/list/. Both must match exactly for the callback to succeed.

Expected result: After deploying to Netlify and updating the redirect URI, the Meetup OAuth flow completes successfully. Users are redirected to Meetup's login, authorize the app, and return to the events page with their token stored for API calls.

Common use cases

Local Tech Event Discovery Widget

Build an event discovery widget for a developer community site that shows upcoming tech meetups within a specified radius of the user's city. Uses Meetup's GraphQL API to search events by keyword (JavaScript, Python, startup, etc.) and location, displaying upcoming events with group name, date, location, and RSVP count.

Bolt.new Prompt

Build a Meetup event discovery page in Next.js. Create an API route at app/api/meetup/events/route.ts that accepts query params for location (city name or lat/lon), keyword, and radius (miles). Use the Meetup GraphQL API at https://api.meetup.com/gql with an Authorization header using a Bearer token from process.env.MEETUP_ACCESS_TOKEN. Write a GraphQL query to search for events: use the keywordSearch query with input fields for query, lat, lon, radius, and first (limit). Return event name, dateTime, venue name, group name, eventUrl, and going count. Build a discovery page at /events with a location search input, keyword filter chips for Tech/Design/Startup/Gaming, and an event card grid showing the results.

Copy this prompt to try it in Bolt.new

Group Calendar and Event Schedule

Display the full event schedule for a specific Meetup group — upcoming events with dates, descriptions, and RSVP counts. Ideal for embedding a community group's calendar in their own website, giving members a single place to see all upcoming gatherings without leaving the site.

Bolt.new Prompt

Create a Meetup group calendar component for Next.js. Build an API route at app/api/meetup/group/[groupUrlName]/events/route.ts that fetches upcoming events for a group using the Meetup GraphQL API. Query the groupByUrlname field with the urlname from params, fetching upcomingEvents with name, dateTime, duration, description, and going (RSVP count). Build a calendar-style page at /community/[groupUrlName] showing events in a list sorted by date, with event cards including date/time badge, title, description excerpt, venue, and RSVP count. Include a 'View on Meetup' button for each event.

Copy this prompt to try it in Bolt.new

RSVP Manager for Meetup Pro Groups

Build an RSVP management dashboard for Meetup Pro organizers to view attendee lists, send messages to attendees, and track attendance across multiple events. Requires Meetup Pro subscription and three-legged OAuth for organizer-level access.

Bolt.new Prompt

Create an RSVP management dashboard for Meetup organizers in Next.js. After implementing the OAuth callback flow, build an API route app/api/meetup/events/[eventId]/rsvps/route.ts that fetches the RSVP list for an event using the Meetup GraphQL API eventRsvps query. Return member names, email if available, RSVP status (yes/waitlist), and RSVP date. Build a dashboard page at /organizer/events/[eventId]/rsvps showing a table of attendees with export to CSV functionality. Add summary stats: total RSVPs, waitlist count, and attendance rate from previous events.

Copy this prompt to try it in Bolt.new

Troubleshooting

Meetup GraphQL query returns errors about inline fragments or unknown fields

Cause: The Meetup GraphQL schema uses union types (SearchResult, Event, Group) and the query is accessing fields directly instead of using inline fragments for type-specific fields.

Solution: Add ... on Event (or ... on Group) inline fragments when accessing type-specific fields in search results. Fields like title, dateTime, venue, and going are Event-specific and must be accessed inside a ... on Event fragment in the keywordSearch results.

typescript
1// WRONG: accessing event fields directly
2query { keywordSearch(input: $input) { edges { node { result { title dateTime } } } } }
3
4// CORRECT: using inline fragment for Event type
5query { keywordSearch(input: $input) { edges { node { result { ... on Event { title dateTime going venue { name } } } } } } }

Meetup OAuth callback returns 'redirect_uri_mismatch' error

Cause: The redirect_uri in the authorization request does not exactly match the one registered in your Meetup OAuth consumer settings.

Solution: Log into meetup.com/api/oauth/list/, click your OAuth consumer, and verify the redirect URI matches MEETUP_REDIRECT_URI in your .env exactly — including https://, no trailing slash. The Bolt WebContainer preview URL cannot be registered as a redirect URI. Deploy to Netlify first and register the deployed URL.

Event search returns empty results despite valid credentials and location

Cause: The search radius is too small for the requested location, there are no upcoming events matching the keyword in that area, or the lat/lon coordinates are incorrect for the city name entered.

Solution: Increase the search radius to 50 miles for initial testing. Verify the lat/lon by checking a geocoding service — San Francisco is 37.7749/-122.4194, New York is 40.7128/-74.0059. Try a broader keyword like 'tech' or 'programming' instead of a specific language to confirm the API is returning results.

typescript
1// Test with known coordinates and broad keyword first
2const testParams = {
3 lat: 37.7749, // San Francisco
4 lon: -122.4194,
5 keyword: 'tech',
6 radius: 50, // miles
7};

Meetup API returns 429 Too Many Requests

Cause: The application is exceeding Meetup's rate limit of 200 requests per hour. Common when search results trigger multiple follow-up requests for event details.

Solution: Implement response caching using Next.js Route Handler cache settings or a Supabase table. Cache event search results for 15 minutes — Meetup event data does not change frequently enough to require real-time fetching. Reduce parallel API calls by batching data into fewer, larger queries using GraphQL's ability to request multiple resources in one query.

typescript
1// Add caching to Next.js route handler
2export const revalidate = 900; // Cache for 15 minutes (900 seconds)
3
4export async function GET(request: Request) {
5 // Route handler logic...
6}

Best practices

  • Cache Meetup API responses for 10-15 minutes — event data changes infrequently and caching significantly reduces API calls, keeping you within the 200 requests/hour rate limit
  • Deploy to Netlify or Bolt Cloud before implementing the user OAuth flow — the three-legged OAuth callback requires a publicly accessible redirect URI that the Bolt WebContainer cannot provide
  • Request only the Meetup OAuth scopes your application actually uses — the ageless and basic scopes cover most discovery use cases without requiring the rsvp or organizer scopes
  • Use inline fragments in GraphQL queries when accessing type-specific fields from union types — Meetup's keywordSearch returns SearchResult union types, not Events directly
  • Implement geolocation as the default location detection method with a manual city search as fallback — users appreciate automatic location detection and it reduces friction in the event discovery flow
  • Always link to event pages on meetup.com for registration and RSVP rather than trying to replicate Meetup's RSVP flow — users trust Meetup for event management and the official flow handles waitlists and payment correctly
  • Filter Meetup search results client-side for additional criteria (free vs paid events, online vs in-person) using the data already fetched rather than making additional API calls

Alternatives

Frequently asked questions

Does Meetup have a public REST API or only GraphQL?

Meetup has fully migrated to GraphQL. Their original REST API (api.meetup.com/v3/) is deprecated as of 2021 and will be removed. All new integrations should use the GraphQL API at api.meetup.com/gql. While this requires learning GraphQL query syntax, it provides more flexible data fetching — you request exactly the fields you need in a single query instead of multiple REST calls.

Do I need a Meetup Pro account to use the API?

Basic API access for reading public events and group data is available on free Meetup accounts. You need Meetup Pro ($29.99/month per group) to manage events programmatically — creating events, managing RSVPs, accessing attendee lists, and sending messages to members via the API. For event discovery dashboards that only read public data, a free account is sufficient.

Can I test Meetup OAuth in Bolt.new's development preview?

Partially. The OAuth initiation and public API calls work in the Bolt WebContainer preview since they only require outbound HTTP calls. The OAuth callback — where Meetup redirects back to your app after login — requires a publicly accessible URL that the WebContainer cannot provide. Deploy to Netlify or Bolt Cloud, register the deployed URL as your redirect URI in Meetup's OAuth consumer settings, and test the complete login flow on the deployed site.

How do I handle Meetup's rate limits in a busy application?

Meetup limits authenticated requests to 200 per hour. Implement response caching with a 15-minute TTL for event search results — Meetup events change infrequently enough that slightly stale data is acceptable for a discovery page. Use Next.js Route Handler revalidation (export const revalidate = 900) or a Supabase cache table to store results. For high-traffic pages, consider building a background job that pre-fetches popular location searches on a schedule rather than fetching on every page request.

How is Meetup's GraphQL API different from REST for Bolt.new developers?

With REST, each type of data has a separate URL (GET /events, GET /groups/:id). With GraphQL, all queries go to one endpoint (POST api.meetup.com/gql) with the query written as a string in the request body. The main Bolt.new impact is in your API route: instead of building multiple proxy routes for different endpoints, you build one proxy that passes GraphQL queries through. The query syntax uses named queries with typed input variables, and inline fragments for union types like search results.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.