Integrate meetergo with voice AI platforms like Vapi, Retell, or custom voice bots to enable phone-based appointment booking.
Overview
A voice AI bot can use meetergo’s API to:
Check available time slots in real-time
Book appointments without requiring an email address
Provide instant confirmation to callers
Prerequisites
Setup
1. Get Your Meeting Type ID
Go to your meetergo dashboard
Navigate to Meeting Types
Click on the meeting type you want to use for voice bookings
Copy the ID from the URL: https://my.meetergo.com/meeting-types/{meetingTypeId}/edit
2. Enable Phone-Only Bookings
By default, bookings require an attendee email. For voice bots, enable phone-only bookings:
curl -X PATCH "https://api.meetergo.com/v4/meeting-type/{meetingTypeId}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "x-meetergo-api-user-id: YOUR_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"allowPhoneOnlyBooking": true
}'
With allowPhoneOnlyBooking enabled, you can create bookings using just the caller’s phone number—no email required.
3. Get Your User ID
Retrieve your user ID for API requests:
curl -X GET "https://api.meetergo.com/v4/user/me" \
-H "Authorization: Bearer YOUR_API_KEY"
API Endpoints for Voice Bots
Your voice AI needs two main API calls as LLM tools:
1. Get Available Time Slots
Fetch available booking windows for the meeting type:
curl -X GET "https://api.meetergo.com/v4/booking-availability?meetingTypeId={meetingTypeId}&startDate=2024-01-15&endDate=2024-01-22" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "x-meetergo-api-user-id: YOUR_USER_ID"
Response:
{
"availableSlots" : [
{
"start" : "2024-01-15T14:00:00Z" ,
"end" : "2024-01-15T14:30:00Z"
},
{
"start" : "2024-01-16T10:00:00Z" ,
"end" : "2024-01-16T10:30:00Z"
}
]
}
2. Book an Appointment
Create a booking with the caller’s information:
curl -X POST "https://api.meetergo.com/v4/booking" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "x-meetergo-api-user-id: YOUR_USER_ID" \
-H "Content-Type: application/json" \
-d '{
"meetingTypeId": "{meetingTypeId}",
"start": "2024-01-16T10:00:00Z",
"attendee": {
"fullname": "John Doe",
"phone": "+4915123456789"
}
}'
When allowPhoneOnlyBooking is enabled, you can omit the email field and only provide the phone number.
Response:
{
"id" : "booking-uuid" ,
"start" : "2024-01-16T10:00:00Z" ,
"end" : "2024-01-16T10:30:00Z" ,
"status" : "confirmed" ,
"meetingLink" : "https://meet.meetergo.com/abc123"
}
Configure these tools in your voice AI platform:
{
"name" : "check_availability" ,
"description" : "Check available appointment times for the next 7 days" ,
"parameters" : {
"type" : "object" ,
"properties" : {
"startDate" : {
"type" : "string" ,
"description" : "Start date in YYYY-MM-DD format"
},
"endDate" : {
"type" : "string" ,
"description" : "End date in YYYY-MM-DD format"
}
},
"required" : [ "startDate" , "endDate" ]
}
}
{
"name" : "book_appointment" ,
"description" : "Book an appointment at a specific time" ,
"parameters" : {
"type" : "object" ,
"properties" : {
"startTime" : {
"type" : "string" ,
"description" : "Appointment start time in ISO 8601 format"
},
"callerName" : {
"type" : "string" ,
"description" : "Full name of the caller"
},
"callerPhone" : {
"type" : "string" ,
"description" : "Phone number of the caller"
}
},
"required" : [ "startTime" , "callerName" , "callerPhone" ]
}
}
Example Implementation
Here’s a Node.js implementation for handling voice bot requests:
const express = require ( 'express' );
const app = express ();
app . use ( express . json ());
const MEETERGO_API_KEY = process . env . MEETERGO_API_KEY ;
const MEETERGO_USER_ID = process . env . MEETERGO_USER_ID ;
const MEETING_TYPE_ID = process . env . MEETING_TYPE_ID ;
const headers = {
'Authorization' : `Bearer ${ MEETERGO_API_KEY } ` ,
'x-meetergo-api-user-id' : MEETERGO_USER_ID ,
'Content-Type' : 'application/json'
};
// Tool: Check availability
app . post ( '/tools/check-availability' , async ( req , res ) => {
const { startDate , endDate } = req . body ;
const response = await fetch (
`https://api.meetergo.com/v4/booking-availability?` + new URLSearchParams ({
meetingTypeId: MEETING_TYPE_ID ,
startDate ,
endDate
}),
{ headers }
);
const data = await response . json ();
// Format slots for voice output
const formattedSlots = data . availableSlots . map ( slot => {
const date = new Date ( slot . start );
return {
iso: slot . start ,
readable: date . toLocaleString ( 'en-US' , {
weekday: 'long' ,
month: 'long' ,
day: 'numeric' ,
hour: 'numeric' ,
minute: '2-digit'
})
};
});
res . json ({ availableSlots: formattedSlots });
});
// Tool: Book appointment
app . post ( '/tools/book-appointment' , async ( req , res ) => {
const { startTime , callerName , callerPhone } = req . body ;
const response = await fetch ( 'https://api.meetergo.com/v4/booking' , {
method: 'POST' ,
headers ,
body: JSON . stringify ({
meetingTypeId: MEETING_TYPE_ID ,
start: startTime ,
attendee: {
fullname: callerName ,
phone: callerPhone
}
})
});
if ( ! response . ok ) {
const error = await response . json ();
return res . status ( 400 ). json ({
success: false ,
message: 'Failed to book appointment' ,
error
});
}
const booking = await response . json ();
res . json ({
success: true ,
message: `Appointment confirmed for ${ new Date ( booking . start ). toLocaleString () } ` ,
bookingId: booking . id ,
meetingLink: booking . meetingLink
});
});
app . listen ( 3000 );
Vapi
Add these as custom tools in your Vapi assistant:
// vapi-tools.js
export const tools = [
{
type: "function" ,
function: {
name: "checkAvailability" ,
description: "Check available appointment slots" ,
parameters: {
type: "object" ,
properties: {
startDate: { type: "string" },
endDate: { type: "string" }
}
}
},
server: {
url: "https://your-server.com/tools/check-availability"
}
},
{
type: "function" ,
function: {
name: "bookAppointment" ,
description: "Book an appointment" ,
parameters: {
type: "object" ,
properties: {
startTime: { type: "string" },
callerName: { type: "string" },
callerPhone: { type: "string" }
}
}
},
server: {
url: "https://your-server.com/tools/book-appointment"
}
}
];
Retell AI
Configure the tools in your Retell dashboard or via API:
const retellTools = [
{
name: "check_availability" ,
description: "Get available appointment times" ,
url: "https://your-server.com/tools/check-availability" ,
speak_during_execution: true ,
speak_after_execution: false
},
{
name: "book_appointment" ,
description: "Book an appointment for the caller" ,
url: "https://your-server.com/tools/book-appointment" ,
speak_during_execution: true ,
speak_after_execution: true
}
];
Best Practices
Enable phone-only booking - Callers shouldn’t need to provide an email
Format times for speech - Convert ISO dates to natural language (“Tuesday at 2pm”)
Limit date range - Query 7-14 days ahead to keep responses manageable
Handle timezone - Use the caller’s timezone or ask for preference
Confirm before booking - Always repeat the selected time before confirming
Validate phone numbers - Ensure phone numbers are in E.164 format (+1234567890)
Sample Voice Script
Here’s a sample conversation flow for your voice AI:
AI: "Hi! I can help you schedule an appointment. What day works best for you?"
Caller: "Do you have anything on Tuesday?"
AI: [calls check_availability]
AI: "I have openings on Tuesday at 10am, 2pm, and 4pm. Which works for you?"
Caller: "2pm sounds good"
AI: "Great! I have Tuesday at 2pm. Can I get your name?"
Caller: "John Smith"
AI: "Thanks John. I'll book that for you now."
AI: [calls book_appointment]
AI: "You're all set! Your appointment is confirmed for Tuesday at 2pm. You'll receive a confirmation shortly. Is there anything else I can help with?"
Troubleshooting
400 Bad Request on booking
Verify allowPhoneOnlyBooking is enabled on your meeting type
Check the phone number format (use E.164: +1234567890)
Ensure the selected time slot is still available
No available slots returned
Verify the meeting type ID is correct
Check that the date range is in the future
Ensure the host has availability configured
Verify your API key is correct and not expired
Ensure the x-meetergo-api-user-id header matches your user ID
Next Steps