There are two distinct paths to create Google Meet links via API — most tutorials conflate them. Path 1: Meet REST API spaces.create creates an ad-hoc meeting room with NO calendar event and NO invitations. Path 2: Calendar API events.insert with conferenceDataVersion=1 creates a calendar event WITH a Meet link and sends invitations. Service accounts cannot use Meet API directly — you MUST use Domain-Wide Delegation to impersonate a real user. The spaces.create endpoint has a strict reduced write quota of 100 per minute per project and only 10 per minute per user.
| Fact | Value |
|---|---|
| Platform | Google Meet |
| Rate limits | Meet spaces.create: 100/min per project, 10/min per user (Reduced write)… |
| Difficulty | Intermediate |
| Time required | 45–90 minutes |
| Last updated | May 2026 |
API Quick Reference
Meet spaces.create: 100/min per project, 10/min per user (Reduced write). Calendar events.insert: standard but unpublished limits.
REST only
Google Meet REST API v2 + Calendar API — Meeting Automation
Google Meet automation has two completely different API paths depending on whether you need calendar invitations. The Meet REST API (meet.googleapis.com/v2) creates standalone meeting spaces — you get a meet.google.com link, but no calendar event is created and no invitations are sent. The Calendar API (calendar API v3 events.insert with conferenceDataVersion=1) creates a calendar event that includes a Meet conference link, and Google Calendar automatically sends invitations to all attendees. For automated booking systems, onboarding flows, and sales call scheduling, use the Calendar path. For ad-hoc meeting creation in chat apps or dashboards, use the Meet REST API path.
https://meet.googleapis.com/v2 (Meet API) / https://www.googleapis.com/calendar/v3 (Calendar API)Authentication
Key endpoints
Create an ad-hoc meeting space with a meet.google.com link. No calendar event, no invitations sent. The meeting link is permanent until the space is reconfigured. Quota class: Reduced write (100/min per project, 10/min per user).
Get details about a meeting space. The name parameter accepts either spaces/{spaceId} or spaces/{meetingCode}. Use to verify a space exists or get the current meeting URI.
Create a calendar event WITH a Meet link and send invitations to attendees. The conferenceDataVersion=1 query parameter is REQUIRED — without it, the API silently ignores the conferenceData field and creates an event without a Meet link.
List past conference records for spaces your app created. Records are deleted 30 days after the conference ends. Useful for building meeting history or audit logs.
Subscribe to Meet events (conference started/ended, participant joined/left, recording generated) delivered via Cloud Pub/Sub. Requires enabling workspaceevents.googleapis.com and pubsub.googleapis.com.
Step-by-step automation
Step 1: Set Up Authentication
Configure OAuth 2.0 for user-facing apps, or Service Account + DWD for Workspace automation. Meet API does NOT work with service accounts acting as themselves — DWD impersonation is required.
1# OAuth flow: get user to authorize your app2# Then exchange code for tokens3curl -X POST https://oauth2.googleapis.com/token \4 -H 'Content-Type: application/x-www-form-urlencoded' \5 -d 'code=AUTH_CODE&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&redirect_uri=REDIRECT_URI&grant_type=authorization_code'67# Refresh expired token8curl -X POST https://oauth2.googleapis.com/token \9 -H 'Content-Type: application/x-www-form-urlencoded' \10 -d 'grant_type=refresh_token&refresh_token=REFRESH_TOKEN&client_id=CLIENT_ID&client_secret=CLIENT_SECRET'Step 2: Create an Ad-hoc Meeting Space (No Invitations)
Use Meet REST API spaces.create for instant meeting links. No calendar event is created — suitable for chat apps, dashboards, or support tools where you just need a link.
1# Create a basic meeting space (empty body = default settings)2curl -X POST \3 -H 'Authorization: Bearer ACCESS_TOKEN' \4 -H 'Content-Type: application/json' \5 'https://meet.googleapis.com/v2/spaces' \6 -d '{}'78# Create a restricted meeting (only invited users can enter)9curl -X POST \10 -H 'Authorization: Bearer ACCESS_TOKEN' \11 -H 'Content-Type: application/json' \12 'https://meet.googleapis.com/v2/spaces' \13 -d '{14 "config": {15 "accessType": "RESTRICTED",16 "entryPointAccess": "ALL"17 }18 }'Step 3: Create a Calendar Event with Meet Link and Invitations
Use the Calendar API path to create a meeting with invitations. conferenceDataVersion=1 MUST be a URL query parameter — not in the body. Forgetting this silently creates an event without a Meet link.
1# Create calendar event with Meet link (conferenceDataVersion=1 is REQUIRED as query param)2curl -X POST \3 -H 'Authorization: Bearer ACCESS_TOKEN' \4 -H 'Content-Type: application/json' \5 'https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=1&sendUpdates=all' \6 -d '{7 "summary": "Product Demo Call",8 "description": "Let us show you what we built.",9 "start": {10 "dateTime": "2025-11-15T14:00:00-05:00",11 "timeZone": "America/New_York"12 },13 "end": {14 "dateTime": "2025-11-15T15:00:00-05:00",15 "timeZone": "America/New_York"16 },17 "attendees": [18 {"email": "alice@example.com"},19 {"email": "bob@example.com", "optional": true}20 ],21 "conferenceData": {22 "createRequest": {23 "requestId": "unique-uuid-here",24 "conferenceSolutionKey": {"type": "hangoutsMeet"}25 }26 }27 }'Step 4: Subscribe to Meeting Events via Workspace Events API
Get real-time notifications when a meeting starts, ends, or a participant joins using the Workspace Events API with Cloud Pub/Sub delivery. Required: enable workspaceevents.googleapis.com and pubsub.googleapis.com in your project.
1# First: grant Publisher role to meet-api-event-push@system.gserviceaccount.com2# gcloud pubsub topics add-iam-policy-binding your-topic \3# --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' \4# --role='roles/pubsub.publisher'56# Create subscription for conference events7curl -X POST \8 -H 'Authorization: Bearer ACCESS_TOKEN' \9 -H 'Content-Type: application/json' \10 'https://workspaceevents.googleapis.com/v1/subscriptions' \11 -d '{12 "targetResource": "//meet.googleapis.com/spaces/YOUR_SPACE_ID",13 "eventTypes": [14 "google.workspace.meet.conference.v2.started",15 "google.workspace.meet.conference.v2.ended",16 "google.workspace.meet.participant.v2.joined"17 ],18 "notificationEndpoint": {19 "pubsubTopic": "projects/YOUR_PROJECT/topics/YOUR_TOPIC"20 },21 "ttl": "0s"22 }'Step 5: Retrieve Conference Records After Meeting Ends
After a meeting ends, retrieve conference records including participant info, recording locations, and transcripts. Records are automatically deleted 30 days after the meeting ends.
1# List recent conference records for a specific space2curl -H 'Authorization: Bearer ACCESS_TOKEN' \3 'https://meet.googleapis.com/v2/conferenceRecords?pageSize=10&filter=space.name%3D%22spaces%2Fabc123%22'45# Get participants for a specific conference record6curl -H 'Authorization: Bearer ACCESS_TOKEN' \7 'https://meet.googleapis.com/v2/conferenceRecords/rec123/participants'Complete working code
Automated booking system: when a new booking event comes in (simulated as a function call), creates a Calendar event with Meet link, sends invitations, and returns the join URL. Includes handling for the conferenceData propagation delay.
Error handling
You included conferenceData in the event body but forgot to add conferenceDataVersion=1 as a URL query parameter. The API does not accept conference data unless this query parameter is explicitly set.
You're using a Service Account to call the Meet REST API without Domain-Wide Delegation. Meet API requires acting as a real user — a service account acting as itself returns a permission error.
spaces.create has a strict Reduced write quota: 100 per minute per project and only 10 per minute per user. If your app creates many meetings quickly (e.g., bulk onboarding), you'll hit this limit fast.
Meet link creation is asynchronous. The events.insert response may have conferenceData.createRequest.status.statusCode = 'pending' instead of 'success', especially under load.
Meeting codes can expire (approximately 365 days after last use). Also, a spaces.get call using a meeting code will fail if the code has been recycled.
Rate limits & throttling
Security checklist
- Never expose OAuth access tokens or service account keys in client-side code or browser requests — Meet API calls must be made server-side
- For Workspace automation with DWD, restrict the Service Account to only the required scopes in the Admin Console — do not grant full calendar or drive access
- Validate booking inputs (times, attendee emails) before creating events to prevent creating meetings with invalid data or malicious inputs
- Store only space names (spaces/{id}) in your database, not meeting codes — meeting codes can expire and be recycled, potentially exposing your database to wrong meeting links
- Use RESTRICTED or TRUSTED access type for confidential meetings — the default OPEN access type allows anyone with the link to join
- Implement authentication on your booking endpoints — anyone who can trigger a meeting creation can consume your quota and spam meeting invitations
- Log all meeting creation events with timestamps, attendees, and space names for audit purposes
- Re-subscribe to Workspace Events subscriptions before they expire — set up a scheduled job to check expireTime and renew subscriptions proactively
Automation use cases
No-code alternatives
Don't want to write code? These platforms can automate the same workflows visually.
Zapier
Google Meet integration in Zapier supports 'Create a Meeting Space' action. Pair with Calendly, Typeform, or CRM triggers to automate meeting creation. Also supports Google Calendar 'Create Detailed Event' with conferenceDataVersion for meeting links.
Make (Integromat)
Google Calendar module with Meet integration supports creating events with conference data. More flexible than Zapier for multi-step booking flows. Can update CRM records with the Meet link after creation.
n8n
Google Calendar node with conference data support, plus HTTP Request nodes for direct Meet REST API calls if needed. Best option for complex booking automations with conditional logic.
Best practices
- Choose the right path: use Calendar API events.insert with conferenceDataVersion=1 when you need calendar invitations (bookings, scheduled calls), use Meet REST API spaces.create for ad-hoc links in chat tools or dashboards
- Always pass conferenceDataVersion=1 as a URL query parameter on events.insert and events.update — omitting it on an update call will REMOVE the existing Meet link from the event
- Use UUID v4 for the conferenceData.createRequest.requestId — this provides idempotency so retrying the same request returns the same conference rather than creating a duplicate
- Store the space name (spaces/abc123) not the meeting code — meeting codes expire after ~365 days of inactivity and may be recycled
- Check conferenceData.createRequest.status.statusCode in the events.insert response — if it is 'pending', wait and re-fetch the event rather than assuming the link is ready
- For Service Account automation, always use Domain-Wide Delegation with a real Workspace user identity — Meet API explicitly rejects service accounts acting as themselves
- Always use IANA timezone names (America/New_York, Europe/London) not abbreviations (EST, GMT) in calendar events — abbreviations cause 400 errors
- Subscribe to Workspace Events API with ttl='0s' for maximum duration, and set up automated renewal when you receive the expirationReminder event (12 hours before expiry)
Ask AI to help
Copy one of these prompts to get a personalized, working implementation.
I'm building a booking system that creates Google Meet invitations using the Calendar API v3. I need to: (1) create calendar events with conferenceDataVersion=1 as a URL query parameter (not in body), (2) use IANA timezone names in dateTime fields, (3) generate UUID4 requestId for idempotency, (4) check for 'pending' conference status and re-fetch if needed, (5) handle the Reduced write quota for spaces.create (10/min per user). Use Python with google-api-python-client. Service Account + Domain-Wide Delegation for impersonating Workspace users.
Build a meeting booking UI where customers can schedule a Google Meet call. The form should have: name, email, select date/time, meeting duration. When submitted, the backend should call Calendar API events.insert with conferenceDataVersion=1 to create an event with a Meet link, send email invitations to both customer and host, and display the Meet link on the confirmation page. Store meeting records in Supabase. Handle the 'pending' conference status with a retry.
Frequently asked questions
What is the difference between Meet REST API spaces.create and Calendar API with conferenceData?
spaces.create (Meet REST API) creates a standalone meeting room — you get a meet.google.com link but NO calendar event and NO invitations are sent to attendees. Calendar events.insert with conferenceDataVersion=1 creates a calendar event that includes a Meet conference link AND sends email invitations to all attendees. Use the Calendar path for scheduled meetings with invites; use spaces.create for ad-hoc links in dashboards or chat tools.
Why isn't my Meet link being created even though I included conferenceData in the request body?
You're missing the conferenceDataVersion=1 URL query parameter. This parameter must be passed in the URL, not in the request body. Without it, the Calendar API silently ignores your conferenceData field and creates an event without a Meet link. In Python SDK: pass conferenceDataVersion=1 as a named parameter to events().insert(). In curl: add ?conferenceDataVersion=1 to the URL.
Can I use a Service Account to create Google Meet spaces without requiring user login?
Not directly. Service accounts acting as themselves return permission errors for the Meet API. You must use Domain-Wide Delegation: create a Service Account, enable DWD in the Workspace Admin Console, and use with_subject() (Python) or clientOptions.subject (Node.js) to impersonate a real Workspace user. The service account then acts as that user for all Meet API calls.
How long does a Google Meet space/link last?
Meeting spaces created via spaces.create have permanent meet.google.com links — they don't expire. However, the meeting code (the abc-mnop-xyz part of the URL) can expire approximately 365 days after the last meeting was held in that space. Always store and reference the space name (spaces/{spaceId}) in your system, not the meeting code. Calendar-based Meet links are tied to the calendar event and remain valid as long as the event exists.
How do I know when a meeting has ended to trigger follow-up actions?
Subscribe to the google.workspace.meet.conference.v2.ended event type via the Workspace Events API with Cloud Pub/Sub delivery. First create a Pub/Sub topic, grant Publisher role to meet-api-event-push@system.gserviceaccount.com, then create a subscription targeting your meeting space. You'll receive a notification via Pub/Sub when the conference ends. The notification includes the conferenceRecord name which you can use to fetch participant data and recording locations.
Can RapidDev help integrate Google Meet into my booking or CRM workflow?
Yes. If you need automated meeting scheduling — creating Meet links when customers book, sending customized invitations, and triggering CRM updates when meetings end — RapidDev can build that complete workflow. We handle the OAuth setup, conferenceDataVersion quirks, and Workspace Events integration so your team never has to manually schedule another call.
Why do I get a 404 error when looking up a meeting by its code?
Meeting codes can expire after approximately 365 days of inactivity and may be reassigned. If you stored a meeting code and the space hasn't been used in over a year, the code may no longer resolve to your space. Always store and use the canonical spaces/{spaceId} name from the spaces.create response, not the meetingCode. The spaceId is permanent and does not expire.
Need this automated?
Our team has built 600+ apps with API automations. We can build this for you.
Book a free consultation