> ## Documentation Index
> Fetch the complete documentation index at: https://developer.meetergo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> Create a schedulable user in just two API calls

This guide shows you how to create a fully functional platform user and verify they're ready for bookings—in just two API calls.

<Info>
  This quickstart is for the **API Platform plan** (Platform API Key). If you want to automate your own workspace with a Personal Access Token instead, start with [Using a Personal Access Token](/developer-docs/personal-access-tokens).
</Info>

## Prerequisites

* An Enterprise plan with API access enabled
* Admin access to your meetergo account

## Step 1: Create an API Key

<Steps>
  <Step title="Open API Keys">
    Go to [my.meetergo.com/admin/api-keys](https://my.meetergo.com/admin/api-keys).
  </Step>

  <Step title="Create key">
    Click **Create API Key**, optionally enter a name, and set the expiration (1-90 days).
  </Step>

  <Step title="Copy and save">
    Copy the key immediately and store it securely. It looks like:

    ```
    ak_live:01234567-89ab-cdef-1234-567890abcdef:secretpart123
    ```
  </Step>
</Steps>

<Warning>
  The key is only shown once. Store it in a password manager or environment variable. Keys have a mandatory expiration date and must be rotated to prevent service interruptions.
</Warning>

## Step 2: Verify Your API Key

Use this call to validate your API Key and retrieve your authenticated user information:

```bash theme={null}
curl -X GET "https://api.meetergo.com/v4/user/me" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

A successful response (200 OK) returns your full user object.

## Step 3: Create a Platform User

This single endpoint creates a complete platform user with default availability and meeting type, making them immediately ready for bookings.

### Basic Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.meetergo.com/v4/user" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "email": "john.smith@example.com",
      "givenName": "John",
      "familyName": "Smith",
      "timezone": "Europe/London"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.meetergo.com/v4/user', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      email: 'john.smith@example.com',
      givenName: 'John',
      familyName: 'Smith',
      timezone: 'Europe/London'
    })
  });

  const user = await response.json();
  console.log('User created:', user);
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.meetergo.com/v4/user',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'Content-Type': 'application/json'
      },
      json={
          'email': 'john.smith@example.com',
          'givenName': 'John',
          'familyName': 'Smith',
          'timezone': 'Europe/London'
      }
  )

  user = response.json()
  print(f"User created: {user}")
  ```
</CodeGroup>

### With Custom Availability & Meeting Type

```json theme={null}
{
  "email": "john.smith@example.com",
  "givenName": "John",
  "familyName": "Smith",
  "timezone": "Europe/London",
  "availability": {
    "name": "John's Business Hours",
    "timezone": "Europe/London",
    "schedule": [
      {
        "dayOfWeek": "monday",
        "intervals": [{ "from": "09:00", "to": "17:00" }]
      },
      {
        "dayOfWeek": "tuesday",
        "intervals": [{ "from": "09:00", "to": "17:00" }]
      },
      {
        "dayOfWeek": "wednesday",
        "intervals": [{ "from": "09:00", "to": "17:00" }]
      },
      {
        "dayOfWeek": "thursday",
        "intervals": [{ "from": "09:00", "to": "17:00" }]
      },
      {
        "dayOfWeek": "friday",
        "intervals": [{ "from": "09:00", "to": "17:00" }]
      }
    ]
  },
  "meetingType": {
    "name": "45 Minute Discovery Call",
    "duration": 45,
    "slug": "john-smith-45min"
  }
}
```

### Response (201 Created)

```json theme={null}
{
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "availabilityId": "660e8400-e29b-41d4-a716-446655440001",
  "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002",
  "bookingUrl": "https://cal.meetergo.com/john-smith/45min-discovery-call",
  "companyId": "880e8400-e29b-41d4-a716-446655440003"
}
```

<Check>
  **User Ready!** The user is now fully configured and ready for bookings. The `bookingUrl` can be shared immediately with customers.
</Check>

<Info>
  **What was created automatically:**

  * Platform user with the provided details
  * Default availability schedule (Mon-Fri 9-17 if not specified)
  * Default meeting type (30min Meeting if not specified)
  * Public booking URL for immediate use
</Info>

## Step 4: Verify Configuration

Query for available time slots to confirm the user is configured correctly and ready for bookings. Use the `meetingTypeId` from the Step 3 response.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.meetergo.com/v4/booking-availability?meetingTypeId=770e8400-e29b-41d4-a716-446655440002&start=2024-01-15&end=2024-01-20&timezone=Europe/London" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  const meetingTypeId = '770e8400-e29b-41d4-a716-446655440002';

  const response = await fetch(
    `https://api.meetergo.com/v4/booking-availability?` + new URLSearchParams({
      meetingTypeId,
      start: '2024-01-15',
      end: '2024-01-20',
      timezone: 'Europe/London'
    }),
    {
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY'
      }
    }
  );

  const availability = await response.json();
  console.log('Available slots:', availability);
  ```

  ```python Python theme={null}
  import requests

  meeting_type_id = '770e8400-e29b-41d4-a716-446655440002'

  response = requests.get(
      'https://api.meetergo.com/v4/booking-availability',
      params={
          'meetingTypeId': meeting_type_id,
          'start': '2024-01-15',
          'end': '2024-01-20',
          'timezone': 'Europe/London'
      },
      headers={
          'Authorization': 'Bearer YOUR_API_KEY'
      }
  )

  availability = response.json()
  print(f"Available slots: {availability}")
  ```
</CodeGroup>

### Response (200 OK)

Available time slots grouped by date:

```json theme={null}
{
  "slots": [
    {
      "date": "2024-01-15",
      "times": [
        "2024-01-15T09:00:00Z",
        "2024-01-15T09:45:00Z",
        "2024-01-15T10:30:00Z",
        "2024-01-15T11:15:00Z"
      ]
    }
  ],
  "timezone": "Europe/London"
}
```

<Check>
  The user is now configured and available for booking!
</Check>

## What's Next

<CardGroup cols={2}>
  <Card title="Authentication" icon="key" href="/developer-docs/authentication">
    Learn about API key management and security
  </Card>

  <Card title="Users" icon="user" href="/developer-docs/core-concepts/users">
    Full user documentation
  </Card>

  <Card title="Availability" icon="calendar" href="/developer-docs/core-concepts/availability">
    Customize availability schedules
  </Card>

  <Card title="Meeting Types" icon="calendar-plus" href="/developer-docs/core-concepts/meeting-types">
    Create and manage meeting types
  </Card>
</CardGroup>

## Common Issues

<AccordionGroup>
  <Accordion title="401 Unauthorized">
    * Check your API key is correct and complete
    * Ensure the key hasn't expired
    * Verify the key is active (not deactivated)
  </Accordion>

  <Accordion title="400 Missing x-meetergo-api-user-id header">
    Most endpoints require this header. Use the `userId` returned from user creation or get your own user ID from `/v4/user/me`.
  </Accordion>

  <Accordion title="No available slots returned">
    * Check the date range is in the future
    * Verify the user has availability configured
    * Ensure the user's calendar isn't fully booked
  </Accordion>

  <Accordion title="Invalid timezone">
    Timezones must be valid IANA timezone identifiers (e.g., `Europe/London`, `America/New_York`, `Asia/Tokyo`).
  </Accordion>
</AccordionGroup>
