> ## 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.

# Create User

> Create a fully schedulable platform user in a single API call

Create a new platform user with automatic availability and meeting type setup, making them immediately ready for bookings.

<Info>
  Creating platform users requires an active **API Platform subscription** and a **company admin** acting user. Personal Access Tokens cannot create users — authenticate with a Platform API Key.
</Info>

## Endpoint

```
POST /v4/user
```

## Request Headers

| Header          | Required | Description             |
| --------------- | -------- | ----------------------- |
| `Authorization` | Yes      | `Bearer <your-api-key>` |
| `Content-Type`  | Yes      | `application/json`      |

## Request Body

### Basic Fields

| Field        | Type   | Required | Description                                      |
| ------------ | ------ | -------- | ------------------------------------------------ |
| `email`      | string | Yes      | User's email address                             |
| `givenName`  | string | Yes      | User's first name                                |
| `familyName` | string | Yes      | User's last name                                 |
| `timezone`   | string | Yes      | IANA timezone identifier (e.g., `Europe/London`) |

### Optional: Custom Availability

| Field                   | Type   | Description                                                                                                    |
| ----------------------- | ------ | -------------------------------------------------------------------------------------------------------------- |
| `availability.name`     | string | Display name for the availability schedule                                                                     |
| `availability.timezone` | string | Timezone for the schedule                                                                                      |
| `availability.schedule` | object | Weekly schedule with a property per day ([format](/developer-docs/core-concepts/availability#schedule-format)) |

### Optional: Custom Meeting Type

| Field                  | Type   | Description                                                                                 |
| ---------------------- | ------ | ------------------------------------------------------------------------------------------- |
| `meetingType.name`     | string | Display name for the meeting type                                                           |
| `meetingType.duration` | number | Meeting duration in minutes                                                                 |
| `meetingType.slug`     | string | URL-friendly identifier for the booking page                                                |
| `meetingType.channel`  | string | Meeting venue type. Defaults to `phone`. See [channel values](#meeting-type-channel-values) |

## Examples

### 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();
  ```

  ```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()
  ```
</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": {
      "monday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "tuesday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "wednesday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "thursday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "friday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "saturday": { "enabled": false, "hours": [] },
      "sunday": { "enabled": false, "hours": [] }
    }
  },
  "meetingType": {
    "name": "45 Minute Discovery Call",
    "duration": 45,
    "slug": "john-smith-45min",
    "channel": "connect"
  }
}
```

### With Split Availability (Lunch Break)

```json theme={null}
{
  "email": "john.smith@example.com",
  "givenName": "John",
  "familyName": "Smith",
  "timezone": "Europe/London",
  "availability": {
    "name": "Business Hours with Lunch",
    "timezone": "Europe/London",
    "schedule": {
      "monday": { "enabled": true, "hours": [{ "start": "09:00", "end": "12:00" }, { "start": "13:00", "end": "17:00" }] },
      "tuesday": { "enabled": true, "hours": [{ "start": "09:00", "end": "12:00" }, { "start": "13:00", "end": "17:00" }] },
      "wednesday": { "enabled": false, "hours": [] },
      "thursday": { "enabled": false, "hours": [] },
      "friday": { "enabled": false, "hours": [] },
      "saturday": { "enabled": false, "hours": [] },
      "sunday": { "enabled": false, "hours": [] }
    }
  }
}
```

## Response

### Success (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"
}
```

| Field            | Description                                  |
| ---------------- | -------------------------------------------- |
| `userId`         | UUID of the created user                     |
| `availabilityId` | UUID of the created availability schedule    |
| `meetingTypeId`  | UUID of the created meeting type             |
| `bookingUrl`     | Public URL where customers can book meetings |
| `companyId`      | UUID of the company the user belongs to      |

<Check>
  **User Ready!** The user is immediately ready for bookings. The `bookingUrl` can be shared with customers right away.
</Check>

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

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

### Error Responses

#### 400 Bad Request - Validation Error

```json theme={null}
{
  "statusCode": 400,
  "message": "Validation failed",
  "errors": [
    {
      "field": "email",
      "message": "Invalid email format"
    }
  ]
}
```

#### 400 Bad Request - Invalid Timezone

```json theme={null}
{
  "statusCode": 400,
  "message": "Invalid timezone",
  "error": "Bad Request"
}
```

#### 403 Forbidden - No API Platform Subscription

```json theme={null}
{
  "statusCode": 403,
  "message": "Company does not have access to 'apiPlatform' feature.",
  "error": "Forbidden"
}
```

#### 409 Conflict - Email Already Exists

```json theme={null}
{
  "statusCode": 409,
  "message": "User with this email already exists",
  "error": "Conflict"
}
```

## Availability Schedule Format

The schedule is an object with a property for each day of the week. See the [full schedule format reference](/developer-docs/core-concepts/availability#schedule-format).

### Day Schedule Structure

Each day has two properties:

| Field     | Type    | Description                              |
| --------- | ------- | ---------------------------------------- |
| `enabled` | boolean | Whether the day is available for booking |
| `hours`   | array   | Time ranges when available               |

### Time Format

Times are in 24-hour format (`HH:MM`):

```json theme={null}
{
  "monday": {
    "enabled": true,
    "hours": [
      { "start": "09:00", "end": "12:00" },
      { "start": "13:00", "end": "17:00" }
    ]
  }
}
```

<Tip>
  Set `enabled: false` on days that should be unavailable (e.g., weekends). Days with `enabled: true` must include at least one time range in `hours`.
</Tip>

## Meeting Type Channel Values

The `channel` field controls where the meeting takes place:

| Value               | Description                            |
| ------------------- | -------------------------------------- |
| `phone`             | Outgoing phone call (default)          |
| `phone-incoming`    | Incoming phone call                    |
| `connect`           | meetergo Connect (browser-based video) |
| `google`            | Google Meet                            |
| `zoom`              | Zoom                                   |
| `teamsForBusiness2` | Microsoft Teams                        |
| `webex`             | Webex                                  |
| `whereby`           | Whereby                                |
| `kmeet`             | kMeet                                  |
| `jitsi`             | Jitsi                                  |
| `local`             | In-person at host's location           |
| `local-attendee`    | In-person at attendee's location       |
| `custom`            | Custom location                        |

## Common Timezones

| Region    | Timezone              |
| --------- | --------------------- |
| UK        | `Europe/London`       |
| Germany   | `Europe/Berlin`       |
| France    | `Europe/Paris`        |
| US East   | `America/New_York`    |
| US West   | `America/Los_Angeles` |
| Japan     | `Asia/Tokyo`          |
| Australia | `Australia/Sydney`    |

See the full list of [IANA timezone identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).
