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

How to Integrate Bolt.new with GoToMeeting

To integrate GoToMeeting with Bolt.new, create a GoTo developer app at developer.goto.com to get OAuth 2.0 credentials, then build Next.js API routes to create meetings, retrieve join URLs, and list recordings. The OAuth authorization callback requires a deployed URL — Bolt's WebContainer preview cannot handle OAuth redirects. Deploy to Netlify or Bolt Cloud first, then complete authorization and use the stored access token for all meeting management calls.

What you'll learn

  • How to create a GoTo developer app for GoToMeeting API access with OAuth 2.0
  • How to implement the OAuth authorization code flow and token refresh in Next.js API routes
  • How to create scheduled meetings and generate instant meeting join URLs programmatically
  • How to build a meeting scheduler feature that integrates GoToMeeting with your Bolt.new app
  • Why OAuth requires a deployed URL and how to structure development to work around this limitation
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate14 min read25 minutesCommunicationApril 2026RapidDev Engineering Team
TL;DR

To integrate GoToMeeting with Bolt.new, create a GoTo developer app at developer.goto.com to get OAuth 2.0 credentials, then build Next.js API routes to create meetings, retrieve join URLs, and list recordings. The OAuth authorization callback requires a deployed URL — Bolt's WebContainer preview cannot handle OAuth redirects. Deploy to Netlify or Bolt Cloud first, then complete authorization and use the stored access token for all meeting management calls.

Adding Video Meeting Scheduling to Bolt.new Apps with GoToMeeting

GoToMeeting provides a straightforward video conferencing API for scheduling meetings, generating join links, managing attendees, and accessing meeting recordings. For Bolt.new developers building internal tools, booking systems, or client communication platforms, GoToMeeting's API allows you to create and manage meetings programmatically without requiring users to touch GoToMeeting's interface directly.

GoToMeeting is part of the GoTo family of products, which means it shares the same developer platform (developer.goto.com) and OAuth 2.0 infrastructure as GoToWebinar and GoToTraining. If you're already integrating GoToWebinar, adding GoToMeeting support requires only adding new scopes to your existing developer app — you don't need separate OAuth credentials. The API is simpler than GoToWebinar's, with fewer endpoints and a more straightforward meeting object model, making it a good starting point if you're new to the GoTo developer platform.

The primary consideration for Bolt.new development is the OAuth flow. GoToMeeting requires users to authorize your application by clicking through GoToMeeting's consent screen, after which GoToMeeting redirects to your callback URL with an authorization code. Bolt's WebContainer cannot serve as an OAuth callback destination because it has no stable public URL. The standard approach: build your meeting routes and dashboard UI in Bolt, deploy to Netlify or Bolt Cloud, complete the OAuth authorization from the deployed site, and store the access and refresh tokens for ongoing use. Once authorized, all subsequent meeting API calls work regardless of whether you're in the Bolt preview or deployed — they're outbound HTTPS calls that the WebContainer handles normally.

Integration method

Bolt Chat + API Route

GoToMeeting integrates with Bolt.new through the GoTo REST API using OAuth 2.0 authorization. Create meetings, generate join URLs, and retrieve recordings via Next.js API routes that hold OAuth tokens server-side. GoToMeeting shares the same GoTo developer platform and OAuth infrastructure as GoToWebinar — the same developer app can be used for both services. The OAuth callback requires a deployed URL, and access tokens expire after 1 hour requiring automatic refresh.

Prerequisites

  • A GoToMeeting account (Professional or Business plan required for API access)
  • A GoTo developer app created at developer.goto.com with OAuth 2.0 Client ID and Client Secret
  • A deployed URL for OAuth callback — GoToMeeting OAuth cannot complete in the Bolt WebContainer preview
  • Basic understanding of OAuth 2.0 authorization code flow
  • A Bolt.new project using Next.js for server-side OAuth token handling

Step-by-step guide

1

Set Up GoTo Developer App

