Skip to main content
Solutions to frequently encountered problems when integrating with the meetergo API.

Authentication Issues

401 Unauthorized

Symptoms: API returns 401 Unauthorized Causes & Solutions:
API keys must follow the format: ak_live:<uuid>:<secret>
# Correct
Authorization: Bearer ak_live:01234567-89ab-cdef-0123-456789abcdef:secretpart

# Wrong - missing Bearer
Authorization: ak_live:01234567-89ab-cdef-0123-456789abcdef:secretpart

# Wrong - using "API-Key" instead of "Bearer"
Authorization: API-Key ak_live:...
API keys have mandatory expiration dates (1-90 days). Check when your key was created and generate a new one if expired.
# Test your key
curl -X GET "https://api.meetergo.com/v4/user/me" \
  -H "Authorization: Bearer YOUR_API_KEY"
Keys can be deactivated in the dashboard. Check my.meetergo.com/admin/api-keys to verify your key is active.

400 Missing x-meetergo-api-user-id Header

Symptoms: API returns 400 Bad Request with message about missing header Solution: Most endpoints require the x-meetergo-api-user-id header:
const response = await fetch('https://api.meetergo.com/v4/meeting-type', {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'x-meetergo-api-user-id': 'user-uuid-here'  // Required!
  }
});
How to get the user ID:
# Get your own user ID
curl -X GET "https://api.meetergo.com/v4/user/me" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Response includes your user ID
# { "id": "user-uuid-here", ... }

Availability Issues

No Available Slots Returned

Symptoms: GET /v4/booking-availability returns empty availableSlots
Ensure start and end dates are in the future:
const today = new Date();
const nextWeek = new Date(today.getTime() + 7 * 24 * 60 * 60 * 1000);

const params = new URLSearchParams({
  meetingTypeId: meetingTypeId,
  start: today.toISOString().split('T')[0],  // Today
  end: nextWeek.toISOString().split('T')[0]  // 7 days from now
});
The user may not have availability set up. Check their availability:
curl -X GET "https://api.meetergo.com/availability?userId=USER_ID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: USER_ID"
The host’s calendar may be full. Try a longer date range or use troubleshoot: true:
curl -X GET "https://api.meetergo.com/v4/booking-availability?\
meetingTypeId=MT_ID&start=2024-01-15&end=2024-01-22&troubleshoot=true" \
  -H "Authorization: Bearer YOUR_API_KEY"
This returns blocked timeslots with reasons.
The meeting type may have a minimum notice period. If it’s set to 24 hours, slots within the next 24 hours won’t appear.
Buffer times before/after meetings reduce available slots. A 30-minute meeting with 15-minute buffers needs 60 minutes of free time.

Slots Show Wrong Times

Symptoms: Available slots don’t match expected availability
All API times are in UTC by default. Specify timezone if needed:
const params = new URLSearchParams({
  meetingTypeId: meetingTypeId,
  start: '2024-01-15',
  end: '2024-01-22',
  timezone: 'Europe/Berlin'  // Get slots in local timezone
});
External calendar events may take a few minutes to sync. If a slot was just blocked, it might still appear available briefly.

Booking Issues

400 Bad Request on Booking

Symptoms: POST /v4/booking returns 400
The slot may have been booked by someone else. Always fetch fresh availability before booking:
// 1. Get availability
const slots = await getAvailability(meetingTypeId);

// 2. Book immediately (don't cache slots for long)
const booking = await createBooking(slots[0].start);
Check attendee fields:
// Correct
attendee: {
  email: '[email protected]',       // Required (unless allowPhoneOnlyBooking)
  fullname: 'John Doe',           // Required
  phone: '+1234567890'            // E.164 format recommended
}

// Wrong - missing required fields
attendee: {
  email: '[email protected]'
  // Missing fullname
}
If booking without email, enable allowPhoneOnlyBooking on the meeting type:
curl -X PATCH "https://api.meetergo.com/v4/meeting-type/MT_ID" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: USER_ID" \
  -H "Content-Type: application/json" \
  -d '{"allowPhoneOnlyBooking": true}'
Use ISO 8601 format:
// Correct
start: '2024-01-15T14:00:00Z'
start: '2024-01-15T14:00:00+01:00'

// Wrong
start: '2024-01-15 14:00:00'
start: '01/15/2024 2:00 PM'

Webhook Issues

Webhooks Not Received

Your webhook endpoint must be publicly accessible. Test with:
curl -X POST "https://your-server.com/webhooks/meetergo" \
  -H "Content-Type: application/json" \
  -d '{"test": true}'
Webhook endpoints must use HTTPS in production.
Respond with 200 OK immediately, then process async:
app.post('/webhooks/meetergo', async (req, res) => {
  // Respond immediately
  res.status(200).send('OK');

  // Process in background
  processWebhook(req.body).catch(console.error);
});
Verify your webhook is subscribed to the right events:
curl -X GET "https://api.meetergo.com/webhooks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: USER_ID"

Duplicate Webhooks

Symptoms: Same event received multiple times Solution: Implement idempotency:
const processedEvents = new Set();

app.post('/webhooks/meetergo', async (req, res) => {
  res.status(200).send('OK');

  const eventId = `${req.body.event}-${req.body.data.id}-${req.body.timestamp}`;

  if (processedEvents.has(eventId)) {
    console.log('Duplicate event, skipping');
    return;
  }

  processedEvents.add(eventId);

  // Process event...

  // Clean up old events periodically
  setTimeout(() => processedEvents.delete(eventId), 3600000);
});

Rate Limiting

429 Too Many Requests

Symptoms: API returns 429 status code Solution: Implement exponential backoff:
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = response.headers.get('Retry-After') || Math.pow(2, i);
      console.log(`Rate limited, waiting ${retryAfter}s`);
      await new Promise(r => setTimeout(r, retryAfter * 1000));
      continue;
    }

    return response;
  }

  throw new Error('Max retries exceeded');
}
Rate limits:
  • 100 requests/minute per API key
  • Burst allowance up to 200 requests

Common Error Codes

CodeMeaningSolution
400Bad RequestCheck request body and parameters
401UnauthorizedVerify API key
403ForbiddenCheck permissions for the resource
404Not FoundVerify ID exists
409ConflictResource already exists or slot taken
422UnprocessableValidation failed, check field values
429Rate LimitedImplement backoff, reduce request rate
500Server ErrorRetry later, contact support if persistent

Getting Help

If you’re still stuck:
  1. Check the request/response - Log full request and response bodies
  2. Use troubleshoot mode - Add ?troubleshoot=true to availability calls
  3. Test in Swagger UI - api.meetergo.com/spec/v2
  4. Contact support - [email protected]
When contacting support, include:
  • Request URL and method
  • Request headers (redact API key)
  • Request body
  • Response status and body
  • Timestamp of the request