GoToMeeting API access goes through the unified GoTo developer platform. Navigate to developer.goto.com and sign in with your GoToMeeting account. Click 'Add App' to create a new developer application. Name it something identifiable like 'Meeting Scheduler' and select 'GoToMeeting' from the product dropdown. Under 'OAuth Settings', set the authorization type to 'Authorization Code' and enter your redirect URI — this must be the URL of your deployed callback route (e.g., https://your-app.netlify.app/api/gotomeeting/callback). GoToMeeting strictly enforces exact URI matching, so there must be no trailing slashes or URL differences between what you register and what your app sends. After saving, you receive a Client ID and Client Secret. The Client ID is public and appears in your authorization URL. The Client Secret is sensitive — it's used to exchange authorization codes for access tokens and must never appear in client-side code. For the OAuth scope, request 'meeting:create meeting:read' to cover both creating and reading meeting data. Note that GoToMeeting and GoToWebinar share the same OAuth system — if you already have a GoTo developer app for GoToWebinar, you can add GoToMeeting scopes to the same app rather than creating a new one.

.env
1# .env
2GOTOMEETING_CLIENT_ID=your_client_id_here
3GOTOMEETING_CLIENT_SECRET=your_client_secret_here
4GOTOMEETING_REDIRECT_URI=https://your-app.netlify.app/api/gotomeeting/callback

Pro tip: GoToMeeting and GoToWebinar share the same OAuth token endpoint and developer platform. If you need both integrations, use a single GoTo developer app with combined scopes to simplify credential management.

Expected result: Your GoTo developer app is created with a Client ID, Client Secret, and a registered redirect URI. Environment variables are configured in your Bolt project.

2

Implement OAuth Authorization and Token Management

Create the two routes that handle the OAuth flow: the authorization redirect and the callback handler. The authorization route builds a URL to GoToMeeting's OAuth endpoint with your client ID, redirect URI, response type (code), and scopes. When a user visits this route, they're redirected to GoToMeeting's consent screen where they approve access. After approval, GoToMeeting redirects to your callback route with an authorization code as a query parameter. The callback route exchanges this code for access and refresh tokens by making a POST request to GoToMeeting's token endpoint using Basic Auth (Client ID and Secret base64-encoded). The token response includes the access token (valid 1 hour), refresh token (valid until revoked or unused for 90 days), and the organizer key that identifies which GoToMeeting account authorized your app. Store all three values in your database. Build a utility function that retrieves the current access token and refreshes it automatically if it's expired or about to expire. This refresh logic runs invisibly before every GoToMeeting API call, ensuring your app never fails with a 401 error due to token expiry. Remember: this entire OAuth flow must happen from your deployed site, not from Bolt's WebContainer preview.

Bolt.new Prompt

Create OAuth routes for GoToMeeting. Build /api/gotomeeting/auth (GET) that redirects to GoToMeeting's OAuth page: https://authentication.logmeininc.com/oauth/authorize with client_id, redirect_uri, response_type=code, and scope='meeting:create meeting:read'. Build /api/gotomeeting/callback (GET) that receives the code parameter, exchanges it for tokens via POST to https://authentication.logmeininc.com/oauth/token using Basic auth with GOTOMEETING_CLIENT_ID and GOTOMEETING_CLIENT_SECRET, stores the access_token, refresh_token, expires_at, and organizer_key in the database, and redirects to /admin/meetings on success.

Paste this in Bolt.new chat

app/api/gotomeeting/callback/route.ts
1// app/api/gotomeeting/callback/route.ts
2import { NextResponse } from 'next/server';
3
4export async function GET(request: Request) {
5 const { searchParams } = new URL(request.url);
6 const code = searchParams.get('code');
7 const error = searchParams.get('error');
8
9 if (error || !code) {
10 return NextResponse.redirect(new URL('/admin/meetings?error=auth_failed', request.url));
11 }
12
13 const credentials = Buffer.from(
14 `${process.env.GOTOMEETING_CLIENT_ID}:${process.env.GOTOMEETING_CLIENT_SECRET}`
15 ).toString('base64');
16
17 try {
18 const tokenResponse = await fetch(
19 'https://authentication.logmeininc.com/oauth/token',
20 {
21 method: 'POST',
22 headers: {
23 Authorization: `Basic ${credentials}`,
24 'Content-Type': 'application/x-www-form-urlencoded',
25 },
26 body: new URLSearchParams({
27 grant_type: 'authorization_code',
28 code,
29 redirect_uri: process.env.GOTOMEETING_REDIRECT_URI!,
30 }),
31 }
32 );
33
34 const tokens = await tokenResponse.json();
35
36 // Store tokens in your database here:
37 console.log('Tokens received:', {
38 accessToken: tokens.access_token,
39 refreshToken: tokens.refresh_token,
40 organizerKey: tokens.organizer_key,
41 expiresAt: Date.now() + tokens.expires_in * 1000,
42 });
43
44 return NextResponse.redirect(new URL('/admin/meetings?auth=success', request.url));
45 } catch (err: unknown) {
46 const e = err as { message: string };
47 return NextResponse.redirect(
48 new URL(`/admin/meetings?error=${encodeURIComponent(e.message)}`, request.url)
49 );
50 }
51}

Pro tip: After storing tokens, redirect users to a confirmation page rather than displaying tokens in the URL or response body. Tokens in URLs can be logged by analytics tools and proxies.

Expected result: Visiting /api/gotomeeting/auth redirects to GoToMeeting's authorization page. After authorizing, the callback stores tokens in the database. The user is redirected to the admin meetings page with a success message.

3

Create Meetings via REST API

With valid OAuth tokens, you can create GoToMeeting sessions programmatically. GoToMeeting's API base URL for meeting operations is https://api.getgo.com/G2M/rest/v2/organizers/{organizerKey}/meetings. Creating a meeting requires a subject (meeting name), a start time and end time in ISO 8601 format, and a conferenceCallInfo object specifying how attendees can call in. GoToMeeting returns a meetingKey (unique meeting ID) and a joinURL that you display to the meeting host and share with attendees. For instant meetings (starting immediately), use the current time as the start time and set the end time 60 minutes later. For scheduled meetings, use whatever start and end times the user specifies. GoToMeeting supports both scheduled and instant meeting types. The API also supports recurring meetings through a recurrenceType field, though this requires additional parameters. Store the meetingKey in your database alongside the meeting details — you'll need it to fetch attendees, update the meeting, or retrieve recordings after the session ends. Unlike GoToWebinar, GoToMeeting doesn't have a registration system — join URLs are shared directly with attendees who can join without pre-registering.

Bolt.new Prompt

Create a Next.js API route at /api/gotomeeting/meetings that handles POST requests to create new meetings. Accept subject (string), startTime (ISO string), and endTime (ISO string) in the request body. Use the stored OAuth access token and organizer key to POST to GoToMeeting's meetings API. Return the meetingKey and joinURL from the response. Also create a GET handler that fetches upcoming meetings for the next 30 days. Store created meetings in the database with meetingKey, subject, startTime, endTime, and joinURL.

Paste this in Bolt.new chat

app/api/gotomeeting/meetings/route.ts
1// app/api/gotomeeting/meetings/route.ts
2import { NextResponse } from 'next/server';
3
4const GTM_BASE = 'https://api.getgo.com/G2M/rest/v2';
5
6export async function POST(request: Request) {
7 // In production, fetch these from your database:
8 const accessToken = process.env.GOTOMEETING_ACCESS_TOKEN;
9 const organizerKey = process.env.GOTOMEETING_ORGANIZER_KEY;
10
11 const { subject, startTime, endTime } = await request.json();
12
13 if (!subject || !startTime || !endTime) {
14 return NextResponse.json(
15 { error: 'subject, startTime, and endTime are required' },
16 { status: 400 }
17 );
18 }
19
20 try {
21 const response = await fetch(
22 `${GTM_BASE}/organizers/${organizerKey}/meetings`,
23 {
24 method: 'POST',
25 headers: {
26 Authorization: `Bearer ${accessToken}`,
27 'Content-Type': 'application/json',
28 Accept: 'application/json',
29 },
30 body: JSON.stringify({
31 subject,
32 starttime: startTime,
33 endtime: endTime,
34 conferenceCallInfo: 'Hybrid',
35 passwordRequired: false,
36 meetingType: 'scheduled',
37 }),
38 }
39 );
40
41 const data = await response.json();
42
43 if (!response.ok) {
44 return NextResponse.json({ error: data }, { status: response.status });
45 }
46
47 return NextResponse.json({
48 meetingKey: data[0]?.meetingKey || data.meetingKey,
49 joinURL: data[0]?.joinURL || data.joinURL,
50 subject,
51 startTime,
52 endTime,
53 });
54 } catch (error: unknown) {
55 const e = error as { message: string };
56 return NextResponse.json({ error: e.message }, { status: 500 });
57 }
58}

Pro tip: GoToMeeting's API returns the created meeting as an array with one element for scheduled meetings. Always check data[0] when parsing meeting creation responses.

Expected result: POST to /api/gotomeeting/meetings with a subject, start time, and end time creates a GoToMeeting session. The response includes a meetingKey and joinURL that can be shared with meeting participants.

4

Display Meetings and Recordings

The final step is building the user-facing UI that shows scheduled meetings and past recordings. GoToMeeting's GET meetings endpoint returns all meetings for an organizer within a date range, with each meeting containing its key, subject, times, and join URL. Past meetings automatically appear in the history endpoint after they end. For recordings, GoToMeeting stores recordings in the cloud (GoToMeeting Cloud Recording) for organizers with the feature enabled. You fetch recordings for a specific meeting by calling the recordings endpoint with the meeting's key. The recording response includes asset URLs for downloading the video, which are time-limited signed URLs. GoToMeeting recordings are stored for 1 year by default, after which they're deleted unless downloaded. A common pattern is to fetch recording URLs from GoToMeeting's API and either display them directly for immediate viewing or download and re-upload them to your own storage (like Supabase Storage or AWS S3) for long-term access. Build the meetings dashboard with two tabs: upcoming and past. Upcoming shows join links users can share; past shows recordings with a direct link to the GoToMeeting recording player or a download button. This gives users a complete meeting history without needing to log into GoToMeeting's interface.

Bolt.new Prompt

Build a meetings page at /meetings. Show upcoming meetings (next 30 days) as a list with title, date/time, duration, and a 'Copy Join Link' button. Show past meetings from the last 90 days in a table with title, date, actual duration (minutes), attendee count, and a 'Watch Recording' link if a recording exists. Fetch upcoming meetings from /api/gotomeeting/meetings?type=upcoming and past meetings from /api/gotomeeting/meetings?type=past. For each past meeting, check /api/gotomeeting/recordings?meetingKey=[key] to see if a recording is available.

Paste this in Bolt.new chat

Pro tip: GoToMeeting recording URLs are signed and time-limited. Fetch them fresh each time a user wants to watch rather than storing them permanently — they expire within a few hours of being generated.

Expected result: The /meetings page shows real GoToMeeting data. Upcoming meetings display join links. Past meetings show attendance counts. Meetings with recordings show a working link to the recording player.

Common use cases

One-Click Meeting Scheduler

Add a 'Schedule a Meeting' button to your Bolt app that creates a GoToMeeting session and returns a join URL. Users fill in the meeting title, duration, and start time; your app creates the meeting via the API and displays the join link they can share with participants.

Bolt.new Prompt

Create a meeting scheduler component that shows a form with: meeting title input, date/time picker for start time, and duration selector (30 min, 45 min, 60 min, 90 min). On submit, call /api/gotomeeting/meetings (POST) which creates the meeting via GoToMeeting API and returns the join URL. Show a success card with the meeting title, scheduled time, and a 'Copy Join Link' button. Store the meeting details in my database with the meeting ID and join URL.

Copy this prompt to try it in Bolt.new

Client Portal with Meeting History

Build a client portal where users can see their scheduled GoToMeeting sessions and access recordings of past meetings. The portal pulls meeting data from the GoToMeeting API filtered by organizer, giving clients a self-service view of their meeting history without needing a GoToMeeting account themselves.

Bolt.new Prompt

Build a meetings portal page at /portal/meetings showing two tabs: Upcoming and Past. In Upcoming, list scheduled meetings with title, date/time, and a join button. In Past, list completed meetings with date, duration, attendee count, and a 'Watch Recording' button if a recording is available. Fetch data from /api/gotomeeting/meetings which calls GoToMeeting's REST API with the organizer's OAuth token. Add a 'Schedule New Meeting' button that opens the meeting scheduler.

Copy this prompt to try it in Bolt.new

Automated Meeting Creation from Form Submissions

Automatically create a GoToMeeting session when a user submits a consultation request form. The form captures preferred time slots, GoToMeeting creates the meeting, and the system sends confirmation emails to both parties with the join link — all without manual intervention from your team.

Bolt.new Prompt

When a consultation request form is submitted with the customer's preferred date/time, automatically create a GoToMeeting session via /api/gotomeeting/schedule-consultation. The route should create a GoToMeeting meeting for the requested time (1 hour duration), save the meeting details and join URL to the database, and return the join URL to display in a confirmation message. Name the meeting 'Consultation with [Customer Name] - [Date]'.

Copy this prompt to try it in Bolt.new

Troubleshooting

OAuth redirect goes to GoToMeeting but never returns to the app callback

Cause: The redirect URI registered in your GoTo developer app doesn't exactly match the URL your app sends in the authorization request. GoToMeeting enforces exact string matching.

Solution: Compare your GOTOMEETING_REDIRECT_URI environment variable to the URI registered in developer.goto.com. They must be identical including protocol (https://), path, and no trailing slash. Remember that OAuth callbacks cannot work in Bolt's WebContainer preview — deploy to Netlify or Bolt Cloud and use your deployed URL as the redirect URI.

Meeting creation returns 401 or 403 after previous calls worked

Cause: GoToMeeting access tokens expire after 1 hour. Once expired, all API calls return 401 until the token is refreshed using the refresh token.

Solution: Implement a token refresh helper that runs before every GoToMeeting API call. Check the token's expiry timestamp — if it expires within the next 5 minutes, call GoToMeeting's token endpoint with grant_type=refresh_token and your stored refresh token. Update the access token and expiry in your database before making the intended API call.

typescript
1// Auto-refresh wrapper for GoToMeeting API calls:
2async function callGoToMeetingAPI(endpoint: string, options: RequestInit = {}) {
3 const token = await getValidToken(); // Your token refresh logic
4 return fetch(`https://api.getgo.com/G2M/rest/v2${endpoint}`, {
5 ...options,
6 headers: {
7 ...options.headers,
8 Authorization: `Bearer ${token}`,
9 Accept: 'application/json',
10 },
11 });
12}

Meetings are created but no recordings appear in the recordings endpoint

Cause: GoToMeeting Cloud Recording must be enabled on the organizer's account plan and switched on for the specific meeting. Not all GoToMeeting plans include cloud recording.

Solution: Verify your GoToMeeting plan includes Cloud Recording (Professional plan required). Check that recording was enabled for the meeting in GoToMeeting's settings. Recordings take 15-30 minutes after a meeting ends to become available in the API — poll the recordings endpoint with a delay rather than checking immediately after the meeting ends.

Best practices

  • Store GOTOMEETING_CLIENT_SECRET and OAuth tokens as server-side environment variables — they control access to all meeting creation and organizer data
  • Implement automatic token refresh that runs before every GoToMeeting API call — access tokens expire in 1 hour and must be refreshed without requiring user re-authorization
  • Complete the OAuth authorization flow from your deployed site, not from Bolt's WebContainer preview, since GoToMeeting requires a stable public callback URL
  • Store the organizerKey returned with OAuth tokens in your database — it's required in every GoToMeeting API endpoint URL
  • For meeting schedulers, validate that start time is in the future and end time is after start time before calling the GoToMeeting API to avoid unnecessary API errors
  • Fetch recording URLs fresh each time rather than storing them permanently — they are signed time-limited URLs that expire
  • Use GoToMeeting's meetingKey as the stable identifier in your database — it never changes for the lifetime of the meeting
  • Consider using a single GoTo developer app for both GoToMeeting and GoToWebinar integrations since they share the same OAuth infrastructure

Alternatives

Frequently asked questions

Can I test GoToMeeting API calls in Bolt's WebContainer preview?

Partially. Once you have a valid access token (obtained by completing OAuth from a deployed site), you can test all GoToMeeting REST API calls in the Bolt preview — meeting creation, listing, and recording fetching are outbound HTTPS calls that work in WebContainers. The OAuth authorization flow itself requires a deployed URL for the callback, so complete that step after deploying to Netlify or Bolt Cloud.

What's the difference between GoToMeeting and GoToWebinar?

GoToMeeting is designed for smaller interactive meetings (up to 250 participants) with features like screen sharing, whiteboarding, and two-way video. GoToWebinar is built for large one-to-many presentations (up to 3,000 attendees) with registration management, moderated Q&A, polls, and attendee analytics. Both share the same GoTo developer platform and OAuth system. Use GoToMeeting for client calls and team meetings; use GoToWebinar for marketing webinars and training events.

How do I create an instant meeting (starting right now)?

Set the starttime to the current time in ISO 8601 format and endtime to the current time plus your desired duration. For example: starttime: new Date().toISOString(), endtime: new Date(Date.now() + 60 * 60 * 1000).toISOString() for a 60-minute instant meeting. GoToMeeting will create the meeting and return a joinURL that's valid immediately.

Is there a rate limit for GoToMeeting API calls?

Yes. GoToMeeting applies rate limits to prevent abuse, though the exact limit is not publicly documented in the same way as GoToWebinar's stated 100 requests per minute. In practice, for dashboard applications fetching meeting lists and recordings, you'll rarely approach rate limits. If you're creating many meetings programmatically (bulk scheduling), add a short delay between requests and implement retry logic with exponential backoff for 429 responses.

Can I add co-organizers or co-hosts to a meeting via the API?

Yes. After creating a meeting, you can add co-organizers using the meeting attendees endpoint. However, co-organizers must have GoToMeeting accounts to be added in this role. For most scheduling use cases, the host-only model (the organizer runs the meeting) is sufficient without co-host management via the API.

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.